問題
実験用にデータをcsvファイル出力するROSノードを作ったのに、単体(rosrun)ではファイルが作られるのにroslaunchでは作られない。
#これは作られる rosrun imu imu_node #これだと作られない roslaunch imu imu.launch
<?xml version="1.0"?> <launch> <node pkg="imu" type="imu_node" name="imu_node" /> </launch>
ちなみにROSのバージョンはKineticだが、全バージョン共通だと思う。たぶん。
原因と解決法
原因はlaunchファイルのオプションにあった。デフォルトではノードの実行場所は$ROS_HOMEになっていて、これはデフォルトで「~/.ros」になっている。ここを見てみるとちゃんと作られているようだ。
aaa@bbb:~$ ls .ros/ imu.csv rospack_cache_10391301543023691066 log rospack_cache_11134725904490598093 roscore-11311.pid rospack_cache_15154294043039909020 rosdep rospack_cache_16685232255138339616 rospack_cache_04149954776256916034
隠しフォルダになっていると面倒なので、保存場所を変えたいと思って調べてみた。解決方法は3つ。
解決法①
launchファイルにオプションを追加して保存場所を変える。
<?xml version="1.0"?> <launch> <node pkg="imu" type="imu_node" name="imu_node" cwd="node"/> </launch>
nodeタグの中にオプション「cwd=”node”」を追加すると保存場所がプログラムの場所になる。つまり「~/catkin_ws/devel/lib/imu」になる。余計にわかりづらい。
解決法②
環境変数「ROS_HOME」を変える。デフォルトでは「~/.ros」になっているのを次のようにすると変えることができる。
export ROS_HOME=/home/aaa
そのまま同じターミナルでlaunchファイルを実行すると指定したフォルダにcsvファイルが作られる。しかし問題点が2つあり、ひとつはターミナルを起動する度に毎回上のコマンドを打たなければならないこと(.bashrcに上記を追記すれば大丈夫だけど…)。もうひとつは指定したパスにログファイルも作られてしまうことだ。ホームディレクトリとかにするとlogフォルダが出来ているとなんとなく嫌な感じがする。
解決法③
調べたところ、上2つの方法しか見当たらなかった…。やっぱり一番良いのはノードのソースファイル自体で保存場所をフルパスで指定すること。今までは
std::ofstream fout("imu.csv");
のように書いていたところを
std::ofstream fout("/home/aaa/imu.csv");
にすることで事無きを得た。
launchファイルって意外と融通きかないみたいで悲しい。