ROS2 分布式 及 ssh远程控制 和 上传下载文件或文件夹

问题1.

多台计算机连接同一wifi后 ,运行ROS2的小乌龟案例,自己的计算机,无法控制其他电脑的小乌龟

按照正常的情况来说,ROS2是DDS的自发现通信机制,只要处在同一wifi网络中,

A计算机执行启动小乌龟的命令

bash 复制代码
ros2 run turtlesim turtlesim_node

B计算机执行键盘控制节点

cpp 复制代码
ros2 run turtlesim turtle_teleop_key

无需任何配置和修改,B计算机上的按键,就可以控制A计算机上的小乌龟

但我的计算机始终无法再ROS2的多机环境中,去控制其他几台计算机上的小乌龟,其他几台计算机也无法控制我的计算机上的小乌龟,但其他几台计算机运行的都很正常,都可以彼此控制,然后本人研究了一晚上发现是自己计算机ubuntu22.04实体机的**防火墙没关,**导致无法此计算机与其他多台计算机无法通信。

运行以下命令关闭防火墙:

bash 复制代码
sudo ufw disable

瞬间解决问题!!!

在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中的一个环境变量,用于控制节点通信的范围。它的值可以设置为01,每个值有不同的作用:

export ROS_LOCALHOST_ONLY=1

设置ROS_LOCALHOST_ONLY1时,ROS2节点仅在本地主机(localhost)上进行通信。这意味着节点之间的通信将被限制在同一台计算机上,任何来自其他网络设备的通信请求都将被忽略。这在某些情况下很有用,例如调试或开发时需要确保所有通信都在单个机器上进行,避免外部网络干扰或安全问题。

使用场景

  1. 开发和测试: 在开发和测试阶段,可能希望隔离节点通信以简化调试过程,不受网络其他设备的干扰。

  2. 安全需求: 限制通信范围以确保数据不会被外部设备访问,从而提高系统的安全性。

export ROS_LOCALHOST_ONLY=0

如果设置为0,则允许ROS2节点通过网络进行通信,这样不同计算机上的节点可以互相发现并进行通信。这是分布式系统中多台计算机协同工作时的常见设置。

总结

ROS_LOCALHOST_ONLY设置为1时,通信被限制在本地机器上,适用于需要隔离的开发、测试或特定的安全需求场景。而设置为0时,允许网络范围内的节点通信,适用于需要多台计算机协作的分布式应用场景。

在你的情况下,为了让多台计算机上的小乌龟仿真能够互相通信,你需要确保ROS_LOCALHOST_ONLY设置为0。这样,你才能在不同计算机之间控制小乌龟。

++问题3.++

++ROS2多机环境下,如何实现分组通信?++

答:在新终端中执行如下命令,设置 域ID

bash 复制代码
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. ssh wqh@192.168.76.120 然后输入密码即可,ssh远程连接和域ID无关

1)注意:是本地计算机的终端下执行

远程连接成功后,创建文件夹

注意:是远程连接后机器人的终端下(仍然在本地计算机)

2)上传文件

执行如上命令即可,等待上传结束!

注意:是本地计算机的终端下执行 ~/src 为本地计算机要传的文件 IP:~/lsg_ws/ 为机器人的文件夹路径

bash 复制代码
 scp -r ~/src ros2@192.168.28.130:~/lsg_ws/

3)下载文件

cpp 复制代码
scp -r ros2ur@192.168.33.189:/home/ros2ur/ros2_ws/map/nav.pgm ./map

从机器人ros2ur上的/home/ros2ur/ros2_ws/map目录下,下载地图nav.pgm到 本地的./map目录下(本地)

相关推荐
悠哉悠哉愿意3 天前
【智能系统项目开发与学习记录】bringup功能包详解
学习·机器人·ros2
悠哉悠哉愿意8 天前
【ROS2学习笔记】URDF 机器人建模
笔记·学习·机器人·ros2
悠哉悠哉愿意9 天前
【ROS2学习笔记】 TF 坐标系
笔记·学习·ros2
悠哉悠哉愿意9 天前
【ROS2学习笔记】RViz 三维可视化
笔记·学习·机器人·ros2
悠哉悠哉愿意9 天前
【ROS2学习笔记】分布式通信
笔记·学习·ros2
悠哉悠哉愿意10 天前
【ROS2学习笔记】rqt 模块化可视化工具
笔记·学习·机器人·ros2
悠哉悠哉愿意10 天前
【ROS2学习笔记】Gazebo 仿真与 XACRO 模型
笔记·学习·机器人·ros2
悠哉悠哉愿意10 天前
【ROS2学习笔记】节点篇:ROS 2编程基础
笔记·学习·ros2
悠哉悠哉愿意11 天前
【ROS2学习笔记】话题通信篇:话题通信项目实践——系统状态监测与可视化工具
笔记·学习·ros2
悠哉悠哉愿意11 天前
【ROS2学习笔记】话题通信篇:python话题订阅与发布
笔记·学习·ros2