ROS之命名空间

已经学ROS快两个月了,一开始对ROS 命名空间,参数,参数服务器,重映射没认真看,后来发现很重要,它是学习ROS代码的基础。我们都知道ros以topic通信,但是只靠topic通信是远远不够的,于是使用客服端服务器、actionlib、参数服务器来补充,这几种都是通信的机制。但还不够,为了方便又加入了命名空间,重映射。只有清楚了这些,其实才算对ros有了初步了解,下面的几个文章我将分别介绍。

在介绍之前,我先抱怨一下,对于只学过C语言的我,没有写过什么项目,然后自己学习ROS,简直痛苦。想找几个资料,英文的根本看不懂,四级都没过,找中文的基本都是直译过来的,而且大多数人的理解,或多或少的都有点错误,当然,我的理解应该有点错误的,希望明白之人能指出,感激不尽。

在C++中的命名空间,using namespace std,std就是名空间,这里的命名空间跟它差不多,但是比它更多,一层嵌套一层,用的特别灵活。先举个简单的例子,然后细说。

我们先运行一个小乌龟:

rosrun turtlesim turtlesim_node 


turtlesim是一个包名,turtlesim_node是执行文件名,可以与节点名相同,也不可以不同。这里的节点名是 /turtlesim。说明可能初始化的时候是这样的,为什么是可能,因为重映射可以改变:

ros::init(argc, argv, "turtlesim");

节点名前面加个“/”,这意味这个节点是全局空间的。另外说下,节点是有类型的,节点的类型就是节点所在包名和可执行文件名的加。一般的定义节点句柄:

ros::NodeHandle n;

NodeHandle是一个类,然后我们实例化的一个对象n.这种情况默认n这个节点是全局命名空间下的。你可以认为"/"这个斜杠就是全局名空间。现在我们来改变这个节点的名空间,通过重映射,我们先用重映射,以后再讲。

### ROS命名空间的使用方法 在ROS中,命名空间是一种用于组织和隔离不同功能模块的方式。通过命名空间的应用,可以有效避免资源名称冲突并提高系统的可扩展性和模块化程度。 #### 1. 命名空间的基本概念 命名空间允许用户在同一系统中共存多个同名的主题和服务,而不会发生冲突。当在一个特定的命名空间下发布或订阅主题、调用或提供服务时,该命名空间会被自动应用到资源名称上[^1]。例如,在`/robot1`命名空间下发布主题`/sensor/data`,其实际名称将是`/robot1/sensor/data`。 #### 2. 配置命名空间的方法 可以通过多种方式配置命名空间: - **启动文件中的namespace标签** 在`.launch`文件中,可以直接定义一个`<group>`或者单独的`<node>`节点,并为其指定`ns`属性来创建命名空间。 ```xml <launch> <!-- 定义命名空间 --> <group ns="robot1"> <node pkg="my_pkg" type="publisher_node" name="sensor_publisher"/> </group> <!-- 另一命名空间 --> <group ns="robot2"> <node pkg="my_pkg" type="subscriber_node" name="data_subscriber"/> </group> </launch> ``` - **命令行参数** 使用`roslaunch`或`rosrun`命令时,也可以动态地为某个节点分配命名空间。例如: ```bash roslaunch my_pkg example.launch __ns:=/new_namespace ``` #### 3. 实际案例分析 假设有一个机器人项目涉及两个独立运行的机械臂(分别为`arm1`和`arm2`),它们各自拥有传感器数据流和控制指令。为了防止两者之间的主题和服务相互干扰,可以分别将其置于不同的命名空间下。 ```xml <launch> <!-- Arm1 的命名空间 --> <group ns="arm1"> <node pkg="control_system" type="joint_state_publisher.py" name="joint_states_pub"/> <node pkg="sensors" type="imu_data_collector.py" name="imu_sensor"/> </group> <!-- Arm2 的命名空间 --> <group ns="arm2"> <node pkg="control_system" type="joint_state_publisher.py" name="joint_states_pub"/> <node pkg="sensors" type="imu_data_collector.py" name="imu_sensor"/> </group> </launch> ``` 在这种情况下,即使两者的节点名称相同,但由于处于不同的命名空间中,因此能够正常工作而不产生任何冲突。 #### 4. 参数传递与命名空间的关系 除了简单的主题和服务外,命名空间还可以影响参数服务器上的键路径。如果某些参数是在全局范围内设置,则无论在哪种命名空间内都可以访问;但如果这些参数位于局部命名空间内部,则只有属于同一命名空间下的节点才能获取到相应的值[^2]。 #### 5. 工具支持 利用RViz等可视化工具时也需要考虑当前所选显示范围是否匹配目标对象所在的命名空间。通常可以在界面右侧找到“Global Options”,其中包含了关于固定帧的选择项——这实际上就是指定了观察视角对应的坐标系及其关联的数据源位置关系。 --- ### 示例代码展示 下面是一个完整的例子演示如何结合Xacro宏定义以及加载具体硬件组件的同时运用好命名空间技术实现灵活部署方案的设计思路: ```xml <!-- Launch file demonstrating namespace usage with XACRO parameters --> <launch> <!-- Define arguments passed into nodes within namespaces --> <arg name="load_gripper" default="true"/> <arg name="arm_id" default="panda"/> <!-- Namespace for first robotic arm instance --> <group ns="arm1"> <param name="robot_description" textfile="$(find panda_moveit_config)/urdf/panda.urdf"/> <param name="robot_description_semantic" command="xacro '$(find panda_moveit_config)/config/panda.srdf.xacro' hand:=$(arg load_gripper) arm_id:=$(arg arm_id)" /> <node pkg="robot_state_publisher" type="robot_state_publisher" name="state_publisher"/> </group> <!-- Second instance under different namespace --> <group ns="arm2"> <param name="robot_description" textfile="$(find ur5e_moveit_config)/urdf/ur5e.urdf"/> <param name="robot_description_semantic" command="xacro '$(find ur5e_moveit_config)/config/ur5e.srdf.xacro' hand:=$(arg load_gripper) arm_id='ur'" /> <node pkg="robot_state_publisher" type="robot_state_publisher" name="state_publisher"/> </group> </launch> ``` 此脚本展示了如何根据不同类型的机械手实例化各自的描述文档并通过相应变量调整附加装置选项等功能特性。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值