ROS向節點傳遞參數的方法總結(rosrun,launch) + (參數服務器,main函數參數)

0. 寫在最前面

ROS的節點有很多中調用方式,包括rosrun,launch,直接運行等,向節點內傳遞參數的方式也有很多,在此做個總結。

左側專欄還在更新其他ROS實用技巧哦,覺得寫得有見解,還不錯,關注一波?

1. rosrun + 參數服務器傳遞

ros::init(argc, argv, "imu2txt");
ros::NodeHandle nh("~");
std::string file_name;
nh.param<std::string>("file_name", file_name, "./imu_data.txt");

首先在節點初始化之後獲取參數服務器的參數,並設置初始值,如上面的程序就是在參數服務器的空間(即節點本身)獲取名字爲"file_name"的參數放到std::string file_name中,默認參數爲後面那個。

接着就可以rosrun了。下面是命令
rosrun package node _parameter:=value

在我們這裏就是rosrun datatxt imu2txt _file_name:="~/Documents/test.txt"就可以將節點內的參數改爲想要的值了。

2. roslaunch + 參數服務器傳遞

同樣是上面的例子,我們如果想通過roslaunch來調用的話,可以像下面這樣,將參數放在node之間。

<launch>
    <node name="imu2txt" pkg="data2txt" type="imu2txt" respawn="false" output="screen" >
        <param name="file_name"         type="string" value="/home/night_fury/Documents/record_bags/calibration/imudata_to_wall.txt"/>  
    </node>
</launch>

3. rosrun + main參數傳遞

int main(int argc, char** argv)

main函數有兩個參數argc, argv。argc = length(argv),argv[0]是程序的名字,argv[1]到argv[argc - 1]是傳遞給程序的參數,按空格分割參數後以char指針的形式存儲。這是C、C++的特性,跟ros無關,你編寫的C++程序也可以這麼用。你編寫的ros程序甚至可以直接運行,並通過這種方式傳遞參數,而不用rosrun或者roslaunch。

比如我們常用的map_server、rosbag就是用的這種參數傳遞方式。

rosrun map_server map_saver -f ~/Documents/test或者直接找到二進制文件後map_saver -f ~/Documents/test

像上面這樣運行程序,那麼

argc=3  
argv[0]="map_server"  
argv[1]="-f"  
argv[0]="test"  

你就可以在程序中使用這些參數了。

4. roslaunch + main參數傳遞

續上,如果使用main參數傳遞,那在roslaunch應該怎麼樣呢?如下,使用args

<launch>
    <node name="map_server" pkg="map_server" type="map_server" args="$(find costmap_2d)/test/willow-full-0.025.pgm 0.025" />
    <node name="rosplay" pkg="rosbag" type="play"
        args="-s 5 -r 1 --clock --hz=10 $(find costmap_2d)/test/simple_driving_test_indexed.bag" />
</launch>

參考

http://wiki.ros.org/rosbash#rosrun


喜歡我的文章的話Star一下唄Star

版權聲明:本文爲白夜行的狼原創文章,未經允許不得以任何形式轉載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章