作者: Herman Ye @Auromix
测试环境: Ubuntu20.04 ROS1 Noetic
更新日期: 2023/12/27
注1: @Auromix 是一个机器人爱好者开源组织。
注2: 由于笔者水平有限,以下内容可能存在事实性错误。
本文分为设置步骤
、相关知识
和参考资料
三部分。
如果你只希望设置,请参考设置步骤
。
如果你希望了解相关概念,请参考相关知识
。
如果你希望深入了解ROS的环境变量设置和多机通讯,请参考参考资料
。
此时认为机器人是ROS1 Master
所在的机器,机器人作为主机,远程PC作为从机,完成主从机通信。
登录到机器人并执行以下步骤:
1.查询机器人IP
hostname -I
2.查询机器人用户名
hostname
此时假设获取到的机器人ip
为192.168.50.141
,hostname
为herman_robot
登录到PC端并执行以下步骤:
1.查询PC端IP
hostname -I
2.查询PC端用户名
hostname
此时假设获取到的PC端ip
为192.168.50.168
,hostname
为hermanye
Computer | HOSTNAME | IP |
---|---|---|
Robot | herman_robot | 192.168.50.141 |
PC | hermanye | 192.168.50.168 |
登录到机器人并执行以下步骤:
sudo nano /etc/hosts
# Add pc to /etc/hosts
# My PC
192.168.50.168 hermanye
ping hermanye
ping 192.168.50.168
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
登录到PC端并执行以下步骤:
sudo nano /etc/hosts
# Add robot to /etc/hosts
# My ROBOT
192.168.50.141 herman_robot
ping herman_robot
ping 192.168.50.141
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
在Linux系统中,当你修改了/etc/hosts
文件后,系统会立即识别这些更改,无需手动刷新。
但你无法强制所有已经运行的程序立即刷新它们的主机名解析结果。如果你需要立即应用/etc/hosts
的更改,你可能需要重启相关的程序。
关闭所有ROS相关的节点
刷新环境变量
source ~/.bashrc
roscore
并运行以下命令:rosrun turtlesim turtlesim_node
在PC端上运行:
rosrun turtlesim turtle_teleop_key
通过PC端的键盘控制机器人端的Turtlesim,看是否能正常移动。
rosservice call /reset
检查小乌龟是否重置状态回到初始点。
hostname -I
hostname
/etc/hosts是一个操作系统文件,用于将主机名映射到IP地址。在网络请求中,系统首先会检查这个文件,然后才会尝试使用DNS来解析主机名。这个文件可以用于重定向网络请求,或者在没有DNS服务器的情况下设置网络配置。
ROS_MASTER_URI是一个必需的设置,它告诉节点在哪里可以找到ROS1的master。它应该设置为master的XML-RPC URI。当使用localhost时,应该非常小心,因为这可能会导致远程启动的节点出现意外的行为。
export ROS_MASTER_URI=http://hermanye20:11311/
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节点或工具的声明网络地址。
这两个选项是互斥的,如果两者都设置了,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