ROS的节点有不少中调用方式,包括rosrun,launch,直接运行等,向节点内传递参数的方式也有不少。node
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就能够将节点内的参数改成想要的值了。spa
注意: string不须要加双引号,string第一个字符不能是数字指针
2. roslaunch + 参数服务器传递
一样是上面的例子,咱们若是想经过roslaunch来调用的话,能够像下面这样,将参数放在node之间。server
<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)string
main函数有两个参数argc, argv。argc = length(argv),argv[0]是程序的名字,argv[1]到argv[argc - 1]是传递给程序的参数,按空格分割参数后以char指针的形式存储。这是C、C++的特性,跟ros无关,你编写的C++程序也能够这么用。你编写的ros程序甚至能够直接运行,并经过这种方式传递参数,而不用rosrun或者roslaunch。it
好比咱们经常使用的map_server、rosbag就是用的这种参数传递方式。io
rosrun map_server map_saver -f ~/Documents/test或者直接找到二进制文件后map_saver -f ~/Documents/testtest
像上面这样运行程序,那么
argc=3
argv[0]="map_server"
argv[1]="-f"
argv[2]="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>