ROS向节点传递参数的几种方式

本文转载自:https://www.cnblogs.com/klcf0220/p/11050917.html

ROS的节点有很多中调用方式,包括rosrun,launch,直接运行等,向节点内传递参数的方式也有很多。

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就可以将节点内的参数改为想要的值了。

注意: 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_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[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>

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这几行代码是使用ros::NodeHandle的param()函数从ROS参数服务器中获取参数的值。具体解释如下: - nh.param("scan_topic", scan_topic_, scan_topic)表示获取ROS参数服务器中名为"scan_topic"的参数值,并存储到scan_topic_变量中。如果获取失败,则使用scan_topic变量的默认值。 - nh.param("frame_id", frame_id_, frame_id)表示获取ROS参数服务器中名为"frame_id"的参数值,并存储到frame_id_变量中。如果获取失败,则使用frame_id变量的默认值。 - nh.param("serial_port", serial_port_, port)表示获取ROS参数服务器中名为"serial_port"的参数值,并存储到serial_port_变量中。如果获取失败,则使用port变量的默认值。 - nh.param("baud_rate", baud_rate_, 460800)表示获取ROS参数服务器中名为"baud_rate"的参数值,并存储到baud_rate_变量中。如果获取失败,则使用默认值460800。 - nh.param("angle_resolution", resolution_, 1.0)表示获取ROS参数服务器中名为"angle_resolution"的参数值,并存储到resolution_变量中。如果获取失败,则使用默认值1.0。 - nh.param("robot_radius", robot_radius_, 0.2)表示获取ROS参数服务器中名为"robot_radius"的参数值,并存储到robot_radius_变量中。如果获取失败,则使用默认值0.2。 - nh.param("center_x", center_x_, 0.0)表示获取ROS参数服务器中名为"center_x"的参数值,并存储到center_x_变量中。如果获取失败,则使用默认值0.0。 - nh.param("center_y", center_y_, 0.0)表示获取ROS参数服务器中名为"center_y"的参数值,并存储到center_y_变量中。如果获取失败,则使用默认值0.0。 - nh.param("rpm", rpm_, 600)表示获取ROS参数服务器中名为"rpm"的参数值,并存储到rpm_变量中。如果获取失败,则使用默认值600。 - nh.param("special_range", special_range_, 0.0)表示获取ROS参数服务器中名为"special_range"的参数值,并存储到special_range_变量中。如果获取失败,则使用默认值0.0。 - nh.param("angle_compensate", flag_angle_compensate, true)表示获取ROS参数服务器中名为"angle_compensate"的参数值,并存储到flag_angle_compensate变量中。如果获取失败,则使用默认值true。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值