news 2026/10/7 9:04:45

ROS2核心通信机制与实战:从安装到导航多机通信全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ROS2核心通信机制与实战:从安装到导航多机通信全解析

先聊个实在的。很多人一上来就搜“ROS2无非就是这点东西”,我特别能理解这种心态——学了三个月还在装环境、跑demo、看报错,很容易怀疑自己是不是走错了方向。但我可以负责任地说,ROS2的核心东西就那么几样:节点、话题、服务、动作、参数,外加一套把你从“写代码”送到“跑机器人”的工具链。你把这几样吃透,后面再接触导航、机械臂、无人机、SLAM,都是在同一个地基上盖不同的楼。这篇文章我就按“超细版”的标准,把安装、核心通信机制、常用工具、仿真导航、多机通信和典型报错一次讲透,适合刚装完ROS2但不知道下一步干什么的新手,也适合已经被ros2话题、服务、动作折腾过但总感觉缺一张全景图的人。

1. 先把ROS2的“骨架”认清:节点、DDS和“无非就是”的自信从哪来

1.1 ROS1到ROS2,到底变了什么

我见过太多人用ROS1的思路去套ROS2,结果处处碰壁。ROS1时代,整个系统靠一个中央节点roscore管理,所有节点都围着它转,相当于几十个人打电话都要经过同一个总机。总机挂了,全瘫。ROS2把这张网拆了——没有中心节点,节点之间点对点通信,底层换成DDS(数据分发服务)。换成DDS之后,通信的可靠性、跨平台能力、多机协同都上了一个台阶,这也直接决定了后面你写代码、配置网络、排查问题时的思维模式。

还有一个细节很多人会忽略:ROS1里大家默认用Ubuntu 18.04配ROS Melodic,ROS2的版本选择和Ubuntu版本强绑定。你的Linux发行版直接决定你能装哪个ROS2版本,比如Ubuntu 22.04对应ROS2 Humble,Ubuntu 24.04对应ROS2 Jazzy。选错了版本,后面所有教程都对不上。这一点在搜“ros2版本”“ubuntu 22.04安装ros2”这类关键词的时候要格外注意。

1.2 DDS不玄乎,它就是“机器人的消息总线”

DDS这个概念听起来高深,实际可以打个比方:它就像一个大型会议室里的广播系统。你不需要知道坐在角落那个人是谁,只要你俩在同一频道,对着麦克风说一句话,对方就能听到。ROS2里每个节点既可以是“说话的人”(发布者),也可以是“听广播的人”(订阅者),而这个“频道”就是话题(Topic)。

DDS的好处在于,节点之间不用互相认识,发布者不知道订阅者存在,订阅者也不需要关心数据从哪来。这种解耦设计让系统扩展变得非常轻松,加一个新传感器节点,不用改动现有节点。代价就是,一旦出现网络问题、防火墙拦截、或者两台机器的ROS_DOMAIN_ID不一致,你找问题的时候会比ROS1多绕几个弯。这也是为什么“net模式与端口转发ros2”会成为搜索热词——后面我在多机通信那一节会专门细说。

1.3 版本怎么选:Humble、Jazzy还是Foxy

很多新手对着ros2版本列表发懵:Foxy、Galactic、Humble、Iron、Jazzy……到底选哪个。我的建议很简单:优先用你当前系统能装的最新LTS长期支持版。

Ubuntu版本对应ROS2版本支持性质适合场景
20.04FoxyLTS,接近维护尾声老项目兼容
22.04HumbleLTS,当前主力之一新手首选,教程最全
24.04JazzyLTS,新硬件支持好新设备、新项目
非LTS系列滚动版快速迭代探索尝鲜,不建议做项目

我个人最推荐的是Ubuntu 22.04 + Humble。因为社区教程量最大,遇到问题搜得到答案,第三方包也基本都有对Humble的预编译版本。你现在搜“ros2菜鸟教程”,十个里有八个是Humble环境下写的。新版本固然香,但生态没跟上之前,学习成本会高不少。

2. 从零装一个能用的ROS2:Ubuntu 22.04 + Humble 超细流程

2.1 装之前先想清楚三件事

安装ROS2之前,先把三件事确认好,否则后面会卡到怀疑人生。

第一,系统版本。一定要先跑lsb_release -a确认你的Ubuntu版本是22.04,如果用24.04硬装Humble,依赖会乱成一锅粥。第二,网络环境。ROS2的安装需要访问Ubuntu软件源和ROS官方源,如果你在国内,官方源的速度可能很感人,这时候需要换成国内镜像,这和你的上网工具无关,纯粹是软件源加速。第三,是否装桌面版。如果你只是做学习验证,ros-humble-desktop就够;如果做嵌入式移植,可以只装ros-humble-ros-base。新手别省这一步,直接装desktop,因为里面包含了Rviz2、demo和全套工具命令。

启动终端之后,建议先把系统更新一遍,这个动作很多人跳过,后面装依赖的时候总报版本冲突,就是因为系统源里的软件版本太旧导致依赖解析失败。

2.2 逐条执行的安装命令(含source与验证)

下面这套流程是我在Ubuntu 22.04上反复装过很多次的稳定版本,每一步都标注了作用。

# 1. 更新软件源,顺手装几个基础工具 sudo apt update sudo apt upgrade -y # 2. 安装locale相关工具并设置UTF-8编码,避免后续日志乱码 sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8 # 3. 添加ROS2软件源 sudo apt install software-properties-common curl sudo add-apt-repository universe # 4. 添加ROS2官方源和密钥,这里注意:如果报错403或证书错误,是自己网络到官方源的连通性问题 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null # 5. 更新源并安装桌面版 sudo apt update sudo apt install ros-humble-desktop -y

装完以后把环境写进bashrc,这一步特别容易被忽略:

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc

然后验证是否装成功:

ros2 --help ros2 run demo_nodes_cpp talker

如果ros2命令能找到,且talker能正常打印日志,说明安装没问题。另一个终端里再跑ros2 run demo_nodes_cpp listener,能看到两边互通,你的第一个ROS2系统就跑起来了。

2.3 顺手搞定开发环境:终端、编辑器与工作区

ROS2日常开发离不开多终端操作。我见过很多新手在同一个终端里既开talker又开listener,一开就乱。装一个支持多标签页的终端工具很重要,比如Terminator或者Tilix。你可以在标签页里分配好谁跑节点谁看日志,后续调试效率会明显改善。

然后是工作区。所谓工作区就是一个文件夹,里面放你所有的功能包。我建议用一个固定路径,比如~/ros2_ws/src,将来你的练习项目、作业、毕设全放这里。工作区本身没有任何魔法,它就是给colcon编译提供一个组织结构。可以把构建过程理解为“流水线打包”,colcon负责把各个功能包逐个编译、安装到同一个install目录里,然后你source install/setup.bash之后就能用ros2 run启动它们了。

mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src

这是你第一个ROS2项目的地基。别小看这个简单的目录结构,后面所有功能包都从这里长出来。

3. 核心四件套:话题、服务、动作、参数

3.1 话题是“广播”,服务是“一问一答”,动作是“慢慢来的承诺”

先建立整体概念。ROS2里节点之间通信有四条路,但它们各自解决的问题完全不同。

话题(Topic)是广播式的:一个节点发数据,任何感兴趣的人都能订阅。适合传感器数据流、状态刷新,比如激光雷达点云、里程计、图像。你不需要等谁回应,发了就行。

服务(Service)是请求-响应式的:客户端发一个请求,服务端处理完必须给一个应答。适合一次性的操作,比如“打开摄像头”“获取当前位置”。注意服务不适用于持续的数据流,因为每次调用都要同步等待返回,高频调用会把系统拖垮。

动作(Action)是“带反馈的异步任务”:客户端告诉机器人“去A点”,机器人立刻回一句“收到”,然后一路上不断反馈“走了一半了”“遇到障碍绕路中”,最后到达后再回一句“我到了”。导航、机械臂运动规划这种长时间任务,用的就是动作。

参数(Parameter)是节点可配置的变量:比如摄像头节点的帧率、PID控制的增益、雷达的扫描频率。运行期间你可以用ros2 param set动态修改,不用重启节点。这和ROS1的param server思路类似,但实现上更灵活。

把四者的关系整理成一张表,选型时一目了然:

通信类型方向是否阻塞典型场景底层实现
话题单向广播非阻塞传感器数据、状态流DDS DataWriter/Reader
服务请求-响应同步阻塞开关设备、查询信息DDS Request/Reply
动作多阶段反馈异步非阻塞导航、机械臂控制基于话题+服务的封装
参数读写配置同步节点运行时调参ROS2参数服务

3.2 用CLI工具验证一切:node / topic / service / action

命令行工具是ROS2给新手最好的礼物。概念背不住没关系,用命令跑一遍就全通了。装完Humble之后,自带一套完整的CLI工具,这也是排查问题的基础。

# 列出所有运行中的节点 ros2 node list # 查看某个节点的详细信息,包括订阅和发布的话题 ros2 node info /talker # 列出当前所有话题 ros2 topic list -t # 打印话题实时数据流,相当于监听话匣子里的广播内容 ros2 topic echo /chatter # 查看话题的带宽和数据频率,判断节点是否在正常工作 ros2 topic hz /chatter # 查找服务 ros2 service list # 调用服务 ros2 service call /your_service_name std_srvs/srv/SetBool "{data: true}" # 查看动作列表 ros2 action list -t

这里要说一个新手最容易踩的坑:跑ros2 topic list看不到话题,不代表节点没起来。你打开talker和listener之后,ros2 node list应该能看到这两个节点,但一执行ros2 topic list却发现只有/chatter一个话题。这是正常的——不是所有节点都有话题,有些节点只提供服务。另外,如果把talker关了,/chatter这个“频道”会消失,因为话题本质上是由发布者创建的,没有发布者就没有话题存在。

3.3 第一个功能包:从ros2 pkg create到colcon build

光会用命令行还不够,你得能自己写功能包。我见过很多教程直接丢过来一堆源码让你编译,结果根本不知道代码该怎么组织和构建。咱们从零走一遍。

cd ~/ros2_ws/src # 创建一个Python功能包,名字叫my_pkg,依赖rclpy和std_msgs ros2 pkg create my_pkg --build-type ament_python --dependencies rclpy std_msgs

创建完之后,打开my_pkg/my_pkg/my_node.py,写入下面这个最简发布器:

import rclpy from rclpy.node import Node from std_msgs.msg import String def main(): rclpy.init() node = Node("my_publisher") publisher = node.create_publisher(String, "my_topic", 10) count = 0 while rclpy.ok(): msg = String() msg.data = f"hello from my_pkg {count}" publisher.publish(msg) count += 1 rclpy.spin_once(node, timeout_sec=0.1) if __name__ == "__main__": main()

然后编辑setup.py,在entry_points里把脚本注册成可执行命令:

entry_points={ 'console_scripts': [ 'my_node = my_pkg.my_node:main', ], },

回到工作区根目录,开始构建:

cd ~/ros2_ws colcon build --symlink-install source install/setup.bash ros2 run my_pkg my_node

这里有个关键点:构建之前必须确保已经source /opt/ros/humble/setup.bash,否则你会遇到colcon: command not found,那是因为你没把colcon所在的目录加进PATH。还有一个建议是--symlink-install参数,它会让install目录里的Python文件以软链接形式指向src源码,你改代码不用重新编译,对纯Python开发效率提升非常大。

4. 让机器人“看得见”和“记得住”:Rviz2、bag与地图

4.1 Rviz2:装它是小事,会用才是关键

Rviz2是ROS2的标配可视化工具。你安装了ros-humble-desktop之后,Rviz2其实已经装好了,直接终端里输入rviz2就能打开。没装desktop的则单独执行sudo apt install ros-humble-rviz2。

打开Rviz2之后,第一件事不是瞎看,而是先在自己机器上跑一个数据源验证。开一个终端运行:

ros2 run turtlesim turtlesim_node

再开一个终端运行:

ros2 run turtlesim turtle_teleop_key

这时候你能控制小海龟动来动去。回到Rviz2,左边面板点Add,选By topic,找到/turtle1/pose话题,添加进来,就能看到小海龟的实时坐标和朝向。这一步虽然简单,但完整演示了“节点产生数据 -> 话题承载数据 -> Rviz2订阅并可视化”的链路,比直接上来就加载URDF模型容易理解得多。

等你以后做导航、SLAM,Rviz2里会添加RobotModel显示机器人3D模型,加Map显示栅格地图,加Path显示规划路径,加PointCloud2显示激光点云。原理上都是同一个套路:订阅话题,选择合理的显示类型,把数据呈现在3D场景里。

4.2 ros2 bag:录数据、回放、格式解析

机器人开发里有一项工作像记者录音一样,就是把现场数据原封不动录下来,回去慢慢分析。ros2 bag就是ROS2官方的“录音笔”。

# 录制所有话题 ros2 bag record -a -o my_bag # 查看包信息,包括时长、话题数量和每条话题的消息数 ros2 bag info my_bag # 回放数据包,相当于重新演一遍当时的数据流 ros2 bag play my_bag

很多人不知道,bag记录的格式现在默认是SQLite3数据库文件加metadata.yaml。也就是说,录制下来的不是一个简单的文本,而是一个数据库目录。这样做的好处是检索效率高,你按话题、按时间戳查询数据会非常快。如果你需要精确定位某个时刻的传感器状态,可以带上--topics /scan这样的参数只录特定话题,或者用ros2 bag play --start-offset 5 my_bag跳过前5秒再播放。

我实际使用中的习惯是:每次跑真实机器人之前,先开一路bag记录,跑完再整体回放一遍做问题复盘。很多偶发性的“跑着跑着突然报错”,靠现场盯日志根本盯不过来,录下来慢慢看就能找到规律。

4.3 八叉树地图导航:OctoMap到底解决什么问题

地图建模是机器人自主导航的前置工作。二维平面用栅格地图就够,但无人机、机械臂、三维避障场景需要的是三维地图。三维空间如果也用均匀小格子划分,内存消耗会爆炸——想象一个100米乘100米乘20米的区域,用5厘米分辨率栅格表示,格子数量是以十亿计的。八叉树就是来救场的。

八叉树(OctoMap)的思路很直接:一个大立方体如果有内容,就把它均匀切成8个小立方体;哪个小立方体有内容,再继续切下去;空白区域直接不切不存。这样空旷地面占用的节点数量极少,而墙壁、障碍物附近因为要表达细节才多切几层。你要搜“ros2八叉树地图导航”,核心要掌握的就是octomap_server这个节点,它接收点云数据,转换成八叉树地图,并以octomap_msgs/Octomap消息发布,还能直接输出到Rviz2里显示。

运行流程大致是:

# 安装八叉树服务器 sudo apt install ros-humble-octomap-server # 启动点云到八叉树转换节点 ros2 run octomap_server octomap_server_node --ros-args -p frame_id:="map" -p resolution:=0.05

然后让激光雷达或深度相机数据进入系统,你就能在Rviz2里看到实时构建的三维栅格模型。这个工具在无人机、无人车、机械臂的动态避障里用得非常多,和单纯2D的costmap完全是两个维度的问题。

5. 更进一步:仿真、导航与多机通信的真实形态

5.1 Gazebo+UR5:机械臂仿真里最容易踩的坑

搜“ros2 ur5”的人基本都在做机械臂相关项目。UR5是优傲公司的协作机械臂,在ROS2生态中一般用ur_description和ur_robot_driver配合仿真。常见组合是Gazebo仿真环境 + MoveIt运动规划 + Rviz2可视化。

在Gazebo里加载UR5的第一个坑是STL模型文件路径缺失。一定要在启动文件里明确传入urdf文件路径,而且所有mesh资源要用package://协议相对引用,否则Gazebo打开直接白屏或提示找不到模型。第二个坑是控制器配置:Gazebo里的机械臂要用ros2_control来驱动每个关节,你得在URDF里写<ros2_control>标签,配置joint_state_broadcaster和joint_trajectory_controller两个插件,否则关节完全不动。

我建议新手不要一上来就自己写URDF,先跑通官方ur_simulation_gazebo这个包,再把里面的控制器配置逐行看明白,理解关节名字、控制接口、cmd_vel话题是怎么串起来的。这部分涉及的坐标系、TF树如果不搞清楚,哪怕仿真跑起来了,一换真实机械臂照样会撞。

5.2 Nav2与路径规划:别被“导航”两个字吓住

导航是ROS2里看起来最玄乎、其实是套路最固定的一块。Nav2栈做的事情可以拆成四件事:定位(AMCL或SLAM)、代价地图生成、全局路径规划、局部路径控制。你搜“ros2路径规划”搜到的东西,八成都在讲这几个包的配置。

启动Nav2之前,必须准备好三样东西:一张静态地图、机器人URDF、正确的TF树。静态地图可以通过SLAM工具建好保存,也可以用现成的pgm图片改参数。TF树则是连接base_link、map、odom这些坐标系的关键,TF断掉,导航直接罢工。

常见的模式是:

# 启动地图服务器,提供静态地图 ros2 launch nav2_bringup map_server.launch.py map:=your_map.yaml # 启动AMCL,负责在地图中定位机器人 ros2 launch nav2_bringup localization_launch.py # 启动完整的Nav2导航栈 ros2 launch nav2_bringup navigation_launch.py

全部起来之后,你可以用Rviz2的“2D Goal Pose”工具在地图上指定终点,机器人就会规划路径并朝目标运动。新手最容易栽跟头的地方不是规划器参数,而是机器人底盘根本没发布正确的里程计,Nav2一看速度反馈为零,就算有规划也不敢走。所以做导航之前,先单独跑一下ros2 topic echo /odom,确认odom话题有数据、频率稳定,再往下走。

5.3 多机通信的DDS网络配置:ROS_DOMAIN_ID和端口转发

“net模式与端口转发ros2”这个关键词背后其实是一类真实工程问题:两台机器怎么组成一个ROS2网络。ROS2默认使用的DDS协议基于UDP通信,节点发现和用户数据交换都依赖网络。要让两台机器互相发现节点,必须保证三件事。

第一,ROS_DOMAIN_ID一致。ROS2环境变量ROS_DOMAIN_ID相当于网络分区编号,默认是0。A机用0,B机用1,那俩节点即便在同一个局域网也互相看不见。必须两端都设置成同一个值:

echo "export ROS_DOMAIN_ID=42" >> ~/.bashrc source ~/.bashrc

第二,能够多播通信。DDS默认使用UDP多播地址239.255.0.1:7402进行节点发现。如果网络环境禁用了多播,或者两台机器不在同一个网段,节点就发现不了。解决办法是把两台机器放到同一个VLAN下,或者通过路由器配置单播地址映射。

第三,防火墙放行UDP端口。DDS会动态分配数据端口,但固定的发现端口是7402。如果你用“net模式”配置了端口转发,至少要把UDP 7402端口转过去,否则节点列表永远是空的。

这里给一类常见的虚拟化场景做个说明:如果你把ROS2装在虚拟机里,网络模式选NAT时,虚拟机可以上外网,但外部设备很难主动访问虚拟机内的DDS节点;选桥接模式时,虚拟机才真正像局域网里的一台独立机器。容器里跑ROS2同理,推荐使用host网络模式,省去端口映射的麻烦,节点发现失败率最低。

5.4 无人机与IMU:MAVROS的ROS2版本怎么用

搜索“mavros ros2 imu data”的人,多半是玩PX4、ArduPilot这类飞控的。MAVROS原本是ROS1时代的经典包,现在ROS2也有官方移植版,功能基本对齐。它把飞控通过MAVLink协议发送过来的数据转换成ROS2话题,其中IMU数据就是典型的传感器数据流。

实际使用中,你要读取IMU时习惯性会去找这个话题:

# 查看IMU话题数据格式 ros2 topic info /mavros/imu/data # 打印数据内容 ros2 topic echo /mavros/imu/data # 如果数据频率不对,试着查看/data_raw,确认飞控端是否正常输出

要注意一个细节:飞控的IMU话题往往有两个,一个是经过滤波的/mavros/imu/data,一个是原始数据/mavros/imu/data_raw。做姿态估计的时候用滤波后的,做传感器标定和故障诊断用原始数据。两类数据混着用的新手很多,后面就会出现姿态漂移、EKF收敛失败这类诡异问题。

无人机场景还有个和IMU绑定的概念就是机身坐标系转换。MAVROS里IMU数据默认在base_link或者imu_link坐标系下发布,如果你同时运行了视觉定位或者GPS融合,一定要检查TF树里imu_link、base_link、map之间的变换是否正常。坐标系错一位,整个EKF数据融合模型就是乱的。

6. 常见问题排查与避坑实录

6.1 安装源报错(InRelease/密钥/404)怎么处理

安装ROS2时最常见的一类报错长这样:

错误:1 http://packages.ros.org/ros2/ubuntu jammy InRelease [4,682 B]

这种报错本质是apt在获取ROS官方源时失败,可能是网络到官方源不通,也可能是密钥没导入成功。处理思路分三步:

先检查密钥文件是否存在:ls -l /usr/share/keyrings/ros-archive-keyring.gpg,如果不存在,说明前面添加密钥那步失败了,重新执行一遍。如果密钥没问题,那就是连通性问题。解决方案是把源地址改成国内镜像站,比如将packages.ros.org替换成国内可访问的镜像地址,然后sudo apt update。这一步能解决绝大多数源报错问题。

还有一类典型问题是系统里同时配置了多个ROS源,apt索引出现冲突。建议把/etc/apt/sources.list.d/下旧版本的ROS源文件删掉,只留一个当前版本对应的源。我以前吃过这个亏:一边是ROS1的源,一边是ROS2的源,apt update总是红字,最后发现是旧源文件里的组件名和当前版本不兼容。

6.2 colcon build和source的问题

编译功能包的时候最容易翻车的就是环境变量。很多新手直接在~/ros2_ws下执行colcon build,结果提示colcon: command not found。原因在于colcon不是系统命令,它是ROS2环境的一部分,必须先source /opt/ros/humble/setup.bash,把它的路径加进PATH,才能调用。

构建完成之后,另一个高频错误是ros2 run找不到自己的包。执行ros2 run my_pkg my_node时,如果提示Package 'my_pkg' not found,九成是忘了source install/setup.bash。注意:这个install目录是构建产物,不是源码目录。每次新打开终端,如果bashrc里没有自动source工作区,就必须手动执行一次。建议在bashrc里加上这样一行:

source ~/ros2_ws/install/setup.bash

还有一个细节:改完setup.py或package.xml之后,一定要重新colcon build,否则ros2 run里那个可执行入口不会更新。Python代码本身用--symlink-install可以免编译,但入口点注册表的刷新还是需要重新构建的。

6.3 节点找不到、话题空的排查思路

节点之间互相找不到,是ROS2日常开发里最烦人的问题。我把排查顺序固定成一个流程,每次照做都能定位到问题:

第一步,ros2 node list看当前系统里到底有哪些节点在跑。如果这里就看不到,说明发布对应的节点没启动或者崩溃了。第二步,如果节点在但话题查不到,用ros2 node info /节点名看这个节点的发布和订阅列表,确认话题名字是否写对。第三步,确认两个节点是否在同一个DDS域里,echo $ROS_DOMAIN_ID两边都要看一下。第四步,如果跨机器通信,检查多播和UDP 7402端口是否通。

还有一个很隐蔽的坑:ros2 daemon缓存。ROS2有个后台守护进程用来缓存节点信息,如果你频繁起停节点,有时候列表里面残留旧数据。遇到“明明节点关了还显示在列表里”或者“开了节点但列表里找不到”这种灵异事件,先重启守护进程:

ros2 daemon stop ros2 daemon start

这招能解决相当一部分“查不到节点”的假故障。

建表格把几个高频问题汇总一下:

现象可能原因排查方向
安装源update报403/InRelease网络到官方源不通换国内镜像源
colcon不是内部命令未source ROS2环境source /opt/ros/humble/setup.bash
ros2 run找不到包未source install目录在工作区根目录source install/setup.bash
跨机器节点互相看不见ROS_DOMAIN_ID不一致检查环境变量
节点死了还在列表里daemon缓存异常ros2 daemon stop/start
订阅话题但收不到数据topic名拼错ros2 node info对比名称

我自己的习惯是,每到一个新环境,先把这个排查顺序在脑子里过一遍:节点列表、话题列表、域ID、防火墙端口。这套流程救过我无数次。ROS2这个东西就是这样,概念部分不难,难的是把整个通信链路在不同环境下的表现给摸透。你现在可能是照着教程一步步来、遇到一个报错搜一个报错的状态,但只要你把节点、话题、服务、动作这四个概念吃透,再把命令行工具用熟,后面无论做导航还是机械臂,都会顺畅得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 9:03:56

运放+三极管搭建线性恒流源:原理、参数计算与Multisim仿真

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/7 9:02:53

电阻电容电感等效模型解析:寄生参数、阻抗曲线与高频设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/7 9:02:18

输出耦合电容怎么选?单电源运放低频响应与自激排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/7 9:01:57

从MVC到事务:JavaWeb个人网银系统开发与转账限额实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/7 9:01:26

全自动付费进群系统易支付版:支付回调与机器人拉人自动化搭建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/7 9:01:26

基于YOLOv5与Tello TT的无人机目标识别追踪测距实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华