ROS 重名问题解决
1.ROS工作空间覆盖
隐患
存在安全隐患,比如当前工作空间B优先级更高,意味着当程序调用 turtlesim 时,不会调用工作空间A也不会调用系统内置的 turtlesim,如果工作空间A在实现时有其他功能包依赖于自身的 turtlesim,而按照ROS工作空间覆盖的涉及原则,那么实际执行时将会调用工作空间B的turtlesim,从而导致执行异常,出现安全隐患。
BUG 说明:
当在 .bashrc 文件中 source 多个工作空间后,可能出现的情况,在 ROS PACKAGE PATH 中只包含两个工作空间,可以删除自定义工作空间的 build 与 devel 目录,重新 catkin_make,然后重新载入 .bashrc 文件,问题解决。
2. 节点名称重名
rosrun设置命名空间
运行2次:
rosrun turtlesim turtlesim_node
第一次运行的会被强制关闭,留第二次启动的窗口
2.1 解决1-修改为:
rosrun turtlesim turtlesim_node __ns:=/xxx //注:__ns 是2个下划线
rosrun turtlesim turtlesim_node __ns:=/yyy
会成功启动2个窗口
解决2-修改为:
rosrun turtlesim turtlesim_node __name:=/xxx //注:__name 是2个下划线
rosrun turtlesim turtlesim_node __name:=/yyy
会成功启动2个窗口
解决3-前两个叠加修改为:
rosrun turtlesim turtlesim_node __ns:=/xxx __name:=tn
2.2 launch文件设置命名空间与重映射
<!-- 需要启动多个乌龟GUI节点 -->
<launch><node pkg = "turtlesim" type = "turtlesim_node" name = "turtlesime" /><!-- 名称重映射 -->><node pkg = "turtlesim" type = "turtlesim_node" name = "t1" /><!-- 命名空间 -->><node pkg = "turtlesim" type = "turtlesim_node" name = "turtlesime" ns = "ergouzi"/><!-- 命名空间+名称重映射 --><node pkg = "turtlesim" type = "turtlesim_node" name = "t2" ns = "maolvzi" /></launch>
3. 话题名称重名
3.1 实现 teleop_twist_keyboard 与乌龟显示节点通信
直接调用–>异常
3.1.1 将 teleop_twist_keyboard 节点的话题设置为/turtle1/cmd_vel -->正常通信
rostopic list 下,/cmd_vel 没有了
3.1.2 将乌龟显示节点的话题设置为 /cmd_vel -->正常通信
rostopic list 下,/turtle1/cmd_vel 没有了
3.2 launch文件方式
3.2.1 launch文件设置话题重映射
<!-- 键盘控制乌龟运动 -->
<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>
运行后,查看 list
3.3.1编码方式:
#include "ros/ros.h"
#include "std_msgs/String.h"
/*需求:演示不同类型的话题名称设置设置话题名称与命名空间
*/
int main(int argc, char *argv[])
{ros::init(argc,argv,"hello");ros::NodeHandle nh;//核心:设置不同类型的话题 //1.全局 ---话题名称需以 / 开头(也可以设置自己的命名空间),这种情况下和节点(命名空间及名称)没有关系ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter",1000);ros::Publisher pub = nh.advertise<std_msgs::String>("yyy/chatter",1000);//2.相对 ---非 / 开头 (将内容后缀到命名空间下面)// ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);//3.私有 ---需要创建特定 NodeHandle("~") ,后缀在命名空间/节点下ros::NodeHandle nh("~"); //前面那个NodeHandle需要被注释掉ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);//注意:如果私有的NodeHandle创建的话题以 / 开头(全局话题),生成的话题是全局的非私有//即全局话题优先级更高一些while (ros::ok()){}return 0;
}
①. 全局:
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter",1000);
// ros::Publisher pub = nh.advertise<std_msgs::String>("yyy/chatter",1000);
输出:
②. 相对:
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);
输出:
chatter 与 节点名称同级
③. 私有:
ros::NodeHandle nh("~"); //前面那个NodeHandle需要被注释掉ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);
3.4 Python-话题重命名
#! /usr/bin/env pythonimport rospy
from std_msgs.msg import Stringif __name__ == "__main__":rospy.init_node("hello")"""需求:实现不同类型的话题设置"""# 1.全局pub = rospy.Publisher("/chatter",String,queue_size=10)pub = rospy.Publisher("/yy/chatter",String,queue_size=10)# 2.相对pub = rospy.Publisher("chatter",String,queue_size=10)# 3.私有pub = rospy.Publisher("~chatter",String,queue_size=10)while not rospy.is_shutdown():pass
1.全局:
pub = rospy.Publisher("/chatter",String,queue_size=10)
2.相对:
pub = rospy.Publisher("chatter",String,queue_size=10)
3.私有
pub = rospy.Publisher("~chatter",String,queue_size=10)
4. 参数名称
4.1.rosrun方式:
rosrun 包名 节点名称 _参数名:=参数值
4.2 launch文件方式
<!--设置参数-->
<launch><!--格式1:全局--><param name = "radius" value = "0.2" /><node pkg = "turtlesim" type = "turtlesim_node" name = "t1" ns ="xxx"><!--格式2:私有--><param name = "radius" value = "0.08" /></node>
</launch>
4.3 编码设置
4.3.1 C++
#include "ros/ros.h"int main(int argc, char *argv[])
{ros::init(argc,argv,"hello");ros::NodeHandle nh;/*使用 ros::param 来设置参数*///1.全局ros::param::set("/radiusA",100);//2.相对 ros::param::set("radiusB",100);//3.私有 ros::param::set("~radiusC",100);/*使用 NodeHandle 来设置参数*///1.全局nh.setParam("/radius_nh_A",1000);//2.相对 nh.setParam("radius_nh_B",1000);//3.私有 ros::NodeHandle nh_private("~");nh_private.setParam("radius_nh_C",1000);return 0;
}
①使用 ros::param 来设置参数
//使用 ros::param 来设置参数*///1.全局ros::param::set("/radiusA",100);//2.相对 ros::param::set("radiusB",100);//3.私有 ros::param::set("~radiusC",100);
输出:
②使用 NodeHandle 来设置参数
/*使用 NodeHandle 来设置参数*///1.全局nh.setParam("/radius_nh_A",1000);//2.相对 nh.setParam("radius_nh_B",1000);//3.私有 ros::NodeHandle nh_private("~");nh_private.setParam("radius_nh_C",1000);
输出:
4.3.2 Python
#! /usr/bin/env pythonimport rospyif __name__ == "__main__":rospy.init_node("hello")"""设置不同类型的参数"""#全局rospy.set_param("/radiusA",100)#相对rospy.set_param("radiusB",100)#私有rospy.set_param("~radiusC",100)
输出:
ROS 重名问题解决相关推荐
- “网络上有重名”问题解决方法
最近电脑开机就显示"网络上有重名",修改计算机名称,无法修改,提示网络上有重名,连接错误等等.实际可以上网,连接没有问题. 网上搜的改名字,改IP都没用. 后来找到如下方法: 控制 ...
- ROS 学习笔记 重名
工作空间覆盖 工作空间覆盖,是指不同工作空间中,存在重名的功能包的情形.(应该尽量避免) 功能包重名时,会按照 ROS_PACKAGE_PATH 查找,配置在前的会优先执行. 隐患: 存在安全隐患,比 ...
- android id 重名_android - 解决“应用自定义权限重名”
背景 现场的开发今天跟我说,测试包装不上!报错"应用自定义权限重名"!!! 网上百度下关键字,发现魅族手机有这个毛病,顺藤摸瓜:"http://bbs.flyme.cn/ ...
- 域中添加电脑提示重名
今天给公司一台电脑 重新弄了下系统 添加到域的时候提示重名? 看来是域目录数据库还没来的急更新 于是用终端服务 连接域控制器 将此计算机删除,重新添加 ,问题解决. 转载于:https://blog ...
- 不同模块下包重名怎么解决_模块
模块 1. 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能. 2. 当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导 ...
- android id 重名_Android App 自定义权限重名不能安装解决办法
场景1. A 应用 有两个版本 第一个 正式版 第二个测试版 测试版的包名 = 正式版+test ,在Android studio 中 也就是 applicationId . 两个版本都可以成 ...
- Ajax实现简单用户名重名查询
很早就想发布这篇POST了,Ajax实现简单用户名重名查询,引用了xmlhttprequest object pool,如下: XMLHttpRequest Object Pool /** * XM ...
- java实现动态上传多个文件并解决文件重名问题
java实现动态上传多个文件并解决文件重名问题 参考文章: (1)java实现动态上传多个文件并解决文件重名问题 (2)https://www.cnblogs.com/skycodefamily/p/ ...
- 【更新】北京、广东、吉林重名数量查询工具,给孩子起名重名查询
最近很多朋友需要重名查询的功能,我今天测试了一下,北京和广东的查询工具好像都有点问题(不知道是不是和最近的那啥有关).那两个链接都是政府的网站(域名有gov),大家也能看出来,不知道因为什么原因不能使 ...
最新文章
- bootstrap-table对前台页面表格的支持
- 基于SSM实现在线聊天系统
- Mysql视图权限设置的踩坑经历
- 云宏与Rancher达成合作伙伴关系,结合金融领域客户特点联合打造WinGarden 2.0容器云平台...
- LINUX 如何实现多线程进行cp复制
- 如何查询oracle最近报警信息,教你怎样用Oracle方便地查看报警日志错误
- 关于redis的db的使用几号db的问题
- 盗版Windows系统IE 7.0的安装
- [C++] - dynamic_cast介绍及工作原理、typeid、type_info
- 机器学习实战 梯度上升 数学推导_机器学习全路线经典书籍
- u盘插入后计算机内没有选项,U盘插到电脑,无法读取,属性里面空间全是0是怎么回事?...
- C#中使用GUID的笔记
- js 实现php md5加密,js实现md5加密插件代码分享
- layui + jfinal 实现上传下载
- Uni-G/ The University of Glasgow (Uni-G) ECG Analysis Program
- 2021-09-23图嵌入方法
- MSF(Metaspolit)复现MS12-020蓝屏漏洞
- 黑苹果系统--Parallels Desktop虚拟机使用
- shared_preferences本地存储操作
- ANDROID webview解决视频无法播放问题
热门文章
- c语言 cdma编码正交的8位码片,CDMA编码
- orgchart组织机构图
- 基于易灵思开发板RiscV的调试流程
- 基于Python的人脸人眼图像识别处理系统
- AFNetworking2.4.1解析
- 【java】判断一个数是奇数还是偶数
- jmeter接口测试之登录测试
- 设计一个图书类Book..........此暂时使用数组实现的 ...................后面会用集合来改进 ...........
- 理想汽车事故,智能短板暴露-1
- pychram 配置清华镜像源_教你如何给树莓派更换软件源