ROS向节点传递参数的⼏种⽅式
ROS的节点有很多中调⽤⽅式,包括rosrun,launch,直接运⾏等,向节点内传递参数的⽅式也有很多。
1. rosrun + 参数服务器传递
param nameros::init(argc, argv, "imu2txt");
ros::NodeHandle nh("~");
std::string file_name;
nh.param<std::string>("file_name", file_name, "./");
⾸先在节点初始化之后获取参数服务器的参数,并设置初始值,如上⾯的程序就是在参数服务器的~空间(即节点本⾝)获取名字
为"file_name"的参数放到std::string file_name中,默认参数为后⾯那个。
接着就可以rosrun了。下⾯是命令
rosrun package node _parameter:=value
在我们这⾥就是rosrun datatxt imu2txt _file_name:=~/就可以将节点内的参数改为想要的值了。
注意: string不需要加双引号,string第⼀个字符不能是数字
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_"/>
</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[2]="test"
你就可以在程序中使⽤这些参数了。
4. roslaunch + main参数传递
续上,如果使⽤main参数传递,那在roslaunch应该怎么样呢?如下,使⽤args:
<launch>
<node name="map_server" pkg="map_server" type="map_server" args=" (findcostmap2d)/test/willow−full−0.025.pgm0.025"/>
<nodename="rosplay"pkg="rosbag"type="play"args="−s5−r1−−clock−−hz=10(find costmap_2d)/test/simple_driving_test_indexed.bag" />
</launch>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论