ROS:节点名称重名

文章详细介绍了ROS中如何通过命名空间和重映射解决节点重名问题。包括使用rosrun命令设置命名空间和重映射,以及在launch文件中配置这两个功能。同时,还提到了C++和Python编程中实现命名空间和重映射的方法。
部署运行你感兴趣的模型镜像

一、前言

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

在ROS中给出的解决策略是使用命名空间或名称重映射。
命名空间就是为名称添加前缀,名称重映射是为名称起别名。这两种策略都可以解决节点重名问题,两种策略的实现途径有多种:
rosrun 命令
launch 文件
编码实现
以上三种途径都可以通过命名空间或名称重映射的方式,来避免节点重名。

二、rosrun设置命名空间与重映射

2.1设置命名空间

语法: rosrun 包名 节点名 __ns:=新名称

rosrun turtlesim turtlesim_node __ns:=/xxx
rosrun turtlesim turtlesim_node __ns:=/yyy

结果
rosnode list查看节点信息,显示结果:

/xxx/turtlesim
/yyy/turtlesim

2.2rosrun名称重映射

语法: rosrun 包名 节点名 __name:=新名称

rosrun turtlesim  turtlesim_node __name:=t1 |  rosrun turtlesim   turtlesim_node /turtlesim:=t1(不适用于python)
rosrun turtlesim  turtlesim_node __name:=t2 |  rosrun turtlesim   turtlesim_node /turtlesim:=t2(不适用于python)

结果
rosnode list查看节点信息,显示结果:

/t1
/t2

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

语法: rosrun 包名 节点名 __ns:=新名称 __name:=新名称

rosrun turtlesim turtlesim_node __ns:=/xxx __name:=tn

结果
rosnode list查看节点信息,显示结果:

/xxx/tn

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

在 node 标签中有两个属性: name 和 ns,二者分别是用于实现名称重映射与命名空间设置

launch文件

<launch>

    <node pkg="turtlesim" type="turtlesim_node" name="t1" />
    <node pkg="turtlesim" type="turtlesim_node" name="t2" />
    <node pkg="turtlesim" type="turtlesim_node" name="t1" ns="hello"/>

</launch>

注:在 node 标签中,name 属性是必须的,ns 可选。

结果
rosnode list查看节点信息,显示结果:

/t1
/t2
/t1/hello

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

4.1C++ 实现:重映射

名称别名设置
核心代码:ros::init(argc,argv,"zhangsan",ros::init_options::AnonymousName);

执行:
会在名称后面添加时间戳。

4.2C++ 实现:命名空间

核心代码

std::map<std::string, std::string> map;
  map["__ns"] = "xxxx";
  ros::init(map,"wangqiang");

执行
节点名称设置了命名空间。

4.3Python 实现:重映射

名称别名设置
核心代码:rospy.init_node(“lisi”,anonymous=True)

执行
会在节点名称后缀时间戳。

参考视屏:赵虚左ros入门
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

/* 需求: 实现基本的话题通信,一方发布数据,一方接收数据, 实现的关键点: 1.发送方 2.接收方 3.数据(此处为普通文本) PS: 二者需要设置相同的话题 消息发布方: 循环发布信息:HelloWorld 后缀数字编号 实现流程: 1.包含头文件 2.初始化 ROS 节点:命名(唯一) 3.实例化 ROS 句柄 4.实例化 发布者 对象 5.组织被发布的数据,并编写逻辑发布数据 */ // 1.包含头文件 #include "ros/ros.h" #include "std_msgs/String.h" //普通文本类型的消息 #include <sstream> int main(int argc, char *argv[]) { //设置编码 setlocale(LC_ALL,""); //2.初始化 ROS 节点:命名(唯一) // 参数1和参数2 后期为节点传值会使用 // 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一 ros::init(argc,argv,"talker"); //3.实例化 ROS 句柄 ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能 //4.实例化 发布者 对象 //泛型: 发布的消息类型 //参数1: 要发布到的话题 //参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁) ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10); //5.组织被发布的数据,并编写逻辑发布数据 //数据(动态组织) std_msgs::String msg; // msg.data = "你好啊!!!"; std::string msg_front = "Hello 你好!"; //消息前缀 int count = 0; //消息计数器 //逻辑(一秒10次) ros::Rate r(1); //节点不死 while (ros::ok()) { //使用 stringstream 拼接字符串与编号 std::stringstream ss; ss << msg_front << count; msg.data = ss.str(); //发布消息 pub.publish(msg); //加入调试,打印发送的消息 ROS_INFO("发送的消息:%s",msg.data.c_str()); //根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率; r.sleep(); count++;//循环结束前,让 count 自增 //暂无应用 ros::spinOnce(); } return 0; }详细地逐行解释一下这份ROS话题通信代码
最新发布
11-08
以下是一个典型的ROS(Robot Operating System)话题通信中消息发布方的Python代码示例,并且逐行解释其功能。假设使用ROS 1(如ROS Kinetic、Melodic等),代码使用Python 2.7或Python 3.x(在ROS 2中Python支持更广泛): ```python #!/usr/bin/env python # 这是一个Shebang行,指定了脚本的解释器为Python。当在终端中直接运行这个脚本时,系统会使用指定的Python解释器来执行脚本 import rospy # 导入rospy库,它是ROS的Python客户端库,提供了与ROS系统交互的各种功能,如节点初始化、发布者、订阅者等 from std_msgs.msg import String # 从std_msgs包中导入String消息类型。std_msgs是ROS中常用的标准消息包,String消息类型用于表示文本字符串 def talker(): # 定义一个名为talker的函数,该函数将包含消息发布的主要逻辑 pub = rospy.Publisher('chatter', String, queue_size=10) # 创建一个发布者对象pub。'chatter'是话题名称,即消息将发布到名为'chatter'的话题上; # String是消息类型,表示发布的消息是字符串类型;queue_size=10指定了消息队列的大小,当队列满时,旧的消息会被丢弃 rospy.init_node('talker', anonymous=True) # 初始化ROS节点节点名称为'talker'。anonymous=True表示在节点名称后面添加一个随机数,确保节点名称的唯一性,避免重名冲突 rate = rospy.Rate(1) # 1Hz # 创建一个Rate对象rate,设置发布频率为1Hz,即每秒发布一次消息 count = 0 # 初始化一个计数器count,用于为发布的消息添加编号 while not rospy.is_shutdown(): # 进入一个循环,只要ROS节点没有被关闭(即rospy.is_shutdown()返回False),就会一直循环执行 hello_str = "HelloWorld %d" % count # 构造要发布的消息字符串,使用格式化字符串将计数器count的值插入到"HelloWorld"后面 rospy.loginfo(hello_str) # 将消息内容输出到ROS的日志系统,方便调试和查看程序运行状态 pub.publish(hello_str) # 通过发布者对象pub将构造好的消息hello_str发布到'chatter'话题上 rate.sleep() # 调用Rate对象的sleep方法,根据之前设置的频率(1Hz)进行休眠,确保每秒发布一次消息 count += 1 # 计数器加1,为下一次发布的消息更新编号 if __name__ == '__main__': # 这是Python脚本的入口点,当脚本作为主程序运行时,下面的代码块会被执行 try: talker() # 调用talker函数,开始执行消息发布逻辑 except rospy.ROSInterruptException: # 捕获rospy.ROSInterruptException异常,当ROS节点被关闭(如通过Ctrl+C终止)时会抛出该异常 pass # 异常处理部分,这里只是简单地忽略异常,程序正常退出 ``` ### 代码运行步骤 1. 确保ROS环境已经正确安装和配置。 2. 创建一个ROS包(如果还没有),例如: ```bash catkin_create_pkg my_package rospy std_msgs ``` 3. 将上述代码保存为一个Python文件,例如`talker.py`,并放在`my_package/src`目录下。 4. 给脚本添加可执行权限: ```bash chmod +x talker.py ``` 5. 编译ROS包: ```bash cd ~/catkin_ws catkin_make source devel/setup.bash ``` 6. 启动ROS核心: ```bash roscore ``` 7. 运行发布者节点: ```bash rosrun my_package talker.py ``` ### 注意事项 - 确保ROS环境变量已经正确设置,通常通过`source devel/setup.bash`来设置。 - 如果使用ROS 2,代码结构和API会有所不同,需要参考ROS 2的文档进行开发。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello xiǎo lěi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值