实验目的:
- 启动时添加参数到参数服务器
- 运行时添加参数到参数服务器
FILE:set_param_c.cpp
方法一:用命令行的方式在运行时可以直接设置
$ rosrun demo start_param_node _length:=5
格式:下划线_变量名:=变量值
方法二:使用argc和argv的方式添加参数 (详见代码)
实验目的:
- 让节点复用
FILE:multi_node_c.cpp
在ROS中,同名的节点不能同时启动,后启动的会将前面的节点关闭后再运行,如果想要节点复用的话,在代码中这样写:
ros::init(argc, argv, "multi_node", ros::init_options::AnonymousName);
参数 ros::init_options::AnonymousName 会给这个节点后面加一个随机数。
先后启动两个节点
$ rosrun demo multi_node
$ rosrun demo multi_node
使用命令查看当前有哪些节点正在运行
$ rosnode list
/multi_node_1650179047404718375
/multi_node_1650179080983917793
可以发现,运行的两个节点都被赋予了一串随机数后缀。
实验结果:
- ros::init_options::AnonymousName 通过增加节点名后缀来实现复用
FILE:pub_latch_c.cpp, sub_latch_c.cpp
实验目的:
- 验证发布方停止发布后订阅方一(最早启动)、订阅方二(中途启动)、订阅方三(最晚启动)能否收到发布方最后一条信息。
- 当发布方shutdown的时候,上述三个订阅方能否收到信息。
- 确定话题的生命周期。
实验结果:
- 发布者发布完直接退出,最晚启动的节点没有收到任何信息;
- 发布者发布完 rate.sleep(), 最完启动的节点可以收到最后一条信息;
- 话题的声明周期是从第一个注册/关注的节点开始,到最后一个节点被kill掉结束,即便发布者参数latch=true,如果所有订阅的节点都关闭了,又来一个新的订阅者,那么这个订阅者也无法获得之前的话题内容。但要注意的是,此时这个订阅者会重新拉起一个话题,只不过这个话题里面没有东西。
FILE:pub_spin_c.cpp
处理回调,当回调函数条件被触发的时候会自发调用。
spinonce():回调一次,处理完后就执行spinonce后面的代码 spin():循环回调,一直循环处理回调函数,spin后面的代码不会被调用
实验目的:
- 验证spinonce,spin后面的代码会不会被调用;
- 检查spinonce、spin前面的代码会不会被调用;
实验结果:
上文有回调(循环体外) | 上文无回调(循环体外) | 上文有回调(循环体内) | 上文无回调(循环体内) | |
---|---|---|---|---|
spin | 循环执行回调函数 | 挂起 | 跳出循环体执行回调 | 挂起 |
spinOnce | 执行一次回调函数 | 继续执行 | 跳出循环体执行一次再回来 | 继续循环 |
后面还会出现多线程阻塞和多线程非阻塞方式的回旋,可以在ROSExperiment文件夹下找到相应的代码。