如何使用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)更改节点标记的名称属性。
现在,您还可以轻松地使用启动文件启动匿名节点。