4.2ROS运行管理/重名处理
工作空间覆盖
指不同工作空间中,存在重名的功能包的情形,当调用功能包时,是如何选择功能包的?
选择工作空间demo01,demo02;然后在主目录下打开.bashrc文件,配置环境变量:source /home/.../demo01_ws/devel/setup.bash
, source /home/.../demo02_ws/devel/setup.bash
将此两行代码添加到末尾处
source .bahrc 刷新环境变量 rosrun turtlesim +... tab
补齐时,发现补齐的时demo02中的节点。ROS解析.bashrc文件,并生成ROS_PACKAGE_PATH ROS
包路径,该变量 中按照.bashrc中配置设置工作空间优先级,在设置时需要遵循一定的原则:ROS_PACKAGE_PATH
中的值,因此后刷新的环境变量会优于之前的环境变量
存在隐患-自定义工作空间会覆盖默认工作空间的优先级,从而导致一些指令执行异常,故别随意修改*bashrc文件
节点名称重名
一般情况在ROS如果启动重名节点,之前存在的节点会被直接关闭,现可以适当操作以解决该问题
主要有以下两种策略:命名空间—添加前缀;名称重映射—起别名;有以下三种方式实现:rosrun命令,launch文件,编码实现
rosrun设置命名空间,节点名称重映射
rosrun <package> <node> __ns=<prefix>
即可在前添加前缀,可用rosnode list 查看验证;即可实现节点的重复启动
rosrun <package> <node> __name:=<alias>
即可将node的名称改为
重映射:不适用于python
launch文件实现设置命名空间,节点名称重映射
rename01_node/launch/start_turtle.launch
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim" />
<node pkg="turtlesim" type="turtlesim_node" name="t1" /> # 改名字
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim" ns="prefix" /> # 添加命名空间
</launch>
rosnode list
查看有 /turtlesim,
/t1
, /prefix/turtlesim
话题名称重名
在实际应用中,按照逻辑,有时候可能需要将相同的话题名称设置为不同,也有时候需要将话题名称设置为相同。也是可以使用名称重映射或为名称添加前缀,根据前缀的不同,有全局、相对、和私有三种类型之分;
- 全局:参数名称直接参考ROS系统,与节点命名空间平级
- 相对:参数名称参考节点的命名空间,与节点名称平级
- 私有:参数名称参考节点的名称,是节点名称的子级
案例:ROS系统提供 键盘控制功能包:ros-noetic-teleop-twist-keyboaed
,可以控制turtleGUI中turtle
的运动,但前者使用的话题名称是/cmd_vel
,而后者使用的是/turtle1/cmd_vel
;因此需要改变节点名称。
rosrun设置命名空间,话题名称映射
rosrun turtlesim turtlesim_node
启动turtle的GUIrosrun teleop_twist_keyboard teleop_twist_keyboaed.py /cmd_vel:=/turtle1/cmd_vel
启动ROS键盘控制功能包
launch文件实现设置命名空间,节点名称重映射
rename02_topic/launch/start.launch
方法一 将turtle的GUI话题有turtle1/cmd_vel 改为 cmd_vel
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim">
<remap from="/turtle1/cmd_vel" to="/cmd_vel" />
</node>
<node pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py" name="key" />
</launch>
编码设置命名空间-python
rename02_topic/scripts/topic_name_p.py
#! /usr/bin/env python
import rospy
from std_msgs.msg import String
if __name__=='__main__':
rospy.init_node('hello')
pub=rospy.Publisher('/chatter', String, queue_size=10)
# 全局设置时必须在<topic>前加 /
pub=rospy.Publisher('chatter', String, queue_size=10)
# 相对设置时不能加 /
pub=rospy.Publisher('~chatter', String, queue_size=10)
# 私有设置时在<topic>前加 ~
参数名称重名
关于参数重名的处理,没有重映射实现,为了尽量避免参数重名,都是使用参数名添加前缀的方式,实现类似于话题名称,有全局、相对、私有之分
- 全局:参数名称直接参考ROS系统,与节点命名空间平级
- 相对:参数名称参考节点的命名空间,与节点名称平级
- 私有:参数名称参考节点的名称,是节点名称的子级
rosrun设置命名空间,话题名称重映射
rosrun <package> <node> _<parameter>:=<value>
然后可以用rosparam list 查看参数验证
launch文件实现设置命名空间,节点名称重映射
rename03_param/launch/test_param.launch
<launch>
<param name="<param_name1>" value="<value>" /> #设置参数1-全局
<node pkg="<turtlesim>" type="<node>" name="<name>" ns="xx" >
<param name="<param_name2>" value="<value>" /> #设置参数2-私有
</node>
</launch>
编码设置命名空间-python
rename03_param/scripts/param_name_p.py
#! /usr/bin/env python
import rospy
from std_msgs.msg import String
if __name__=='__main__':
rospy.init_node('hello')
rospy.set_param('/chatter', 10)
# 全局设置时必须在<topic>前加 /
rospy.set_param('chatter', 10)
# 相对设置时不能加 /
rospy.set_param('~chatter', 10)
# 私有设置时在<topic>前加 ~