使用ros::init设置节点名称 和 launch文件中node里面使用name参数设置节点名称的区别

在 ROS 中,ros::init 和 launch 文件中 node 标签的 name 参数都用于设置节点的名称,但它们的作用和影响有所不同:

1. ros::init 设置节点名称

当你使用 ros::init 函数初始化一个 ROS 节点时,你可以通过传递第三个参数来设置节点的名称。例如:

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

这里,"my_node_name" 是你给节点指定的名字。ros::init 设置的节点名称通常是节点的全局名称,即 ROS 主节点(master)将使用这个名字来识别和跟踪这个节点。

2. Launch 文件中的 name 参数

在 launch 文件中,你可以为每个 <node> 标签指定 name 属性。例如:

<node pkg="mypkg" type="mynode" name="my_launch_node" />

这里,name="my_launch_node" 指定了节点的名称。当通过 launch 文件启动节点时,ROS 会使用这个名称作为节点的名称。

区别

  • 命名冲突处理

    • 如果使用 ros::init 设置节点名称,ROS 会检查是否有其他具有相同名称的节点正在运行。如果有,ROS 会自动为新节点添加后缀(如 _1_2 等),以避免命名冲突。
    • 如果使用 launch 文件中的 name 参数,ROS 会直接使用提供的名称,即使有命名冲突也不会自动添加后缀。因此,如果在 launch 文件中指定了相同的名称,ROS 会报错。
  • 灵活性

    • 使用 ros::init 设置节点名称允许你在运行时动态地改变节点的名称,例如根据不同的运行环境或配置文件来设置不同的名称。
    • 使用 launch 文件中的 name 参数则是在编写 launch 文件时就确定了节点的名称,这种方式更适合固定的部署场景。
  • 命名空间

    • 当你在 launch 文件中使用 <node> 标签时,你可以为节点指定命名空间,例如:
      <node pkg="mypkg" type="mynode" name="my_node" namespace="/robot1" />
      
      这样,节点的实际名称将是 /robot1/my_node
    • 如果使用 ros::init 设置节点名称,你也可以通过 ros::NodeHandle 的构造函数来指定命名空间,例如:
      ros::NodeHandle nh("/robot1");
      
      这样,节点的名称将会是 /robot1/my_node_name

实践建议

  • 如果你需要在运行时动态地设置节点名称,或者希望避免命名冲突时自动添加后缀,那么使用 ros::init 是更好的选择。
  • 如果你需要在 launch 文件中启动多个节点,并且希望它们具有特定的名称,或者需要在不同的 launch 文件之间共享相同的节点名称,那么在 <node> 标签中使用 name 参数更为合适。

如果在 ROS 节点中同时使用 ros::init 设置节点名称,并且在 launch 文件中也通过 标签的 name 属性设置了节点名称,那么最终节点的名称将由 launch 文件中的 name 属性决定。

详细说明

  1. ros::init 设置节点名称

    • 当你使用 ros::init 设置节点名称时,ROS 会在内部记录这个名称,并且会尝试使用这个名称来注册节点。
    • 例如:
      ros::init(argc, argv, "my_node_name");
      
  2. launch 文件中的 name 属性

    • 当你在 launch 文件中启动节点时,通过 <node> 标签的 name 属性指定的名称将覆盖 ros::init 设置的名称。
    • 例如:
      <node pkg="mypkg" type="mynode" name="my_launch_node" />
      

实际效果

  • 当你启动节点时,ROS 会首先读取 ros::init 设置的节点名称。
  • 如果你随后通过 launch 文件启动节点,并且在 <node> 标签中指定了 name 属性,那么这个 name 属性将成为节点的实际名称,无论 ros::init 设置的名称是什么。

示例

假设你有以下代码:

#include "ros/ros.h"

int main(int argc, char **argv) {
    ros::init(argc, argv, "my_node_name");
    ros::NodeHandle nh;
    ROS_INFO("Node name: %s", ros::this_node::getName().c_str());
    ros::spin();
    return 0;
}

同时你有以下 launch 文件:

<launch>
    <node pkg="mypkg" type="mynode" name="my_launch_node" />
</launch>

当你通过 launch 文件启动节点时,ROS 会使用 name="my_launch_node" 作为节点的名称,而不是 ros::init 设置的 "my_node_name"。因此,节点的日志输出将会显示:

Node name: my_launch_node

总结

  • 如果你既使用 ros::init 设置节点名称,又在 launch 文件中通过 <node> 标签的 name 属性设置了节点名称,那么最终的节点名称将由 launch 文件中的 name 属性决定。
  • 这种情况下,ros::init 设置的名称不会被使用。
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS(Robot Operating System)是一个开源的机器人操作系统,它提供了很多工具和库,方便我们构建、测试和部署机器人应用。ROS节点node)是ROS系统的基本构建块,它们可以执行各种任务,并通过ROS通信机制与其他节点通信。 在ROS,我们可以使用launch文件来管理节点的启动和运行。launch文件是一个XML格式的文件,其包含了我们需要启动的节点、参数、话题、服务等信息。在本次实验,我们将学习如何编写一个简单的launch文件来管理ROS节点的启动和运行,并对实验过程进行总结。 实验步骤: 1. 创建ROS工作空间 首先,我们需要创建一个ROS工作空间,如果已经有了可以跳过此步骤。在终端输入以下命令: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make source devel/setup.bash ``` 2. 创建ROS节点ROS工作空间的src目录下创建一个ROS节点。在终端输入以下命令: ``` cd ~/catkin_ws/src catkin_create_pkg my_node rospy ``` 这里创建了一个名为“my_node”的ROS包,其使用ROS的Python库rospy。 3. 编写ROS节点代码 在my_node创建一个名为“my_node.py”的Python文件,并将以下代码复制到文件: ``` #!/usr/bin/env python import rospy def main(): rospy.init_node('my_node') rospy.loginfo('Hello, ROS!') if __name__ == '__main__': main() ``` 这个ROS节点非常简单,它只是打印了一条信息“Hello, ROS!”。当然,我们也可以在这里添加更多的代码来完成其他任务。 4. 编写ROS launch文件 在my_node创建一个名为“my_node.launch”的launch文件,并将以下代码复制到文件: ``` <launch> <node pkg="my_node" type="my_node.py" name="my_node" output="screen"/> </launch> ``` 这个launch文件定义了一个ROS节点,其“pkg”属性指定了节点所在的ROS包,“type”属性指定了节点的Python文件,“name”属性指定了ROS节点名称,“output”属性指定了节点输出的消息类型。 5. 运行ROS launch文件 在终端输入以下命令来启动ROS launch文件: ``` roslaunch my_node my_node.launch ``` 在终端将会看到输出“Hello, ROS!”,说明ROS节点已经成功启动。 实验总结: 通过本次实验,我们学习了如何使用ROS launch文件来管理ROS节点的启动和运行。在编写launch文件的过程,需要注意以下几点: 1. 在launch文件定义的节点必须与Python文件节点名称相同。 2. 在编写launch文件时,需要指定节点所在的ROS包、Python文件以及节点名称。 3. 在运行launch文件时,需要使用roslaunch”命令,并指定launch文件所在的ROS包和launch文件名称。 总的来说,ROSlaunch文件非常方便,可以大大简化我们的节点管理工作。在实际的机器人应用,我们可以使用launch文件来启动多个节点,并通过ROS通信机制将它们连接在一起,完成更加复杂的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值