ROS学习笔记11——ROS中的重名问题

news2024/11/16 13:29:48

一、ros功能包重名——ros工作空间覆盖

功能包重名时,会按照 ROS_PACKAGE_PATH 查找,在前的会优先执行。ROS 会解析 .bashrc 文件,并生成 ROS_PACKAGE_PATH ROS包路径,即调用功能包的顺序,该变量中按照 .bashrc 中配置设置工作空间优先级,且ROS_PACKAGE_PATH 中的值,和 .bashrc 的配置顺序相反(后配置的优先级更高)

当然,功能包出现重名时,会出现安全隐患。比如,工作空间A、B下有重名功能包PKG,而B在配置文件中的优先级更高,则在刷新环境变量时,B会将A覆盖。此时即使use_PKG的实现依赖于A中的PKG,但是按照ROS工作空间覆盖的原则,实际执行时将会调用工作空间B的PKG,从而导致执行异常,出现安全隐患。

二、ros节点重名

C++初始化节点时通过API:ros::init(argc,argv,"xxxx");来定义节点名称。在ROS的网络拓扑中,是不可以出现重名的节点的,因为假设可以重名存在,那么调用时会产生混淆,这也就意味着,不可以启动重名节点或者同一个节点启动多次,的确,在ROS中如果启动重名节点的话,之前已经存在的节点会被直接关闭。

但是如果需要同时多次开启两个同名的节点,在ROS中给出的解决策略是使用命名空间名称重映射。命名空间就是为名称添加前缀,名称重映射是为名称起别名。

2.1 rosrun设置命名空间与重映射

2.1.1 rosrun设置命名空间
语法:rosrun 包名 节点名 __ns:=新名称

以启动两个小乌龟节点为例:

rosrun turtlesim turtlesim_node __ns:=/first

rosrun turtlesim turtlesim_node __ns:=/second

这样两个同名的节点就可以同时运行了。可以通过rosnode list查看节点信息:

/first/turtlesim
/second/turtlesim

 很明显,两个同名节点是以在不同命名空间下运行的形式(加前缀)实现同时启动的。

2.1.2 rosrun名称重映射
语法: rosrun 包名 节点名 __name:=新名称

 以启动两个小乌龟节点为例:

rosrun turtlesim  turtlesim_node __name:=dog |  rosrun turtlesim   turtlesim_node /turtlesim:=dog

rosrun turtlesim  turtlesim_node __name:=cat |  rosrun turtlesim   turtlesim_node /turtlesim:=cat

通过rosnode list查看节点信息:

/dog
/cat

 可以看到出现的节点名是重命名后的名称(起别名)。

2.1.3 rosrun命名空间与名称重映射叠加

当然设置命名空间和重命名可以一起使用:

rosrun turtlesim turtlesim_node __ns:=/first __name:=dog

rosrun turtlesim turtlesim_node __ns:=/second __name:=cat

 通过rosnode list查看节点信息:

/first/dog
/second/cat

 2.2 launch文件设置命名空间与重映射

在之前关于launch文件的笔记中,node标签中有两个属性:name和ns,二者分别是用于实现名称重映射与命名空间设置的。在 node 标签中,name 属性是必须的,ns 可选。

以小乌龟节点为例:

<launch>

    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim" />

    <!-- 命名空间 -->
    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim" ns="first"/>

    <!-- 名称重映射 -->
    <node pkg="turtlesim" type="turtlesim_node" name="dog" />

    <!-- 命名空间+名称重映射 -->
    <node pkg="turtlesim" type="turtlesim_node" name="cat" ns="second"/>

</launch>

此时同时开启四个小乌龟界面,rosnode list查看节点信息:

/dog
/first/turtlesim
/second/cat
/turtlesim

2.3 编码设置命名空间与重映射

2.3.1 修改命名空间
  std::map<std::string, std::string> map;
  map["__ns"] = "first";
  ros::init(map,"turtlesim");

 会在turtlesim节点名前面添加first的命名空间。

2.3.2 重映射
ros::init(argc,argv,"turtlesim",ros::init_options::AnonymousName);

 会在名称后面根据时间戳,添加一个后缀编号。

三、ros话题重名

有些时候可能需要将相同的话题名称设置为不同,也有可能将不同的话题名设置为相同。在ROS中给出的解决策略与节点名称重命类似,也是使用名称重映射或为名称添加前缀。根据前缀不同,有全局、相对、和私有三种类型之分。

  • 全局(参数名称直接参考ROS系统,与节点命名空间平级)
  • 相对(参数名称参考的是节点的命名空间,与节点名称平级)
  • 私有(参数名称参考节点名称,是节点名称的子级)

案例:在ROS中提供了一个比较好用的键盘控制功能包: ros-noetic-teleop-twist-keyboard,该功能包,可以控制机器人的运动,作用类似于乌龟的键盘控制节点。启动小乌龟节点后,前者任然不能控制乌龟运动,因为,二者使用的话题名称不同,前者使用的是 cmd_vel话题,后者使用的是 /turtle1/cmd_vel话题,需要将话题名称修改为一致,才能使用,如何实现?

3.1 rosrun设置话题重映射

只要使得teleop_twist_keyboard与乌龟显示节点的话题一致,就可以实现两者通信。

rosrun名称重映射语法: rorun 包名 节点名 话题名:=新话题名称
方案1:将 teleop_twist_keyboard 节点的话题设置为/turtle1/cmd_vel

启动键盘控制节点:rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/turtle1/cmd_vel
启动乌龟显示节点: rosrun turtlesim turtlesim_node
--------------------------------------------------------------------------------
方案2:将乌龟显示节点的话题设置为 /cmd_vel

启动键盘控制节点:rosrun teleop_twist_keyboard teleop_twist_keyboard.py
启动乌龟显示节点: rosrun turtlesim turtlesim_node /turtle1/cmd_vel:=/cmd_vel

3.2 launch文件设置话题重映射

launch 文件设置话题重映射语法:

<node pkg="xxx" type="xxx" name="xxx">
    <remap from="原话题" to="新话题" />
</node>

同样的只要订阅方和发布方话题一致就可以实现通信。

方案1:将 teleop_twist_keyboard 节点的话题设置为/turtle1/cmd_vel

<launch>

    <node pkg="turtlesim" type="turtlesim_node" name="t1" />
    <node pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py" name="key">
        <remap from="/cmd_vel" to="/turtle1/cmd_vel" />
    </node>

</launch>
------------------------------------------------------------------------------------
方案2:将乌龟显示节点的话题设置为 /cmd_vel

<launch>

    <node pkg="turtlesim" type="turtlesim_node" name="t1">
        <remap from="/turtle1/cmd_vel" to="/cmd_vel" />
    </node>
    <node pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py" name="key" />

</launch>

3.3 编码设置话题名称

在编码时,以全局、相对、和私有三种类型去命名话题可以有效的避免话题重名。

3.3.1 全局名称

格式:/开头的名称,和节点名称无关

 比如:

初始化节点:ros::init(argc,argv,"node")
启动节点时,设置一个工作空间 __ns:= xxx

发布:ros::Publisher pub = nh.advertise<std_msgs::String>("/abc/def/chatter",1000);
-----------------------------------------------------------------------------------
使用 rosnode 查看节点信息
对应节点名为:/xxx/node

使用 rostopic 查看话题信息
查看得话题名为:/abc/def/chatter  (明显与设置的节点名无关)
3.3.2 相对名称

格式:/开头的名称,参考命名空间(与节点名称平级)来确定话题名称

比如:

初始化节点:ros::init(argc,argv,"node")
启动节点时,设置一个工作空间 __ns:= xxx

发布:ros::Publisher pub = nh.advertise<std_msgs::String>("abc/def/chatter",1000);
-----------------------------------------------------------------------------------
使用 rosnode 查看节点信息
对应节点名为:/xxx/node

使用 rostopic 查看话题信息
对应话题名为:/xxx/abc/def/chatter  (其与节点在同一命名空间“xxx”下,与节点名称平级)
3.3.3 私有名称

格式:~开头的名称,需要创建特定的NodeHandle

初始化节点:ros::init(argc,argv,"node");
ros::NodeHandle nh("~");
启动节点时,设置一个工作空间 __ns:= xxx

ros::Publisher pub = nh.advertise<std_msgs::String>("abc/chatter",1000);
-------------------------------------------------------------------------
使用 rosnode 查看节点信息
对应节点名为:/xxx/node

使用 rostopic 查看话题信息
对应话题名为:/xxx/node/abc/chatter  (话题名是节点名称的子级)

##需要注意的是,当使用~,而话题名称又是/开头时,那么话题名称是全局的!!!即全局的优先级更高。

ros::NodeHandle nh("~");

ros::Publisher pub = nh.advertise<std_msgs::String>("/abc/chatter",1000);
-----------------------------------------------------------------------------
对应话题名为:/abc/chatter

四、ros参数重名

在ROS中参数名称也可能重名,当参数名称重名时,那么就会产生覆盖。关于参数重名的处理,没有重映射实现,为了尽量的避免参数重名,都是使用为参数名添加前缀的方式,实现类似于话题名称,有全局、相对、和私有三种类型之分。

  • 全局(参数名称直接参考ROS系统,与节点命名空间平级)
  • 相对(参数名称参考的是节点的命名空间,与节点名称平级)
  • 私有(参数名称参考节点名称,是节点名称的子级)

设置参数的方式也有三种:

  • rosrun 命令
  • launch 文件
  • 编码实现

4.1 rosrun设置参数

rosrun 在启动节点时,也可以设置参数:

语法:rosrun 包名 节点名称 _参数名:=参数值

启动乌龟显示节点,并设置参数 A = 100
rosrun turtlesim turtlesim_node _A:=100
-------------------------------------------
rosparam list查看节点信息
对应的参数名:/turtlesim/A  (以私有的形式)

4.2 launch文件设置参数

通过 launch 文件设置参数的方式,在launch文件的学习中学过,可以在 node 标签外,或 node 标签中通过 param 或 rosparam 来设置参数。在 node 标签外设置的参数是全局性质的,参考的是 / ,在 node 标签中设置的参数是私有性质的,参考的是 /命名空间/节点名称。

以 param 标签为例:

<launch>

    <param name="p1" value="100" />
    <node pkg="turtlesim" type="turtlesim_node" name="t1">
        <param name="p1" value="100" />
    </node>

</launch>
-------------------------------------------
rosparam list查看节点信息,对应的参数名为:
/p1
/t1/p1

4.3 编码设置参数

编码的方式可以更方便的设置:全局、相对与私有参数。

4.3.1 ros::param设置参数

设置参数调用的API是ros::param::set,该函数中,参数1传入参数名称,参数2是传入参数值,参数1中参数名称设置时,如果以 / 开头,那么就是全局参数,如果以 ~ 开头,那么就是私有参数,既不以 / 也不以 ~ 开头,那么就是相对参数。

ros::param::set("/set_A",100); //全局,和命名空间以及节点名称无关
ros::param::set("set_B",100); //相对,参考命名空间
ros::param::set("~set_C",100); //私有,参考命名空间与节点名称
4.3.2 ros::NodeHandle设置参数

设置参数时,首先需要创建 NodeHandle 对象,然后调用该对象的 setParam 函数,该函数参数1为参数名,参数2为要设置的参数值,如果参数名以 / 开头,那么就是全局参数,如果参数名不以 / 开头,如果NodeHandle 对象创那么,该参数是相对参数还是私有参数与NodeHandle 对象有关,建时如果是调用的默认的无参构造,那么该参数是相对参数,如果NodeHandle 对象创建时是使用ros::NodeHandle nh("~"),那么该参数就是私有参数。

ros::NodeHandle nh;
nh.setParam("/nh_A",100); //全局,和命名空间以及节点名称无关

nh.setParam("nh_B",100); //相对,参考命名空间
-------------------------------------
ros::NodeHandle nh_private("~");
nh_private.setParam("nh_C",100);//私有,参考命名空间与节点名称

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1420104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode—跳跃游戏—贪心算法

1 跳跃游戏1 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&a…

图像畸变校正(2)

畸变校正是一种用于矫正图像或视频中的失真或畸变的技术。这种失真通常是由摄像头镜头的特性或角度造成的&#xff0c;可能会导致图像中的对象形状、大小或位置不准确。以下是畸变校正的一般方法&#xff1a; 摄像头模型建立&#xff1a; 首先&#xff0c;需要建立摄像头的模型…

【React教程】(1) React简介、React核心概念、React初始化

目录 ReactReact 介绍React 特点React 的发展历史React 与 Vue 的对比技术层面开发团队社区Native APP 开发 相关资源链接 EcmaScript 6 补充React 核心概念组件化虚拟 DOM 起步初始化及安装依赖Hello World React React 介绍 React 是一个用于构建用户界面的渐进式 JavaScrip…

海外云手机为什么吸引用户?

近年来&#xff0c;随着全球化的飞速发展&#xff0c;海外云手机逐渐成为各行各业关注的焦点。那么&#xff0c;究竟是什么让海外云手机如此吸引用户呢&#xff1f;本文将深入探讨海外云手机的三大吸引力&#xff0c;揭示海外云手机的优势所在。 1. 高效的社交媒体运营 海外云…

Android 13以上版本读写SD卡权限适配

如题&#xff0c;最近工作上处理的问题&#xff0c;把解决方案简单逻列出来&#xff0c;供有需要的朋友参考之 解决方案&#xff1a; 1、配置权限 <uses-permission android:name"android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name&q…

PyQt5零基础入门(八)——按钮控件(QPushButton、QToolButton)

前言 按钮控件是图形用户界面(GUI)中常用的交互元素&#xff0c;用于触发特定的事件或行为。在Qt框架中&#xff0c;QPushButton和QToolButton是两种常用的按钮控件。 后边我们将以test.png为按钮图标&#xff0c;对比使用两种按钮控件。 普通按钮控件(QPushButton) QPushB…

禁止 ios H5 中 bounces 滑动回弹效果

在开发面向 iOS 设备的 HTML5 应用时&#xff0c;控制页面的滚动行为至关重要&#xff0c;特别是禁用在 Safari 中默认的滑动回弹效果。本文旨在提供一个简洁明了的解决方案&#xff0c;帮助开发者在特定的 Web 应用中禁用这一效果。 1. 什么是滑动回弹效果&#xff1f; 在 iO…

编写交互式 Shell 脚本

在日常的系统管理和自动化任务中&#xff0c;使用 Shell 脚本可以为我们节省大量时间和精力。 文章将以输入 IP 为例&#xff0c;通过几个版本逐步完善一个案例。 原始需求 编写一个交互式的 Shell 脚本&#xff0c;运行时让用户可以输入IP地址&#xff0c;并且脚本会将输入…

【高效开发工具系列】Wolfram Alpha

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【RT-DETR有效改进】2024.1最新MFDS-DETR的HS-FPN改进特征融合层(降低100W参数,全网独家首发)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构,其是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征…

“全”实力认可 | 美创科技领跑CCSIP 2023全景图数据安全领域

近日&#xff0c;FreeBuf咨询正式发布《CCSIP&#xff08;China Cyber Security Industry Panorama&#xff09;2023中国网络安全行业全景册&#xff08;第六版&#xff09;》。本次全景册面向广大国内安全厂商&#xff0c;由厂商自主申报并填写信息征集表&#xff0c;经FreeBu…

【俄乌之战】乌克兰声称280台俄罗斯服务器被毁,损失数据超2 PB

乌克兰报告针对俄罗斯政府关键基础设施和私营公司的多次网络攻击&#xff0c;导致全国范围内的中断和大量数据丢失。 乌克兰 HUR&#xff08;乌克兰国防部主要情报局&#xff09;的网络安全专家声称对IPL Consulting进行了成功的网络攻击。据报道&#xff0c;他们摧毁了整个IT…

uniapp H5 实现上拉刷新 以及 下拉加载

uniapp H5 实现上拉刷新 以及 下拉加载 1. 先上图 下拉加载 2. 上代码 <script>import DragableList from "/components/dragable-list/dragable-list.vue";import {FridApi} from /api/warn.jsexport default {data() {return {tableList: [],loadingHi…

SV-7041T 多媒体教学广播IP网络有源音箱

SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率30W。同时它可以外接一个30W的无源副音箱&#xff0c;用在面积较大的场所。5寸进口全频低音喇…

leetcode刷题(剑指offer) 50.Pow(x, n)

50.Pow(x, n) 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#x…

MGRE实验报告二

实验要求&#xff1a; 实验预览图&#xff1a; 实验分析&#xff1a; 1、对R1-R5配置IP地址&#xff0c;同时R1-R5每个路由器各有一个环回 2.1、对R1、R3、R4路由器开启虚拟接口1&#xff0c;分别配置隧道IP、接口封装协议&#xff0c;接口类型、定义封装源、开启伪广播功能&…

【教程】iOS如何抓取HTTP和HTTPS数据包经验分享

&#x1f4f1; 在日常的App开发和研发调研中&#xff0c;对各类App进行深入的研究分析时&#xff0c;我们需要借助专业的抓包应用来协助工作。本文将介绍如何使用iOS手机抓包工具来获取HTTP和HTTPS数据包&#xff0c;并推荐一款实用的抓包应用——克魔助手&#xff0c;希望能够…

vue3 + antd 封装动态表单组件(三)

传送带&#xff1a; vue3 antd 封装动态表单组件&#xff08;一&#xff09; vue3 antd 封装动态表单组件&#xff08;二&#xff09; 前置条件&#xff1a; vue版本 v3.3.11 ant-design-vue版本 v4.1.1 我们发现ant-design-vue Input组件和FormItem组件某些属性支持slot插…

uniapp如何添加多个表单数组?

目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 四、小结 注意事项 总结模板&#xff1a; 一、实现思路 1.在 data 中定义一个数组&#xff0c;用于存储表单项的数据 2.在模板中使用 v-for 指令渲染表单项 3.在 methods 中…

云计算底层技术奥秘、磁盘技术揭秘、虚拟化管理、公有云概述

云计算基础 实验图例 虚拟化平台安装 创建虚拟机 1、创建虚拟机 2cpu&#xff0c;4G内存&#xff08;默认用户名: root 密码: a&#xff09; 2、验证 ecs 是否支持虚拟化 [rootecs ~]# grep -Po "vmx|svm" /proc/cpuinfovmx... ...[rootecs ~]# lsmod |grep kvm…