現象
次のようなノードを書いたときにros::Time::now().toSec()の値が0になってしまって困りました。
int main(){
ros::init(“test”);
…
ros::Time t_start = ros::Time::now();
ROS_INFO(“%lf”, t_start.toSec());
…
return 0;
}
ちなみにこの現象はrosparam set use_sim_time trueをしている時だけで、しかもプログラムの後半で使ったときは普通にコンピュータ時間が出てきました。うーん、謎。
解決
原因はよくわからなかったけど、解決策としてはROS_INFOの前に
ros::Duration delay(1.0);
delay.sleep();
のように待ち時間を設けるか、
while( t_start.toSec() <= 0 ) t_start = ros::Time::now();
のように値が得られるまで待つかすることでちゃんと値が出てきました。
おそらくsim_timeを使う(=bagファイルの時間を使う)ときはクロックが遅くなる?のかな。ノードが起動してあまりにも早くros::Time::now()を呼びすぎると失敗するみたいです。