问题1.
多台计算机连接同一wifi后 ,运行ROS2的小乌龟案例,自己的计算机,无法控制其他电脑的小乌龟
按照正常的情况来说,ROS2是DDS的自发现通信机制,只要处在同一wifi网络中,
A计算机执行启动小乌龟的命令
ros2 run turtlesim turtlesim_node
B计算机执行键盘控制节点
ros2 run turtlesim turtle_teleop_key
无需任何配置和修改,B计算机上的按键,就可以控制A计算机上的小乌龟
但我的计算机始终无法再ROS2的多机环境中,去控制其他几台计算机上的小乌龟,其他几台计算机也无法控制我的计算机上的小乌龟,但其他几台计算机运行的都很正常,都可以彼此控制,然后本人研究了一晚上发现是自己计算机ubuntu22.04实体机的防火墙没关,导致无法此计算机与其他多台计算机无法通信。
运行以下命令关闭防火墙:
sudo ufw disable
瞬间解决问题!!!
也曾询问ChatGPT4o,对方给出的答案如下:
在ROS2中,多个计算机通过同一个WiFi网络连接并协作时,可能会遇到一些网络配置的问题,导致无法控制其他计算机上的节点。以下是一些常见的故障排除步骤和配置建议,帮助你解决无法控制其他计算机上的小乌龟的问题。
步骤1:检查网络连接
确保所有计算机都连接到同一个WiFi网络,并且可以相互ping通。
ping 其他电脑IP
步骤2:配置ROSDOMAINID
为了确保ROS2在多台计算机上可以相互发现节点和主题,需要设置相同的ROS_DOMAIN_ID。这个ID可以是一个0到232之间的整数。你可以在每台计算机的终端中设置这个环境变量:
export ROS_DOMAIN_ID=1
为了使这个设置永久生效,可以将其添加到每个用户的~/.bashrc文件中:
echo "export ROS_DOMAIN_ID=1" >> ~/.bashrc
source ~/.bashrc
步骤3:设置环境变量
为了确保ROS2节点能够正确解析和访问网络中的其他节点,需要设置一些环境变量。
在每台计算机上,编辑~/.bashrc文件并添加以下内容:
export ROS_LOCALHOST_ONLY=0
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
步骤4:检查防火墙设置
确保所有计算机的防火墙允许ROS2所需的通信端口。如果使用的是Ubuntu,可以暂时关闭防火墙以测试问题是否出在防火墙设置上:
sudo ufw disable
步骤5:启动小乌龟仿真和控制节点
假设你已经安装了turtlesim包,可以在一台计算机上启动小乌龟仿真,在另一台计算机上控制小乌龟。
在计算机A上启动turtlesim_node:
ros2 run turtlesim turtlesim_node
在计算机B上启动控制节点:
ros2 run turtlesim turtle_teleop_key
步骤6:检查节点和主题
在两台计算机上分别运行以下命令,确保它们能够看到彼此的节点和主题:
ros2 node list
ros2 topic list
示例
假设有两台计算机,计算机A的IP地址为192.168.1.2,计算机B的IP地址为192.168.1.3。
在计算机A上:
1.启动turtlesim_node:
export ROS_DOMAIN_ID=1
export ROS_LOCALHOST_ONLY=0
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
ros2 run turtlesim turtlesim_node
在计算机B上:
2.启动turtle_teleop_key:
export ROS_DOMAIN_ID=1
export ROS_LOCALHOST_ONLY=0
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
ros2 run turtlesim turtle_teleop_key
3.检查节点和主题:
bash
ros2 node list
ros2 topic list
如果上述步骤都已正确配置并且网络连接正常,你应该可以在计算机B上成功控制计算机A上的小乌龟。如果仍然无法控制,请检查网络配置,确保没有任何阻碍ROS2通信的因素。
问题2.
ROS2多机环境下,如何实现只可以本地通信?
答:
ROS_LOCALHOST_ONLY
是ROS2中的一个环境变量,用于控制节点通信的范围。它的值可以设置为0
或1
,每个值有不同的作用:
export ROS_LOCALHOST_ONLY=1
设置ROS_LOCALHOST_ONLY
为1
时,ROS2节点仅在本地主机(localhost)上进行通信。这意味着节点之间的通信将被限制在同一台计算机上,任何来自其他网络设备的通信请求都将被忽略。这在某些情况下很有用,例如调试或开发时需要确保所有通信都在单个机器上进行,避免外部网络干扰或安全问题。
使用场景
-
开发和测试: 在开发和测试阶段,可能希望隔离节点通信以简化调试过程,不受网络其他设备的干扰。
-
安全需求: 限制通信范围以确保数据不会被外部设备访问,从而提高系统的安全性。
export ROS_LOCALHOST_ONLY=0
如果设置为0
,则允许ROS2节点通过网络进行通信,这样不同计算机上的节点可以互相发现并进行通信。这是分布式系统中多台计算机协同工作时的常见设置。
总结
当ROS_LOCALHOST_ONLY
设置为1
时,通信被限制在本地机器上,适用于需要隔离的开发、测试或特定的安全需求场景。而设置为0
时,允许网络范围内的节点通信,适用于需要多台计算机协作的分布式应用场景。
在你的情况下,为了让多台计算机上的小乌龟仿真能够互相通信,你需要确保ROS_LOCALHOST_ONLY
设置为0
。这样,你才能在不同计算机之间控制小乌龟。
问题3.
ROS2多机环境下,如何实现分组通信?
答:在新终端中执行如下命令,设置 域ID
echo "export ROS_DOMAIN_ID=6" >> ~/.bashrc
ROS_DOMAIN_ID是一个环境变量,用于设置ROS2网络中的域ID。域ID用于区分不同的ROS2网络,使得多个独立的ROS2网络可以在同一个物理网络上运行而不会互相干扰。每个ROS2网络都有一个唯一的域ID,只有在相同域ID内的节点才能彼此发现并进行通信。
export ROS_DOMAIN_ID=6
设置ROS_DOMAIN_ID=6表示将当前环境的ROS2网络的域ID设置为6。这样,所有在这个环境中启动的ROS2节点将会属于域ID为6的网络。
使用场景
1.分离网络:
如果你在同一个物理网络上运行多个独立的ROS2应用程序,可以通过设置不同的域ID来分离这些网络,使它们互不干扰。例如,在一台共享的计算机集群上运行多个独立的ROS2项目时,每个项目可以设置不同的域ID。
2.避免冲突:
在开发和测试环境中,不同团队可能会使用相同的物理网络进行测试。通过使用不同的域ID,可以确保各自的测试环境不会相互干扰。
3.管理复杂网络:
在一个复杂的ROS2网络中,可能会有多个子网络,每个子网络执行特定的任务。使用不同的域ID可以帮助组织和管理这些子网络。
如何设置
在终端中执行以下命令来设置域ID:
export ROS_DOMAIN_ID=6
这条命令会将环境变量ROS_DOMAIN_ID设置为6,之后启动的所有ROS2节点将属于域ID为6的网络。
示例
假设你有两台计算机,分别运行不同的ROS2应用程序。你希望它们之间的通信不受干扰,可以为每台计算机设置不同的域ID:
4.计算机A:.bashrc文件中写入
export ROS_DOMAIN_ID=6
5.计算机B:.bashrc文件中写入
export ROS_DOMAIN_ID=7
这样,计算机A上的节点只能与域ID为6的其他节点通信,计算机B上的节点只能与域ID为7的其他节点通信,从而实现网络隔离。
总结
通过设置ROS_DOMAIN_ID,可以有效地将多个ROS2网络隔离开来,避免在同一个物理网络上运行多个ROS2应用程序时发生通信冲突。这对于管理复杂的开发环境和测试环境非常有用。
注意:设置完.bashrc文件后,source一下,然后重启电脑,否则设置的 域ID 无法生效!!!
问题4:
如何通过ssh 远程连接机器人,并把自己本地电脑中的文件夹,通过ssh 远程上传到机器人中
1. 如果自己电脑设置了域ID,则机器人也要设置对应的域ID(否则无法通过ssh远程连接),然后source 一下,reboot重启机器人,然后:
1)注意:是本地计算机的终端下执行
远程连接成功后,创建文件夹
注意:是远程连接后机器人的终端下(仍然在本地计算机)
2)
执行如上命令即可,等待上传结束!
注意:是本地计算机的终端下执行 ~/src 为本地计算机要传的文件 IP:~/lsg_ws/ 为机器人的文件夹路径
scp -r ~/src ros2@192.168.28.130:~/lsg_ws/