如何使用ROS匿名节点(Anonymous Node)

如何使用ROS匿名节点(Anonymous Node)

1.首先,为了理解什么时候需要使用ROS匿名节点,我们看一下问题所在。

问题描述:假设,您刚刚为红外传感器创建了一个节点,它运行良好,并且对此感到满意。但是现在,您的机器人具有12个红外传感器。 知道一个节点应具有唯一的名称,并且您不能运行两个具有相同名称的节点,该怎么办?
你可能考虑几种可行的方法:
(1)您可以让一个节点处理一组传感器,而不是让一个节点处理一个传感器。 因此,您的节点将监视所有红外传感器,并分别或以公共阵列的形式发布每个红外传感器的数据。 根据您要实现的目标,这可能是一个可行的解决方案。
(2)另一种解决方案是为每个传感器复制一个红外节点,每个节点都有唯一的名称。 如果您确切知道将有多少个传感器,并且这个数目很小并且不会增加,那么它会很好用。 例如,如果您的机器人上有2个摄像头,这可能是个好主意。 但是,如果您曾经尝试过将这种方法用于12个节点,请阅读以下内容。 这将为您节省大量时间和头痛。

2.什么是ROS匿名节点?

ROS节点应具有唯一的名称。 如果您在终端中运行一个节点,然后尝试在另一个终端上运行具有相同名称的另一个节点,则第一个节点将被杀死,因此第二个节点可以启动。 总而言之,您将只能同时运行一个具有相同名称的节点。
匿名节点可让您摆脱此规则。 创建匿名节点时,将在节点名称中添加一个随机的唯一ID。 因此,现在您可以运行任意数量的节点。 您的12个红外传感器中的每一个都可以有自己的节点,您无需自己创建ID。
现在,让我们看看如何在代码中实际使用这些匿名节点。 在此之前,让我们快速创建一个Python和Cpp节点。

3.创建具有唯一名称的简单Python和Cpp节点

(1)标准的Python节点
这是创建Python节点可以做的最基本的事情:

#!/usr/bin/env python
import rospy

if __name__ == '__main__':
    rospy.init_node("my_infra_red_sensor")
    rospy.spin()

在这里,我们只是初始化节点,并为其命名为“ my_infra_red_sensor”。 我们还使用了rospy.spin(),因此我们可以保持程序处于活动状态,直到我们手动杀死该节点为止。
(2)标准的Cpp节点

#include <ros/ros.h>

int main (int argc, char **argv)
{
    ros::init(argc, argv, "my_infra_red_sensor");
    ros::NodeHandle nh;
    ros::spin();
}

Cpp节点的功能与上面的Python节点完全相同。
(3)运行并测试节点
使用rosrun启动此节点(Python或Cpp一个)时,您在命令行运行

rosnode list

时会看到一个新节点:

~$ rosnode list
/my_infra_red_sensor
/rosout

这里没有新内容。 如果您在另一个终端中启动同一节点,则前一个将被终止,并且您将始终仅运行一个“ my_infra_red_sensor”节点。现在,让该节点成为匿名节点。

4.修改代码以使用ROS匿名节点

这实际上并不复杂。 实际上,每个节点只需要更改一行。 这行是您初始化节点并为其命名的行。
(1)Python中设置节点匿名

#!/usr/bin/env python
import rospy

if __name__ == '__main__':
    rospy.init_node("my_infra_red_sensor", anonymous=True)
    rospy.spin()

不难吧! 您只需要在init_node()函数中添加“ anonymous = True”作为第二个参数。就可以了。
(2)Cpp中设置节点匿名

#include <ros/ros.h>

int main (int argc, char **argv)
{
    ros::init(argc, argv, "my_infra_red_sensor", 
            ros::init_options::AnonymousName);
    ros::NodeHandle nh;
    ros::spin();
}

在这里,我们在init()函数中添加“ ros :: init_options :: AnonymousName”作为第二个参数。 而且…就是这样! 没有其他的。 您无需在CMakeLists.txt中修改文件名或可执行文件名。
那它到底实现了怎样的功能呢?
(3)运行并测试匿名节点
让我们再次启动该节点,并使用rosnode list对其进行监视。

~$ rosnode list
/my_infra_red_sensor_6625_1550398083304
/rosout

节点名称已更改。 它仍然以“ my_infra_red_sensor”开头,但是现在您可以看到在末尾添加了唯一标识符。
让我们打开其他几个终端,然后在所有这些新终端中启动完全相同的节点。

~$ rosnode list
/my_infra_red_sensor_6625_1550398083304
/my_infra_red_sensor_7343_1550398378088
/my_infra_red_sensor_7698_1550398382283
/my_infra_red_sensor_8052_1550398385927
/rosout

挞嗒!在这里,我已经启动了4次相同的节点,您可以看到有4个节点同时运行。 每个都有唯一的ID。 问题解决了!
现在,您可以启动任意数量的红外节点,每个传感器一个。

5.利用roslaunch启动ROS匿名节点

如果要使用启动文件启动应用程序,则还必须修改“节点”标签内的节点名称。
改之前:

<launch>
    <node name="my_infra_red_sensor" pkg="your_package" type="infra_red_sensor.py" />
</launch>

更改后:

<launch>
    <node name="$(anon my_infra_red_sensor)" pkg="your_package" type="infra_red_sensor.py" />
</launch>

您必须使用$(anon node_name)更改节点标记的名称属性。
现在,您还可以轻松地使用启动文件启动匿名节点。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值