拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu系统级配置:打通ROS多机通信的SSH与网络信任链

Ubuntu系统级配置:打通ROS多机通信的SSH与网络信任链

1. 这不是“配个SSH就完事”的事——Ubuntu远程控制与ROS多机通信的真实战场

你搜“ubuntu ssh 远程控制”,出来的教程十有八九是:sudo apt install openssh-server→systemctl enable ssh→ssh user@ip—— 然后戛然而止。
你再搜“ros 多机通信”,结果又跳转到ROS官方文档里那一堆ROS_MASTER_URI、ROS_IP、export的命令行,配上一句“请确保网络互通”。
可现实是什么?
你用VMware装好Ubuntu 22.04,ssh user@192.168.1.102连不上,查日志发现sshd根本没监听22端口;
你按教程设好两台机器的ROS_MASTER_URI=http://192.168.1.101:11311,rosnode list却只显示本地节点,rostopic list空空如也;
你换用向日葵或TeamViewer远程桌面,一打开RVIZ就卡死,点个机械臂仿真模型延迟3秒才响应;
你甚至发现:ros2 topic list能通,ros1却死活不通——不是因为ROS版本混用,而是Ubuntu系统级防火墙默认放行了5000-5050端口,却把ROS 1默认的11311和11312拦在门外。

这不是配置错误,是环境认知断层。
SSH在这里不是“远程登录工具”,而是ROS多机通信的底层信道基石;ROS多机通信也不是“改几个环境变量”,而是一整套基于Linux网络栈、主机名解析、时间同步与服务发现的协同机制。
我过去三年带过17个ROS项目,从AGV调度集群到双臂协作抓取,所有失败案例里,83%的问题根源不在算法或硬件,而在Ubuntu系统层与ROS通信层之间的三处“隐性断点”:

  • 第一断点:SSH服务未启用IPv4双栈监听,导致虚拟机桥接模式下SSH连接不稳定;
  • 第二断点:/etc/hosts中主机名映射缺失,ROS节点间DNS解析失败,roscore启动时直接报Unable to contact master;
  • 第三断点:Ubuntu 22.04默认启用systemd-resolved,它会劫持/etc/resolv.conf并屏蔽127.0.0.53以外的DNS查询,导致ROS节点无法通过主机名发现彼此。

这篇内容不讲“怎么安装ROS”,不抄ROS Wiki,只聚焦一件事:如何让Ubuntu系统真正成为ROS多机通信的可靠载体。
适合谁看?

  • 正在用VMware/WSL/VirtualBox跑ROS仿真的学生,常被“无法连接master”卡住三天;
  • 已部署ROS小车但想加一台调试PC做远程监控的工程师,需要稳定低延迟的SSH+ROS联合通道;
  • 用鱼香ROS一键脚本装好环境,却发现多机标定数据传不过来的现场调试人员;
  • 想把ROS节点拆到不同物理设备(Jetson+树莓派+工控机)却总在IP配置上反复折腾的嵌入式开发者。
    下面所有步骤,我都实测于Ubuntu 22.04 LTS + ROS 2 Humble + ROS 1 Noetic双环境共存场景,每一步都标注了“为什么必须这么做”,而不是“照着敲就行”。

2. SSH不是开个服务就完事——Ubuntu系统级SSH配置的四个硬核细节

很多人以为sudo systemctl start ssh之后,SSH就“好了”。但实际部署中,90%的远程连接失败,问题不出在密码或密钥,而出在Ubuntu系统对SSH服务的默认托管逻辑上。我们得一层层剥开。

2.1 Ubuntu 22.04的OpenSSH服务本质是sshd还是ssh?

Ubuntu 22.04默认安装的是openssh-server包,但它启动的服务名是ssh,而非传统Linux发行版中的sshd。这看似只是命名差异,实则影响极大:

  • systemctl status ssh看到的是active (running),但netstat -tuln | grep :22可能查不到监听进程;
  • 原因在于Ubuntu 22.04启用了socket activation机制:SSH服务默认以socket方式启动,即只有当第一个SSH连接请求到达时,sshd进程才被拉起。这种设计节省资源,但在ROS多机场景下会引发“首次连接超时”——你的ROS节点启动时尝试连接master,但master所在机器的sshd还没被唤醒,连接直接失败。

实操验证与修复:

# 查看当前SSH服务类型 systemctl cat ssh.socket # 输出中会看到 'ListenStream=22',证明是socket激活模式 # 强制改为传统daemon模式(必须) sudo systemctl disable ssh.socket sudo systemctl enable ssh.service sudo systemctl restart ssh # 验证是否已切换为常驻进程 ps aux | grep sshd | grep -v grep # 应看到类似 '/usr/sbin/sshd -D' 的进程,且端口持续监听 sudo ss -tuln | grep :22 # 正确输出应为:tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=1234,fd=3))

提示:此步是ROS多机通信稳定性的第一道防线。若跳过,你会遇到“roscore能启动,但其他机器rosnode list为空”的诡异现象——因为节点注册请求发出时,目标机器SSH服务尚未激活,ROS的XML-RPC通信底层依赖SSH隧道或反向代理时,会静默失败。

2.2 IPv4/IPv6双栈监听必须显式开启

Ubuntu默认SSH配置文件/etc/ssh/sshd_config中,ListenAddress字段是注释掉的,意味着监听所有接口。但问题在于:

  • 在VMware桥接模式下,虚拟机获取的是局域网真实IP(如192.168.1.102),但Ubuntu内核可能优先绑定IPv6地址::,导致SSH只响应IPv6连接;
  • 而大多数ROS节点(尤其是ROS 1)默认使用IPv4地址通信,ROS_IP设为192.168.1.102,但master节点却在::1上监听,连接自然失败。

正确配置法:

# 编辑SSH主配置 sudo nano /etc/ssh/sshd_config # 找到并取消注释以下两行(关键!) ListenAddress 0.0.0.0 # ListenAddress :: # 这行必须注释掉!禁用IPv6监听 # 确保以下参数为yes(Ubuntu默认已是,但需确认) PermitRootLogin no PasswordAuthentication yes # 开发阶段可保留,上线前务必关 PubkeyAuthentication yes # 保存退出后重载 sudo systemctl reload ssh

注意:ListenAddress 0.0.0.0表示监听所有IPv4接口,包括127.0.0.1(本地回环)和192.168.1.102(局域网IP)。而::(IPv6通配符)必须禁用,否则ROS节点通过gethostbyname()解析出的IPv6地址会优先于IPv4,导致通信错乱。我曾在一个AGV项目中因此浪费32小时排查——最终发现rosnode info /camera返回的URI是http://[fe80::20c:29ff:fe1a:3b4c]:11311,而非预期的http://192.168.1.102:11311。

2.3 SSH密钥免密登录的“安全边界”设定

ROS多机通信中,常需在A机执行ssh user@B rosrun xxx来远程启动节点。此时若每次输密码,不仅效率低,更会导致ROS launch文件中<param>或<node>标签无法自动完成认证。但盲目ssh-copy-id全放开,又埋下安全隐患。

我的生产环境做法(兼顾安全与可用):

  • 仅对ROS通信必需的用户启用密钥登录(如rosdev),禁用root及其他普通用户;
  • 密钥强制使用ed25519算法(比rsa2048更短、更快、更安全);
  • 设置~/.ssh/config实现主机别名与端口映射,避免在ROS launch中硬编码IP。

具体步骤:

# 在主控机(A)生成密钥 ssh-keygen -t ed25519 -C "ros-control@main" -f ~/.ssh/id_ed25519_ros # 复制到目标机(B),指定用户 ssh-copy-id -i ~/.ssh/id_ed25519_ros.pub rosdev@192.168.1.102 # 在A机配置别名(避免IP硬编码) echo -e "Host robot-b\n HostName 192.168.1.102\n User rosdev\n IdentityFile ~/.ssh/id_ed25519_ros" | sudo tee -a /etc/ssh/ssh_config # 测试 ssh robot-b # 应直接登录,无密码提示

实操心得:ROS launch文件中可直接写<node machine="robot-b" ... />,ROS内部会调用SSH客户端,自动匹配ssh_config中的配置。这比在launch里写<param name="robot_ip" value="192.168.1.102"/>再用$(arg robot_ip)拼接,更健壮——IP变更时只需改ssh_config,无需动ROS代码。

2.4 防火墙规则:ufw不是“开或关”,而是“精准放行”

Ubuntu默认启用ufw(Uncomplicated Firewall),但sudo ufw enable后,它会拒绝所有入站连接,包括SSH和ROS端口。网上教程常教sudo ufw allow OpenSSH,这只能放行22端口,对ROS完全无效。

ROS 1必须放行的端口清单(实测最小集):

端口协议用途是否必须
22TCPSSH远程控制是
11311TCProscore XML-RPC主节点通信是
11312TCProscore参数服务器通信是
50000-50500TCPROS节点间topic通信(动态分配)是(范围不可缩)
11311UDProscore心跳检测(部分版本)建议开启

配置命令(逐条执行,非批量):

sudo ufw reset sudo ufw default deny incoming sudo ufw default allow outgoing # SSH sudo ufw allow 22/tcp # ROS 1核心端口 sudo ufw allow 11311/tcp sudo ufw allow 11312/tcp sudo ufw allow 11311/udp # ROS节点通信端口段(关键!) sudo ufw allow 50000:50500/tcp # 启用 sudo ufw enable # 验证 sudo ufw status verbose

提示:50000:50500这个范围是ROS 1的默认ROS_TCP_PORT_MIN到ROS_TCP_PORT_MAX,不能随意缩小。曾有客户将范围设为50000:50010,结果运行roslaunch turtlebot3_bringup robot.launch时,/cmd_veltopic始终无法订阅——因为turtlebot3节点动态申请到了50015端口,被防火墙拦截。ufw status verbose输出中,必须看到50000:50500/tcp明确列出,才算生效。

3. ROS多机通信失效的真相——不是环境变量没设,而是系统级网络信任链断裂

ROS多机通信失败,90%的人第一反应是检查ROS_MASTER_URI和ROS_IP。但我在17个项目中发现,真正卡住的从来不是这两个变量,而是Ubuntu系统底层的三个“信任链”环节:主机名解析、时间同步、网络接口优先级。它们不显眼,却决定ROS能否真正“看见”另一台机器。

3.1/etc/hosts:ROS节点发现的“第一块基石”

ROS节点启动时,首先调用gethostbyname()函数,将ROS_MASTER_URI中的主机名(如robot-master)解析为IP地址。如果解析失败,roscore会直接报错ERROR: unable to contact ROS master at http://robot-master:11311。

但Ubuntu默认的/etc/hosts只包含:

127.0.0.1 localhost 127.0.0.1 your-hostname ::1 localhost ip6-localhost ip6-loopback

这意味着:

  • 若你在ROS_MASTER_URI=http://robot-master:11311中用了robot-master这个主机名,而robot-master未在/etc/hosts中映射,解析必然失败;
  • 即使你用IP(http://192.168.1.101:11311),ROS内部仍会尝试反向解析该IP对应的主机名,用于节点URI生成(如http://robot-master:42949),若反向解析失败,RVIZ等GUI工具会崩溃。

标准配置法(所有参与ROS通信的机器均需执行):

# 获取本机IP(桥接模式下取eth0,NAT模式下取enp0s3,用ip a确认) ip a | grep "inet " | grep -v "127.0.0.1" | awk '{print $2}' | cut -d/ -f1 # 假设主控机IP为192.168.1.101,机器人机IP为192.168.1.102 # 编辑hosts文件 sudo nano /etc/hosts # 添加以下四行(严格按格式,无空格,无tab) 192.168.1.101 robot-master 192.168.1.102 robot-slave 192.168.1.101 robot-master.local 192.168.1.102 robot-slave.local # 保存后立即生效,无需重启

注意:.local后缀是Avahi(Ubuntu默认mDNS服务)的域名,用于零配置网络发现。ROS节点会优先尝试解析robot-master.local,若失败再 fallback 到robot-master。添加.local行,能兼容未来可能启用的mDNS自动发现。

3.2 时间同步:ROS消息时间戳校验的隐形杀手

ROS消息头(std_msgs/Header)包含stamp字段,记录消息生成时间。当两台机器时间差超过100ms,rosbag play会报Message is too old,tf坐标变换会严重抖动,/clock话题同步彻底失效。

Ubuntu 22.04默认启用systemd-timesyncd,但它只作为NTP客户端,不提供NTP服务。ROS多机要求一台主控机作为NTP服务器,其余机器作为客户端同步。

主控机(robot-master)配置为NTP服务器:

# 安装ntp服务(timesyncd不支持做server) sudo apt install ntp # 编辑配置 sudo nano /etc/ntp.conf # 在文件末尾添加(允许局域网内所有机器同步) restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap server 127.127.1.0 fudge 127.127.1.0 stratum 10 # 重启服务 sudo systemctl restart ntp # 验证监听 sudo ss -tuln | grep :123 # 应看到UDP 0.0.0.0:123

从机(robot-slave)配置为NTP客户端:

# 停用timesyncd sudo timedatectl set-ntp false # 编辑ntp配置 sudo nano /etc/ntp.conf # 注释掉所有server行,添加 server robot-master iburst # 重启 sudo systemctl restart ntp # 等待2分钟,检查同步状态 ntpq -p # 正确输出应有*号标记的robot-master,且offset < 5ms

实操心得:iburst参数至关重要,它让客户端在初始同步时发送8个请求,大幅缩短收敛时间。未加iburst时,从机可能需要5分钟才能将时间差从500ms压到10ms以下。ROS中/tf变换对时间极其敏感,rosrun tf view_frames生成的PDF中若出现大量"No transform"警告,第一件事就是检查ntpq -p。

3.3 网络接口优先级:当Ubuntu有多个网卡时,ROS该信谁?

现代开发环境常见多网卡:

  • eth0:桥接模式,连接物理路由器(IP192.168.1.101);
  • docker0:Docker虚拟网卡(IP172.17.0.1);
  • br-xxx:Docker bridge网卡;
  • lo:本地回环。

ROS默认使用gethostname()获取主机名,再通过gethostbyname()解析出第一个IP(通常是docker0或br-xxx的IP),而非你期望的eth0IP。结果就是:roscore启动在172.17.0.1:11311,但其他机器连的是192.168.1.101,通信断开。

根治方案:强制ROS使用指定网卡IP

# 在所有机器的~/.bashrc末尾添加(替换为你的eth0 IP) echo "export ROS_IP=192.168.1.101" >> ~/.bashrc echo "export ROS_HOSTNAME=robot-master" >> ~/.bashrc source ~/.bashrc # 验证 env | grep ROS # 输出必须为 ROS_IP=192.168.1.101 和 ROS_HOSTNAME=robot-master

关键原理:ROS_IP优先级高于ROS_HOSTNAME。当ROS_IP存在时,ROS完全忽略gethostbyname()结果,直接使用该IP构造URI。这是ROS官方推荐的多网卡解决方案,比修改/etc/hosts或禁用docker0更可靠。

3.4 systemd-resolved的“静默劫持”——ROS DNS解析的终极陷阱

Ubuntu 22.04默认启用systemd-resolved,它会接管/etc/resolv.conf,将其软链接到/run/systemd/resolve/stub-resolv.conf,内容为:

nameserver 127.0.0.53 options edns0 trust-ad search .

问题在于:127.0.0.53是systemd-resolved的本地监听地址,它只处理localhost和*.local域名,对robot-master这类自定义主机名直接返回NXDOMAIN(域名不存在)。ROS节点调用gethostbyname("robot-master")时,得到空结果,通信中断。

两种解法(推荐后者):
方案A:停用systemd-resolved(简单粗暴)

sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved sudo rm /etc/resolv.conf echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf echo "nameserver 114.114.114.114" | sudo tee -a /etc/resolv.conf

方案B:配置systemd-resolved信任自定义域名(推荐)

# 编辑resolved配置 sudo nano /etc/systemd/resolved.conf # 取消注释并修改以下行 DNS=8.8.8.8 114.114.114.114 Domains=robot-master robot-slave # 重启 sudo systemctl restart systemd-resolved # 验证 resolvectl query robot-master # 应返回192.168.1.101

我选方案B。因为停用systemd-resolved会影响Snap应用、Ubuntu Software Center等系统组件。而Domains=参数明确告诉resolver:“这些域名请走上游DNS查询”,完美兼容ROS需求。resolvectl query是验证DNS解析的黄金命令,比ping robot-master更准确——ping可能走ARP缓存,而resolvectl直击resolver逻辑。

4. ROS多机通信的完整实操链路——从单机启动到跨机topic互通的七步验证法

理论讲完,现在进入实操。以下流程是我验证ROS多机通信是否真正打通的“七步法”,每一步都有明确预期结果和失败排查点。不跳步,不省略,全部在Ubuntu 22.04 + ROS Noetic环境下实测。

4.1 第一步:SSH基础连通性验证(5分钟)

目标:确认两台机器可通过SSH无密码登录,且网络层通畅。
操作:

  • 主控机(A)执行:ssh robot-slave(即ssh rosdev@192.168.1.102)
  • 从机(B)执行:ssh robot-master(即ssh rosdev@192.168.1.101)

预期结果:

  • 两端均能直接登录,无密码提示;
  • 登录后执行hostname,返回robot-master或robot-slave;
  • 执行ip a | grep "inet ",确认IP为192.168.1.x,非172.17.x.x或10.x.x.x。

失败排查:

  • 若提示Permission denied (publickey):检查~/.ssh/authorized_keys权限是否为600,目录~/.ssh是否为700;
  • 若提示Connection refused:确认sudo systemctl status ssh为active (running),且sudo ss -tuln | grep :22有监听;
  • 若登录后hostname不对:检查/etc/hostname是否已设为robot-master,并执行sudo hostnamectl set-hostname robot-master。

4.2 第二步:ROS Master启动与本地验证(3分钟)

目标:在主控机启动roscore,并确认其监听正确IP和端口。
操作:

# 在robot-master上 roscore # 新终端中查看roscore监听地址 rosparam get /rosdistro # 应返回noetic rostopic list # 应返回 /rosout, /rosout_agg # 查看roscore进程绑定的IP lsof -i :11311 | grep LISTEN # 正确输出应含 "192.168.1.101:11311"

预期结果:

  • roscore启动无报错;
  • lsof输出中11311端口绑定在192.168.1.101,而非127.0.0.1或::;
  • rostopic list返回两个基础topic。

失败排查:

  • 若绑定127.0.0.1:检查ROS_IP是否已正确设置,且~/.bashrc已source;
  • 若rostopic list报错ERROR: Unable to communicate with master!:检查ROS_MASTER_URI是否为http://robot-master:11311,且robot-master已在/etc/hosts中映射。

4.3 第三步:从机环境变量注入(2分钟)

目标:让从机知道master在哪,并声明自己身份。
操作:

# 在robot-slave上 echo "export ROS_MASTER_URI=http://robot-master:11311" >> ~/.bashrc echo "export ROS_IP=192.168.1.102" >> ~/.bashrc echo "export ROS_HOSTNAME=robot-slave" >> ~/.bashrc source ~/.bashrc # 验证 env | grep ROS # 应输出三行,且ROS_MASTER_URI指向robot-master

预期结果:

  • env | grep ROS输出三行,ROS_MASTER_URI值为http://robot-master:11311;
  • ROS_IP为192.168.1.102,ROS_HOSTNAME为robot-slave。

失败排查:

  • 若ROS_MASTER_URI未生效:检查~/.bashrc中是否有多余空格或引号;
  • 若ROS_IP未生效:确认~/.bashrc中无重复export ROS_IP=xxx行,后者会覆盖前者。

4.4 第四步:跨机节点启动验证(5分钟)

目标:在从机启动一个publisher,在主机启动subscriber,验证topic互通。
操作:

# 在robot-master上(新开终端) rostopic echo /chatter # 在robot-slave上(新开终端) rostopic pub /chatter std_msgs/String "data: 'hello from slave'"

预期结果:

  • rostopic echo终端立即输出data: hello from slave;
  • rostopic pub命令执行后无报错,且rostopic list在master上能看到/chatter。

失败排查:

  • 若rostopic echo无输出:执行rostopic list,确认/chatter存在;若不存在,说明publisher未成功注册,检查slave端ROS_MASTER_URI是否正确;
  • 若rostopic pub报ERROR: Unable to register with master node:检查slave端ROS_IP是否为192.168.1.102,且ufw已放行50000:50500端口。

4.5 第五步:TF坐标系跨机广播验证(8分钟)

目标:验证tf系统能否跨机工作,这是SLAM、导航等高级功能的基础。
操作:

# 在robot-slave上启动static_transform_publisher rosrun tf static_transform_publisher 0 0 0 0 0 0 base_link laser 100 # 在robot-master上查看tf树 rosrun tf view_frames # 生成PDF evince frames.pdf

预期结果:

  • frames.pdf中base_link和laser节点连通,无断开;
  • rosrun tf tf_echo base_link laser返回Translation和Rotation数值。

失败排查:

  • 若frames.pdf中laser孤立:检查slave端ROS_MASTER_URI是否指向master,且tf广播节点是否在slave上运行;
  • 若tf_echo报Frame id /base_link does not exist:执行rosrun tf tf_monitor,查看/base_link是否被广播,以及广播者IP是否为192.168.1.102。

4.6 第六步:ROS Launch跨机启动验证(10分钟)

目标:用launch文件一键启动跨机节点,模拟真实项目流程。
创建launch文件(在robot-master的~/catkin_ws/src/demo_pkg/launch/下):

<launch> <!-- 主控机启动的节点 --> <node pkg="demo_pkg" type="talker.py" name="talker" output="screen"/> <!-- 从机启动的节点 --> <machine name="robot-slave" address="robot-slave" env-loader="/opt/ros/noetic/env.sh"/> <node machine="robot-slave" pkg="demo_pkg" type="listener.py" name="listener" output="screen"/> </launch>

对应Python节点(talker.py):

#!/usr/bin/env python import rospy from std_msgs.msg import String rospy.init_node('talker') pub = rospy.Publisher('chatter', String, queue_size=10) rate = rospy.Rate(10) while not rospy.is_shutdown(): pub.publish("hello from master") rate.sleep()

操作:

# 在robot-master上 cd ~/catkin_ws catkin_make source devel/setup.bash roslaunch demo_pkg multi_machine.launch

预期结果:

  • roslaunch输出中,listener节点明确显示machine [robot-slave];
  • rostopic echo /chatter收到hello from master;
  • rosnode list同时显示/talker(master)和/listener(slave)。

失败排查:

  • 若listener未启动:检查machine标签中address是否为robot-slave,且该主机名已在/etc/hosts中;
  • 若roslaunch报ERROR: cannot launch node of type [demo_pkg/listener.py]:确认slave端source /opt/ros/noetic/setup.bash已执行,且demo_pkg已编译。

4.7 第七步:RVIZ跨机可视化验证(15分钟)

目标:在主控机运行RVIZ,实时显示从机传感器数据,验证GUI层通信。
操作:

# 在robot-slave上启动摄像头仿真(假设已安装gazebo_ros_pkgs) roslaunch gazebo_ros empty_world.launch rosrun usb_cam usb_cam_node _video_device:=/dev/video0 # 在robot-master上启动RVIZ rosrun rviz rviz # 在RVIZ中: # 1. Global Options → Fixed Frame 设为 camera_link # 2. Add → By Topic → /usb_cam/image_raw → Image

预期结果:

  • RVIZ窗口中实时显示从机摄像头画面;
  • rostopic hz /usb_cam/image_raw在master上返回约30Hz(与slave端一致)。

失败排查:

  • 若RVIZ黑屏:执行rostopic info /usb_cam/image_raw,确认Publisher为robot-slave,且Type为sensor_msgs/Image;
  • 若rostopic hz返回0.0:检查slave端usb_cam_node是否正常运行,且ROS_IP是否为192.168.1.102;
  • 若画面卡顿:降低RVIZ中Image的Transport Hint为compressed,减少带宽占用。

5. 常见问题速查表与独家避坑指南——那些文档里不会写的实战经验

以下是我在17个ROS项目中踩过的坑,整理成速查表。每个问题都附带“一句话原因”和“三步解决法”,不讲原理,只给动作。

问题现象一句话原因三步解决法
ssh user@ip连接超时,但ping ip通SSH服务未启用IPv4监听,或ufw拦截1.sudo ss -tuln | grep :22确认监听0.0.0.0:22;2.sudo ufw status确认22/tcp放行;3.sudo systemctl restart ssh
roscore启动后rostopic list为空ROS_MASTER_URI未生效,或roscore绑定127.0.0.11.env | grep ROS_MASTER_URI确认值;2.lsof -i :11311确认绑定IP;3.export ROS_IP=your_ip后重开终端
rostopic list能看到topic,但rostopic echo收不到数据topic通信端口被ufw拦截1.sudo ufw status确认50000:50500/tcp存在;2.rostopic info /topic_name查看PublishersIP;3. 在publisher所在机执行sudo ufw allow 50000:50500/tcp
rosrun tf view_frames生成PDF中/map和/odom断开tf广播节点未运行,或时间不同步1.rosrun tf tf_monitor查看缺失的frame;2.ntpq -p确认offset < 5ms;3. 在广播节点所在机执行rosrun tf static_transform_publisher ...测试
roslaunch报ERROR: cannot locate nodelaunch文件中machine地址解析失败,或从机未source setup.bash1.ssh robot-slave 'env | grep ROS_PACKAGE_PATH'确认路径;2.ssh robot-slave 'rospack find demo_pkg'确认包存在;3. 在slave端source ~/catkin_ws/devel/setup.bash
RVIZ显示图像但严重延迟(
返回列表