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设置命名空间,话题名称映射

  1. rosrun turtlesim turtlesim_node 启动turtle的GUI
  2. rosrun 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>前加 ~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值