news 2026/9/13 20:37:33

ROS2机器人开发指南:从环境搭建到通信机制与导航实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ROS2机器人开发指南:从环境搭建到通信机制与导航实战

搞机器人开发这几年,我最大的感受是:ROS/ROS2 已经从“选修课”变成了“必修课”。不管你是搞移动底盘、机械臂、无人车,还是做视觉抓取、多机协同,最后几乎都得回到这套机器人操作系统上来。尤其是 ROS2,它对实时性、分布式通信、多机协作的支持比 ROS1 好了太多,现在新项目基本都在往 ROS2 迁。这篇我结合自己从 ROS1 转到 ROS2 的实际经历,把核心概念、环境搭建、通信机制、工具链、常见坑一次性讲透,内容密度比较大,建议收藏后跟着实操走。

1. ROS/ROS2 到底是什么,先搞清楚它的定位

先说个容易让人误解的点:ROS 名字里带“操作系统”,但它其实不是传统意义的操作系统。它不管理内存、不调度进程、不直接驱动硬件,它更像一套运行在 Linux 之上的机器人软件开发中间件。你可以把它理解成机器人领域的“Android 系统框架”——提供通信、进程管理、硬件抽象、工具链和各种现成功能包,让你不用从零搓轮子。

ROS2 则是 ROS1 的全面重构版。为什么要有 ROS2?因为 ROS1 在设计之初是为实验室里的单个机器人准备的,它在实时性、安全性、多机器人通信、跨平台支持上都有先天缺陷。比如 ROS1 的通信全靠一个中心节点(roscore)管理,中心节点挂了整个系统就瘫了。ROS2 抛弃了这种架构,改用 DDS(Data Distribution Service,数据分发服务)作为底层通信。DDS 是一种去中心化的发布/订阅通信协议,每个节点之间直接通信,没有单点故障,而且天生支持实时传输、QoS 策略、自动发现设备。这也是为什么 ROS2 能用在自动驾驶、工业机器人这类对可靠性要求高的场景里。

1.1 ROS2 的发行版与 Ubuntu 版本如何匹配

ROS2 的发行版命名很有意思,全是用英文字母顺序排列的,而且带个动物名后缀。比如 Foxy Fitzroy、Galactic Geochelone、Humble Hawksbill、Iron Irwini、Jazzy Jalisco。版本和 Ubuntu 版本是严格绑定的,选错版本会让你在安装阶段就疯狂踩坑,所以第一步必须确认匹配关系:

ROS2 发行版对应 Ubuntu 版本支持状态
FoxyUbuntu 20.04 (Focal)已 EOL
GalacticUbuntu 20.04 (Focal)已 EOL
HumbleUbuntu 22.04 (Jammy)长期支持(推荐)
IronUbuntu 22.04 (Jammy)非长期支持
JazzyUbuntu 24.04 (Noble)长期支持(最新)

我目前主力用的是Humble + Ubuntu 22.04,这套组合最成熟,社区资料也最多,新手入门我优先推荐它。如果你用的是 Ubuntu 24.04,那就直接上 Jazzy。要注意:在 Ubuntu 22.04 上装 Jazzy,或者在 Ubuntu 24.04 上强行装 Humble,都是不可行的,依赖库冲突会很严重,处理起来相当痛苦。

1.2 为什么从 ROS1 迁移到 ROS2 是必然趋势

很多老项目还在用 ROS1(比如 Noetic),但 ROS1 在 2025 年已经正式停止维护了。从实际开发角度看,ROS2 有几个碾压级优势:

  • 去中心化通信:节点之间通过 DDS 直接通信,不依赖主节点。你这边的节点挂了一个,不影响其他节点继续收发数据。
  • 实时性支持:ROS2 支持实时内核和 QoS 策略,通信延迟可控。
  • 多机协同能力:在多台机器人之间组网非常方便,只需要配置好 DDS 的发现机制即可。
  • 跨平台:ROS2 能跑在 Windows、macOS、RTOS 上,嵌入式设备也可以通过 micro-ROS 接入。
  • 安全机制:内置 SROS2 加密认证,这在工业落地场景里很重要。

所以你现在学 ROS2 是完全正确的方向,不需要有“要不要先学 ROS1”的纠结。ROS1 里的核心概念(话题、服务、参数、节点)在 ROS2 里类似,学会了 ROS2 再回头看 ROS1 也能很快理解。

2. 环境准备与安装实操:从零跑通 ROS2 Humble

环境安装是最劝退新手的一步,但也是必须跨过去的一关。网上很多教程要么不全,要么默认你已经配好了各种依赖。这里我给出一个从零开始、亲测可用的完整流程,基于Ubuntu 22.04 桌面版 + ROS2 Humble

2.1 镜像源与系统基础配置

安装 ROS2 之前,先把系统源处理好。Ubuntu 默认源在国外,下载速度很慢,建议先换成国内镜像源(比如清华、阿里、中科大)。换源方式很简单:修改/etc/apt/sources.list文件,把archive.ubuntu.com替换成mirrors.aliyun.commirrors.tuna.tsinghua.edu.cn

然后更新系统:

sudo apt update sudo apt upgrade -y

记得把系统升级到最新再装 ROS2,否则某些依赖库版本太旧,后面编译功能包会报错。另外确认系统支持 UTF-8 编码:

locale

如果 locale 不是en_US.UTF-8zh_CN.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

2.2 添加 ROS2 软件源与安装

很多新手卡在E: Unable to locate package ros-humble-desktop这个报错上,根本原因就是没有添加 ROS2 的 apt 源。Ubuntu 默认软件源里是不带 ROS2 包的,必须先把 ROS2 的源加进去,并导入 GPG 密钥。

# 第一步:安装必要的工具 sudo apt install software-properties-common curl gnupg lsb-release -y # 第二步:添加 ROS2 的 GPG 密钥 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg # 第三步:添加 ROS2 apt 源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null # 第四步:更新源 sudo apt update

提示:如果你在curl这一步超时或者连接不稳定,可以多试几次,或者把 raw.githubusercontent.com 换成国内代理地址,但前提是保证你获取到的密钥是完整的。密钥文件大小正常应该在 3KB 左右,可以用ls -l查看。

然后安装 ROS2。这里有两个选择:

  • ros-humble-desktop:包含核心功能、可视化工具(rviz2、gazebo)、示例和教程,推荐开发使用。
  • ros-humble-base:仅包含通信库和核心功能,适合服务器或嵌入式环境。
sudo apt install ros-humble-desktop -y

如果网络状况好,这套安装包大概 2-3GB,需要一点耐心。装完以后执行source /opt/ros/humble/setup.bash,确认能正常找到 ROS2 环境。要让每次打开终端都自动加载环境,可以写入.bashrc

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

2.3 ROS1 与 ROS2 能否共存

答案是能,但需要分开加载环境。ROS1(Noetic)和 ROS2(Humble)可以装在同一台 Ubuntu 20.04/22.04 上,它们互相不冲突。关键是注意:同一终端里只能 source 一个环境,不能在同一个 shell 里同时使用两者的命令。实际开发中可以用别名来切换:

alias ros1="source /opt/ros/noetic/setup.bash" alias ros2="source /opt/ros/humble/setup.bash"

不过从我个人经验看,不建议同时维护两套环境——大部分时候 ROS2 已经完全够用,且维护两套环境会让依赖管理变得非常头疼。能迁就迁,别拖。

3. 核心实操第一课:小乌龟与通信机制

装好 ROS2 之后,第一个需要跑通的程序就是turtlesim 小乌龟。别看它简单,它是验证 ROS2 通信机制最直观的工具,新手不要跳过。

3.1 用 turtlesim 验证安装是否成功

打开终端,启动小乌龟节点:

ros2 run turtlesim turtlesim_node

这时会弹出一个蓝色背景的窗口,窗口中间有一只小乌龟。另开一个终端,启动键盘控制节点:

ros2 run turtlesim turtle_teleop_key

现在切换到第二个终端,按方向键,小乌龟就会跟着移动。这个简单的 demo 背后其实发生了两件事:turtle_teleop_key节点发布了话题/turtle1/cmd_vel(速度指令),turtlesim_node订阅了这个话题,解析到速度数据后驱动乌龟运动。

你可以用ros2 topic list查看当前所有话题,用ros2 topic echo /turtle1/cmd_vel实时监听话题上的数据。按下方向键,你会看到类似这样的数据输出:

linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0

这就是 ROS2 通信模型的基本形态。理解了这张图的逻辑,你就能理解机器人上的传感器节点(雷达、相机、IMU)如何把数据发布出去,而导航模块、可视化工具又如何订阅这些数据。

3.2 话题、服务、动作三大核心通信原语

ROS2 的通信机制不止话题(Topic)一种,还有服务(Service)和动作(Action),它们各有各的使用场景:

通信方式特点适用场景类比
话题(Topic)异步、单向、持续传输传感器数据流(图像、激光、IMU)电台广播
服务(Service)同步、请求-响应、一次性调用临时查询、开关控制打电话问客服
动作(Action)异步、可反馈、可取消导航到目标点、机械臂运动发外卖订单并追踪进度

实际开发中,传感器数据几乎全用话题,因为雷达点云和图像每秒发布几十上百帧,用请求/响应模式完全不现实。而像“拍照保存”这种一次性操作,适合用服务。像“导航到某个点”这种耗时长、需要中途反馈的任务,则用动作。

看一个服务调用的例子。小乌龟例子里,你可以用服务生成一只新乌龟:

ros2 service list ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.0, y: 5.0, theta: 0.0, name: 'turtle2'}"

这行命令会在坐标 (5, 5) 位置生成一只名为turtle2的新乌龟。服务调用的本质是一次“请求-响应”过程——客户端发出请求数据,服务端处理完返回响应结果。这个模式在机器人开发里很常用,比如控制机械臂的夹爪开合、询问电池电量等。

3.3 工作空间与功能包:目录结构怎么组织

聊完通信机制,再来看代码组织结构。ROS2 的项目结构是工作空间(workspace)> 功能包(package)的层级。一个工作空间下可以放很多功能包,每个功能包完成一个相对独立的功能。

ros2 pkg create命令可以快速创建功能包:

mkdir -p ~/dev_ws/src cd ~/dev_ws/src ros2 pkg create my_robot_pkg --build-type ament_python --dependencies rclpy geometry_msgs

这个命令创建了一个 Python 功能包,声明了依赖rclpy(ROS2 的 Python 客户端库)和geometry_msgs(几何消息类型)。创建完成后,功能包目录结构是这样的:

my_robot_pkg/ ├── my_robot_pkg/ │ └── __init__.py ├── resource/ │ └── my_robot_pkg ├── test/ ├── package.xml ├── setup.py ├── setup.cfg └── README.md

对 Python 功能包来说,核心就三个文件package.xml(包元信息和依赖声明)、setup.py(安装配置)、以及my_robot_pkg/目录下你写的 Python 节点代码。用colcon build编译整个工作空间:

cd ~/dev_ws colcon build source install/setup.bash

编译之后,你的功能包就会被“安装”到install/目录里,然后就可以用ros2 run my_robot_pkg my_node来运行节点了。

注意:每次修改了package.xmlsetup.py里的依赖声明,都要重新执行colcon build,否则运行时会提示找不到依赖。

3.4 常用命令速查

ROS2 的命令体系是整个开发流程的操作基础,我把高频率使用的命令整理成一张速查表:

命令作用
ros2 pkg list列出所有已安装的功能包
ros2 node list查看当前运行的所有节点
ros2 topic list查看当前所有话题
ros2 topic echo <topic>监听某个话题的数据
ros2 topic pub <topic> <type> "<data>"手动发布一条话题消息
ros2 service list查看所有服务
ros2 service call <service> <type> "<data>"调用某个服务
ros2 action list查看所有动作
ros2 run <pkg> <node>运行功能包里的某个节点
ros2 launch <pkg> <launch_file>用 launch 文件启动一组节点
rqt_graph可视化节点与话题的关系图
colcon build编译工作空间

建议把这张表存下来,用多了自然就熟了。刚开始记不住不用紧张,我做了几年开发也经常靠ros2 --help现查参数。

4. 工具链实战:rviz2、gazebo 与 launch 启动系统

光有通信机制还不够,开发机器人还得搭配可视化、仿真和批量启动工具。这一节我把最常用的三件套说明白。

4.1 rviz2:数据可视化与调试利器

rviz2 是 ROS2 的 3D 可视化工具,可以说是机器人调试的“主显示器”。它能显示雷达点云、相机图像、机器人模型、地图、路径、TF 坐标变换等各种数据。

启动 rviz2:

ros2 launch turtlesim turtlesim.launch.py # 先随便跑个节点 ros2 run rviz2 rviz2

打开 rviz2 后,界面默认是一个空的 3D 场景,需要通过左下角的Add按钮添加显示项。比如添加RobotModel可以显示机器人模型,添加LaserScan可以看到 2D 雷达扫描线,添加Map可以叠加栅格地图,添加TF可以显示各个坐标系之间的变换关系。

调试经验方面,新手最容易忽略的是Fixed Frame(固定坐标系)的选择。默认是map,但如果你的机器人没有发布map坐标系,画面就什么都显示不出来。这时候要把 Fixed Frame 改成机器人基座坐标系(比如base_linkbase_footprint),数据才显示得出来。这个坑我见过太多人踩了。

4.2 gazebo:仿真环境与 URDF 模型

gazebo 是 ROS2 最常用的物理仿真环境,可以在没有真实硬件的情况下测试算法。启动 gazebo:

ros2 run gazebo_ros gazebo.launch.py

gazebo 和 rviz2 的区别在于:rviz2 只能看数据,不能仿真物理;gazebo 有真实的物理引擎和传感器仿真,能模拟重力、碰撞、激光雷达、相机等。通常的开发流程是:在 gazebo 里放一个虚拟机器人,让算法模型跑起来,用 rviz2 观察数据。

配置 gazebo 里机器人模型的关键是 URDF 或 Xacro 文件。URDF 用一种 XML 格式描述机器人的连杆、关节、传感器位置。一个最简单的 URDF 模型大概长这样:

<robot name="my_robot"> <link name="base_link"> <visual> <geometry> <box size="0.5 0.3 0.1"/> </geometry> </visual> <collision> <geometry> <box size="0.5 0.3 0.1"/> </geometry> </collision> <inertial> <mass value="1.0"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.01"/> </inertial> </link> </robot>

这里的<inertial>很关键,它定义了机器人的质量与惯性张量。缺少这部分,gazebo 仿真时机器人会直接掉下去或者行为异常。把 URDF 文件保存后,通过 :

ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:="$(cat my_robot.urdf)"

就能在 rviz2 里看到这个机器人模型了。

4.3 launch 文件:一键启动整套系统

实际项目中,一个机器人动辄要启动十几个节点:雷达驱动、相机驱动、SLAM、路径规划、底盘控制、可视化……手动一个个ros2 run是不现实的。launch 文件就是解决这个问题的——用 Python 脚本统一描述“启动哪些节点、传什么参数、谁跟谁之间的关系”。

一个最基础的 launch 文件:

from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='turtlesim', executable='turtlesim_node', name='turtle1', output='screen' ), Node( package='turtlesim', executable='turtle_teleop_key', name='teleop', output='screen' ), ])

保存为turtlesim.launch.py后,执行:

ros2 launch <功能包名> turtlesim.launch.py

就会同时启动小乌龟仿真器和键盘控制节点。创建功能包时可以把 launch 文件放在launch/目录,并在setup.pypackage.xml里做好配置。用 launch 管理多个节点是工程化开发的必备技能,项目复杂度一上来你就知道它的价值了。

5. 进阶方向:嵌入式、感知、导航与路径规划

基础打通之后,你可能会想:怎么把这些能力用到真实机器人上?这里梳理几个高频进阶方向,对应不同的硬件和应用场景。

5.1 micro-ROS 与嵌入式:ESP32-S3 + PlatformIO

ROS2 直接跑在嵌入式设备上太重了,所以有了 micro-ROS——一个面向微控制器的 ROS2 客户端。它能让 ESP32、STM32 这类资源有限的芯片跟 ROS2 系统直接通信。

以 ESP32-S3 为例,常用的开发环境是VS Code + PlatformIO。在 PlatformIO 的platformio.ini里添加 micro-ROS 依赖:

[env:esp32-s3-devkitc-1] platform = espressif32 board = esp32-s3-devkitc-1 framework = arduino lib_deps = https://github.com/micro-ROS/micro_ros_arduino.git

micro-ROS 节点通信的关键步骤:

#include <micro_ros_arduino.h> #include <rcl/rcl.h> #include <rclc/rclc.h> #include <geometry_msgs/msg/twist.h> rcl_publisher_t publisher; geometry_msgs__msg__Twist msg; void setup() { // 通过串口连接 ROS2 的 micro-ROS Agent set_microros_serial_transports(Serial); delay(2000); // 初始化 ROS2 节点 } void loop() { // 发布速度话题 rcl_publish(&publisher, &msg, NULL); delay(100); }

编译烧录后,在 PC 端先启动 micro-ROS Agent:

ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0

然后你的 ESP32 就会作为 ROS2 节点出现在系统里。这对于做低成本小车、四足机器人、智能家居机器人非常实用。

5.2 雷达驱动与八叉树地图导航

机器人导航最常用的传感器是激光雷达。以 Livox 雷达为例,配置驱动包后可以实时获取点云数据:

ros2 launch livox_ros_driver2 msg_MID360_config.launch.py

雷达点云数据通过/livox/lidar话题发布出来,类型是sensor_msgs/msg/PointCloud2。拿到点云后,可以用于 SLAM 建图和导航。SLAM 建图的核心思路是:机器人一边移动,一边根据雷达数据和里程计数据估计自身位姿,同时构建环境地图。

建图常用方案:

  • Cartographer:Google 开源,基于图优化的 2D/3D SLAM,鲁棒性好,适合复杂环境。
  • SLAM Toolbox:纯 2D SLAM,轻量、易用,适合室内环境。
  • OctoMap(八叉树地图):一种 3D 占位栅格地图表示方式,适合无人机的三维环境感知和避障。

尤其是八叉树地图,它在导航中常用作“代价地图”的一部分,用来判断哪些空间是障碍物、哪些是可以通行的。通过八叉树表示,地图可以动态更新、保留概率信息、支持多分辨率,计算效率很高。用 octomap_server 功能包可以很容易地把点云数据转换成八叉树地图。

5.3 相机标定与机械臂视觉抓取

相机是机器人感知世界的另一只“眼睛”。ROS2 中相机驱动节点发布图像话题(/camera/image_raw)和相机信息话题(/camera/camera_info),后者包含相机内参矩阵、畸变系数。

相机标定就是获取内参和畸变系数的过程。ROS2 提供了camera_calibration功能包,使用棋盘格标定板即可完成:

ros2 run camera_calibration cameracalibrator --size 8x6 --square 0.108 image:=/camera/image_raw camera:=/camera

标定过程中要让标定板在画面里做平移、旋转、倾斜等动作,系统会自动采集样本。当 x、y、size、skew 这四项的进度条都变绿后,就可以点击CALIBRATE计算内参,然后点击SAVE保存参数。标定得到的相机内参矩阵长这样:

fx 0 cx 0 fy cy 0 0 1

其中fxfy是焦距(以像素为单位),cxcy是主点坐标(通常接近图像中心)。这些参数在所有视觉任务里都用得上。

配合相机和机械臂,可以实现视觉引导的抓取:相机检测到目标物的位置,通过标定好的坐标变换把目标坐标映射到机械臂坐标系,然后机械臂规划运动轨迹完成抓取。这种方案在工业分拣、上下料、物流码垛场景里应用非常广,也是 ROS2 开发里一个很有代表性的综合项目方向。

5.4 路径规划与导航栈

导航是移动机器人最经典的应用。ROS2 的导航栈(Nav2)提供了完整的导航能力:定位(AMCL)、地图服务、全局路径规划、局部路径规划、行为树控制。

Nav2 的路径规划可以理解为两层协作

  • 全局路径规划器(Global Planner):负责在全局地图上找到一条从起点到目标点的最优路径,常用的算法是 A* 或 Dijkstra。它是在地图级别“大方向”规划。
  • 局部路径规划器(Local Planner):负责在机器人局部区域内实时避障,常用的算法是 DWA(动态窗口法)或 TEB(时间弹性带)。它是在实际行驶中“细节”规划。

启动 Nav2 导航栈:

ros2 launch nav2_bringup bringup_launch.py map:=/path/to/map.yaml

给定一个目标点,机器人就能自主规划路径并避障前行。这套系统里最重要的参数是机器人半径、线速度/角速度限制、加速性能等,它们直接影响路径规划的安全性和可行性。新手调试导航时最容易出现的问题就是速度参数设置过大,导致机器人转弯时甩尾或撞到障碍物,调参时要耐心、要一点点加。

6. 常见问题与排查技巧实录

最后这部分分享一些我实际踩过的坑,每一个都对应一个具体报错或现象,直接按图索骥即可。

6.1 安装类问题

报错/现象原因解决办法
E: Unable to locate package ros-humble-desktop未添加 ROS2 apt 源按 2.2 节添加源后sudo apt update再装
The repository ... does not have a Release file源地址或 Ubuntu 代号不匹配检查lsb_release -cs输出,确保源地址里用的是当前系统代号
GPG error: The following signatures couldn't be verified密钥未导入或损坏重新下载 ros.key 并覆盖/usr/share/keyrings/ros-archive-keyring.gpg
unmet dependencies系统源版本太旧sudo apt upgrade升级所有包,再装 ROS2

6.2 运行时通信问题

节点之间通信不上是最常见的问题,典型的排查路径是:

  1. ros2 node list确认两个节点都在运行。
  2. ros2 topic list确认话题存在。
  3. ros2 topic echo /目标话题确认数据有没有在发布。
  4. rqt_graph可视化话题关系,看节点是否真的订阅了。

如果节点都在而通信不上,大概率是QoS 策略不匹配。ROS2 的 DDS 通信中,发布端和订阅端的 QoS(比如可靠性策略、历史深度)需要互相兼容,否则订阅端会收不到数据。比如雷达驱动通常用传感器数据的 QoS(SensorDataQoS,可靠性为 best effort),而普通订阅者如果用默认的 reliable QoS,就接不上雷达数据。遇到这种问题,在订阅端显式声明相同的 QoS 即可。这个问题的排查相对隐蔽,但它恰恰是 ROS2 新手和老手的分水岭。

6.3 Fast-DDS 与多机通信策略

ROS2 默认的 DDS 实现是Fast-DDS。它功能全面,但在多机通信场景里经常出现“一台机器上的节点发现不了另一台机器上的节点”的问题。原因是 Fast-DDS 默认使用组播发现,某些路由器会屏蔽组播包。

解决方式:在两台机器上统一配置 Fast-DDS 的发现机制,改用Simple Discovery Protocol 并指定对端 IP,或者直接用共享文件形式的 Discovery Server 模式。这类配置写在 Fast-DDS 的 XML 配置文件中。多机通信这块内容比较深,如果用得不多,先记住“组播发现可能被路由器屏蔽”这个知识点,遇到时朝这个方向排查就行。

6.4 性能问题:CPU 占用高、点云卡顿

如果你在运行导航或感知算法时发现 CPU 占用异常高,先检查是不是在重复话题上做了冗余计算。比如 rviz2 里同时打开了多个耗时传感器显示项,会显著拉高 CPU。这种情况下,可以降低传感器的发布频率来缓解:

ros2 run <driver_pkg> <driver_node> --ros-args -p publish_rate:=10

对视觉任务,还可以在订阅图像时设置 QoS 的队列深度为 1,只取最新一帧,避免处理积压数据。

写在最后的一些体会

做机器人开发这几年,ROS2 给我最大的感受是:它是一个下限低、上限极高的工具链。入门时跑通小乌龟很简单,但随着你深入导航、感知、多机协同,你会发现它的每一个组件都值得单独钻研很久。新手最忌一口气吃成胖子,我的建议是:先把小乌龟、话题/服务/动作通信、工作空间构建、launch 启动这几件事练熟,然后选一个硬件项目(哪怕是最简单的小车)把仿真和真机整个闭环跑一遍。不亲手把一个节点从写出来到跑起来,永远体会不到环境配置里那些莫名其妙的坑到底是怎么来的。

如果你正准备入手 ROS2,个人的建议是:第一步永远是装好环境跑通小乌龟,而不是先啃书本。先动起来,再到坑里去学,进步速度会快得多。以后有机会,我再把 Nav2 导航调参、Cartographer 建图、机械臂 MoveIt2 运动规划这些方向展开写。今天就先到这,有问题的同学欢迎在评论区留言交流。

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

MATLAB实现PUMA560机械臂RRT路径规划与碰撞检测

简介&#xff1a;本资源是一份面向高校自动化、机械电子、人工智能等专业学生的MATLAB课程设计项目&#xff0c;聚焦PUMA560六自由度机械臂的RRT&#xff08;快速扩展随机树&#xff09;路径规划算法仿真与实现&#xff0c;解决机械臂在复杂障碍物环境中从起始位姿到目标位姿的…

作者头像 李华
网站建设 2026/9/13 20:34:25

Keil5 .pack安装失败六大根本原因与修复方案

1. 为什么.keil5安装.pack文件失败不是“运气差”&#xff0c;而是环境链路上的必然断点在嵌入式开发圈里&#xff0c;几乎每个刚接触Keil MDK-ARM&#xff08;也就是大家常说的Keil5&#xff09;的新手&#xff0c;都会在安装芯片支持包&#xff08;.pack文件&#xff09;时卡…

作者头像 李华
网站建设 2026/9/13 20:28:18

UE Capability深度解析:从LTE到NR,终端能力上报如何影响5G体验

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

作者头像 李华
网站建设 2026/9/13 20:23:12

红黑树原理与C语言实现:200行代码搞定插入删除修复

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

作者头像 李华