ROS1 Noetic主从机通信使用详解

作者: Herman Ye @Auromix
测试环境: Ubuntu20.04 ROS1 Noetic
更新日期: 2023/12/27
1 @Auromix 是一个机器人爱好者开源组织。
2 由于笔者水平有限,以下内容可能存在事实性错误。

本文分为设置步骤相关知识参考资料三部分。
如果你只希望设置,请参考设置步骤
如果你希望了解相关概念,请参考相关知识
如果你希望深入了解ROS的环境变量设置和多机通讯,请参考参考资料

设置步骤

此时认为机器人是ROS1 Master所在的机器,机器人作为主机,远程PC作为从机,完成主从机通信。

1.获取机器人和PC的IP和HOSTNAME

  • 机器人端

登录到机器人并执行以下步骤:

1.查询机器人IP

hostname -I

2.查询机器人用户名

hostname

此时假设获取到的机器人ip192.168.50.141hostnameherman_robot

  • PC端

登录到PC端并执行以下步骤:

1.查询PC端IP

hostname -I

2.查询PC端用户名

hostname

此时假设获取到的PC端ip192.168.50.168hostnamehermanye

Computer HOSTNAME IP
Robot herman_robot 192.168.50.141
PC hermanye 192.168.50.168

2. 设置机器人

登录到机器人并执行以下步骤:

  • 添加到系统的host
sudo nano /etc/hosts
# Add pc to /etc/hosts
# My PC
192.168.50.168 hermanye
  • 测试host设置
ping hermanye
ping 192.168.50.168
  • 设置ROS环境变量
sudo nano ~/.bashrc
# Add these to ~/.bashrc
# My ROS MASTER
export ROS_MASTER_URI=http://192.168.50.141:11311/
# MY IP
export ROS_IP=192.168.50.141

3. 设置PC端

登录到PC端并执行以下步骤:

  • 添加到系统的host
sudo nano /etc/hosts
# Add robot to /etc/hosts
# My ROBOT
192.168.50.141 herman_robot
  • 测试host设置
ping herman_robot
ping 192.168.50.141
  • 设置ROS环境变量
sudo nano ~/.bashrc
# Add these to ~/.bashrc
# My ROS MASTER
export ROS_MASTER_URI=http://192.168.50.141:11311/
# MY IP
export ROS_IP=192.168.50.168

4.刷新并测试

在Linux系统中,当你修改了/etc/hosts文件后,系统会立即识别这些更改,无需手动刷新。
但你无法强制所有已经运行的程序立即刷新它们的主机名解析结果。如果你需要立即应用/etc/hosts的更改,你可能需要重启相关的程序。

  1. 关闭所有ROS相关的节点

  2. 刷新环境变量

source ~/.bashrc
  1. 测试Topic通讯
    在机器人上启动roscore并运行以下命令:
rosrun turtlesim turtlesim_node

在PC端上运行:

rosrun turtlesim turtle_teleop_key

通过PC端的键盘控制机器人端的Turtlesim,看是否能正常移动。

  1. 测试Service通讯
    在刚才的基础上,在PC端运行:
rosservice call /reset

检查小乌龟是否重置状态回到初始点。

  1. 反向测试
    反之亦然,通过类似的操作来检测机器人到PC端的通信是否正常。

相关知识

查看当前机器的局域网IP地址

hostname -I

查看当前机器的hostname

hostname

/etc/hosts

/etc/hosts是一个操作系统文件,用于将主机名映射到IP地址。在网络请求中,系统首先会检查这个文件,然后才会尝试使用DNS来解析主机名。这个文件可以用于重定向网络请求,或者在没有DNS服务器的情况下设置网络配置。

ROS_MASTER_URI

ROS_MASTER_URI是一个必需的设置,它告诉节点在哪里可以找到ROS1的master。它应该设置为master的XML-RPC URI。当使用localhost时,应该非常小心,因为这可能会导致远程启动的节点出现意外的行为。

export ROS_MASTER_URI=http://hermanye20:11311/

XML-RPC URI

XML-RPC是一个远程过程调用(Remote Procedure Call,RPC)的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为传送机制。
XML-RPC URI是一个统一资源标识符,用于定位网络上的资源,特别是在XML-RPC协议中。XML-RPC是一种使用HTTP作为传输协议,XML作为编码方式的远程过程调用协议。

在ROS1中,ROS_MASTER_URI就是一个XML-RPC URI,它告诉节点在哪里可以找到master。例如,一个典型的ROS_MASTER_URI可能是这样的:http://localhost:11311

这个URI中,http是协议,localhost是主机名,11311是端口号。这个URI表示master在本地机器的11311端口上运行。

ROS_IP/ROS_HOSTNAME

ROS_IP和ROS_HOSTNAME是可选的环境变量,用于设置ROS节点或工具的声明网络地址。
这两个选项是互斥的,如果两者都设置了,ROS_HOSTNAME将优先使用。
如果你正在指定一个IP地址,使用ROS_IP,如果你正在指定一个主机名,使用ROS_HOSTNAME。
当一个ROS组件向master或其他组件报告一个URI时,将使用这个值。
只有在你的计算机有多个地址,并需要强制ROS使用特定的一个时,才需要这个设置。
除了’localhost’,它不会影响实际的绑定地址,因为ROS组件绑定到所有可用的网络接口。如果值设置为localhost,ROS组件将只绑定到环回接口。这将阻止远程组件能够与你的本地组件通信。

export ROS_HOSTNAME=hermanye20
export ROS_IP=192.168.50.168

参考资料

https://wiki.ros.org/ROS/EnvironmentVariables
https://wiki.ros.org/ROS/Tutorials/MultipleMachines
https://wiki.ros.org/ROS/NetworkSetup
http://www.faqs.org/docs/securing/chap9sec95.html

你可能感兴趣的:(ROS,ROS)