ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ROS2从零入门:环境搭建、通信机制与小乌龟实战

ROS2从零入门:环境搭建、通信机制与小乌龟实战 很多初学者在接触机器人开发时第一道坎往往不是算法也不是硬件而是 ROS 环境本身。过去在 Ubuntu 上安装 ROS依赖冲突、源更新失败、Python 版本不匹配每一步都可能劝退不少人。进入 ROS2 时代情况虽然好了不少但分布式通信、节点生命周期、DDS 中间件这些新概念又带来了新的理解成本。本文将围绕 ROS2 从零开始完整走一遍环境搭建、小乌龟仿真、通信机制和系统框架拆解帮助你把机器人开发最底层的逻辑理清楚。新手可以按章节逐步操作有 Linux 基础的开发者可以直接跳到通信机制和框架部分查漏补缺。1. 背景与核心概念1.1 ROS2 是什么ROS2Robot Operating System 2是一套面向机器人开发的分布式框架它不是一个真正的操作系统而是运行在 Linux 等系统之上的一整套通信中间件、工具库和生态组件。你写好的节点Node通过它互相发现、收发消息、提供服务从而组合成一个完整的机器人应用。如果觉得“分布式框架”有点抽象可以换一个角度理解。ROS2 就像机器人软件世界里的“微信”不同程序节点之间不需要知道对方的具体 IP 和端口只要在同一个 ROS2 网络里就能通过话题Topic、服务Service、动作Action互相通信。这种设计让机器人开发可以像搭积木一样把传感器驱动、导航算法、机械臂控制拆成独立模块各自演进再动态组合。1.2 为什么从 ROS1 过渡到 ROS2早期机器人开发大量使用 ROS1但 ROS1 在设计上存在几个硬伤底层通信依赖单个中心节点roscore一旦中心节点崩溃整个系统就瘫痪实时性支持不足多机通信配置复杂对 Windows、macOS、嵌入式平台的支持也比较弱。ROS2 从底层重新设计直接采用 DDSData Distribution Service作为通信中间件。DDS 是一种去中心化的发布/订阅协议节点之间通过 DDS 自动发现不再需要中心节点转发。同时 ROS2 引入了基于事件的异步模型生命周期管理更加清晰也更好地支持实时控制和多机协作。下面是 ROS1 与 ROS2 的典型差异对比维度ROS1ROS2中心节点依赖 roscore去中心化基于 DDS 自动发现通信实时性一般更优支持实时控制场景多机通信环境变量网络配置复杂默认支持同一 DDS 域内自动互联跨平台以 Linux 为主支持 Linux、Windows、macOS、嵌入式Python 版本Python 2 为主全面支持 Python 3启动方式roslaunch/rosrunros2 launch/ros2 run1.3 本文的实践范围本文将使用 Ubuntu 22.04 ROS2 Humble 版本从零开始完成环境搭建运行经典的小乌龟Turtlesim仿真程序然后通过实际代码演示话题、服务、动作三大通信机制最后解析 ROS2 的系统框架和节点通信逻辑。文中涉及的命令和代码都基于 Humble 版本其他发行版如 Foxy、Iron思路一致具体版本号按官方文档调整即可。2. 环境准备与版本说明2.1 操作系统与 ROS2 发行版选择学习 ROS2 最稳妥的方式是使用 Ubuntu 系统的 LTS 版本。ROS2 每个发行版都会和某个 Ubuntu 版本对应Humble Hawksbill 对应 Ubuntu 22.04Jammy是目前社区最活跃、教程最丰富的版本之一。如果你的电脑安装的是 Windows 或 macOS优先考虑安装虚拟机如 VMware、VirtualBox或使用 WSL2。虚拟机方案最稳妥共享文件夹、网络配置都比较成熟对新手更友好。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。我的建议是场景推荐方案已有 Ubuntu 22.04 实体机直接安装 ROS2 HumbleWindows 10/11虚拟机安装 Ubuntu 22.04或使用 WSL2macOS虚拟机安装 Ubuntu 22.04 最省心树莓派使用 Ubuntu Server 22.04 ROS2 Humble2.2 准备系统基础环境安装 ROS2 之前先确认系统软件源和基础工具可用。打开终端执行sudo apt update sudo apt upgrade -y然后安装一些基础工具sudo apt install -y curl gnupg lsb-release software-properties-common这里有几个小提醒sudo apt update的作用是刷新软件包索引如果提示某个源无法访问先检查网络情况。upgrade会升级系统现有软件包耗时可能较长建议在空闲时间执行。如果你的 Ubuntu 没有安装sudo先以 root 身份执行apt install sudo。2.3 配置软件源ROS2 官方软件包托管在 packages.ros.org需要先添加密钥和软件源。终端依次执行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最后再次刷新索引sudo apt update如果服务器在国外下载速度不理想可以考虑使用国内镜像源替换packages.ros.org很多高校和云厂商都提供 ROS 镜像。替换方式是把软件源中的域名改成对应镜像地址具体域名以镜像站官方说明为准。3. ROS2 环境搭建从安装到验证3.1 安装 ROS2 Humble新版 ROS2 支持“桌面版”和“基础版”两种安装方式Desktop 版包含 RViz2、Gazebo、Turtlesim、演示示例等学习入门选这个。Base 版只包含通信库、核心工具和命令行工具适合嵌入式或定制化部署。这里安装 Desktop 版sudo apt install -y ros-humble-desktop这个安装包比较大约 2GB 左右取决于你的网络环境可能需要等待一段时间。安装过程中如果出现依赖冲突优先执行sudo apt --fix-broken install修复不要直接强制删除软件包。3.2 配置环境变量安装完成后需要让终端自动加载 ROS2 的环境配置。编辑~/.bashrc文件echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc通常还会追加两个实用配置ROS 本身对 Python 模块的引用依赖环境变量如果不加载会报ModuleNotFoundError。此外补全功能也依赖这个配置。3.3 安装开发工具写 ROS2 代码还需要一些命令行工具和编译工具常见的有sudo apt install -y python3-argcomplete python3-colcon-common-extensions python3-rosdeppython3-argcomplete为ros2命令行提供 TAB 补全。colconROS2 的编译工具类似 ROS1 时代的 catkin。rosdep自动安装功能包依赖的工具。3.4 验证安装是否成功运行一个最简单的 C 示例节点验证通信链路是通的。打开终端执行ros2 run demo_nodes_cpp talker这时会每分钟循环输出类似[INFO] [1700000000.123456789] [talker]: Publishing: Hello World: 1再打开一个新终端执行ros2 run demo_nodes_py listener如果能看到listener收到消息并输出I heard: Hello World: 1说明 ROS2 的节点发现、话题通信都已经正常工作。3.5 常见安装问题速查问题现象常见原因解决思路sudo: add-apt-repository: command not found缺少 software-properties-common执行sudo apt install -y software-properties-common安装时依赖冲突系统源与 ROS 源版本不一致执行sudo apt --fix-broken install输入ros2提示命令不存在环境变量未加载确认/opt/ros/humble/setup.bash已 source网络下载 packages.ros.org 缓慢源在国外更换国内镜像源后重试虚拟机上运行 RViz2 崩溃3D 加速关闭或显卡驱动问题在系统设置中开启 3D 加速或更新虚拟机工具4. 小乌龟仿真第一个 ROS2 应用4.1 Turtlesim 是什么Turtlesim 是 ROS2 自带的一个轻量级二维仿真器界面里有一只小乌龟你可以通过话题给它发速度指令也可以在界面上用键盘控制它移动。它虽然简陋但完整覆盖了“节点创建、话题通信、参数读取”的入门路径。4.2 启动仿真器安装完成后直接运行ros2 run turtlesim turtlesim_node此时会弹出一个蓝色窗口中间是一只小乌龟这代表仿真节点已经启动。注意这里启动的是一个独立的节点节点名是/turtlesim。再打开一个新终端启动键盘控制节点ros2 run turtlesim turtle_teleop_key现在把光标聚焦在键盘控制节点的终端上按方向键可以控制小乌龟移动按G可以画圆形按C修改颜色。这背后就是话题通信键盘节点把按键转换成/cmd_vel话题上的几何速度消息仿真节点订阅话题后更新乌龟位置。4.3 用命令行观察运行状态新打开一个终端输入ros2 node list输出结果包含/turtlesim /teleop_turtle继续查看话题列表ros2 topic list你会看到/cmd_vel、/turtle1/pose、/turtle1/color_sensor等话题。其中/cmd_vel是速度指令话题/turtle1/pose是乌龟位姿话题。查看某个话题的消息类型ros2 topic info /cmd_vel可以看到类型为geometry_msgs/msg/Twist。如果想知道消息内容格式执行ros2 interface show geometry_msgs/msg/Twist输出内容会展示 X/Y/Z 方向的线速度和角速度字段这些字段就是后面编程时需要填充的数据。4.4 用命令行手动发布速度指令小乌龟也可以通过命令行直接控制。往/cmd_vel话题发送一条消息让乌龟直线前进ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist {linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}执行后乌龟会以 2.0 的线速度前进。也可以改用--rate 1让命令周期发送但要注意发布频率过高时乌龟会持续移动。4.5 小结小乌龟揭示了什么小乌龟看起来很简单但它把 ROS2 的多个核心概念串联了起来节点Node/turtlesim和/teleop_turtle是两个独立节点。话题Topic键盘节点发布/cmd_vel仿真节点订阅/cmd_vel。消息Message速度数据使用geometry_msgs/msg/Twist类型。命令行工具node list、topic list、topic pub是排查问题的利器。5. 三大通信机制全拆解话题、服务、动作5.1 话题Topic——持续单向数据流话题是 ROS2 使用最频繁的通信方式适用于传感器数据、状态信息这类“持续产生、持续消费”的数据流。话题通信的特点是发布者Publisher发送消息不关心谁在订阅。订阅者Subscriber接收消息不关心谁在发布。一对多、多对一、多对多都天然支持。用一个最简单的 Python 发布节点来演示。创建功能包cd ~ mkdir -p ros2_ws/src cd ros2_ws colcon build然后在src下创建 Python 功能包cd ~/ros2_ws/src ros2 pkg create py_topic_demo --build-type ament_python --dependencies rclpy std_msgs编辑py_topic_demo/py_topic_demo/publisher.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_msgs.msg import String class SimplePublisher(Node): def __init__(self): super().__init__(simple_publisher) self.publisher_ self.create_publisher(String, hello_topic, 10) self.timer self.create_timer(1.0, self.timer_callback) self.count 0 def timer_callback(self): msg String() msg.data fHello ROS2: {self.count} self.publisher_.publish(msg) self.get_logger().info(fPublish: {msg.data}) self.count 1 def main(argsNone): rclpy.init(argsargs) node SimplePublisher() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()这段代码里create_publisher(String, hello_topic, 10)创建了一个发送String类型消息的发布者话题名是hello_topic队列长度为 10。create_timer(1.0, self.timer_callback)表示每隔 1 秒执行一次回调函数。rclpy.spin(node)让节点进入事件循环持续处理定时器和订阅回调。再写一个订阅节点subscriber.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_msgs.msg import String class SimpleSubscriber(Node): def __init__(self): super().__init__(simple_subscriber) self.subscription self.create_subscription( String, hello_topic, self.listener_callback, 10 ) def listener_callback(self, msg): self.get_logger().info(fI heard: {msg.data}) def main(argsNone): rclpy.init(argsargs) node SimpleSubscriber() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()注意setup.py中要注册这两个入口entry_points{ console_scripts: [ publisher py_topic_demo.publisher:main, subscriber py_topic_demo.subscriber:main, ], },编译并运行cd ~/ros2_ws colcon build source install/setup.bash ros2 run py_topic_demo publisher ros2 run py_topic_demo subscriber两个终端会分别输出发布和接收日志。这演示了话题通信的完整流程发布节点通过 DDS 将消息写入话题订阅节点自动发现并接收。5.2 服务Service——请求响应模式话题适合持续数据流但如果需要“请求一次得到一次结果”的交互比如让机械臂移动到某个位置、查询地图信息就应该使用服务。服务通信由客户端Client发起请求服务端Server处理并返回响应。创建一个服务端节点实现两个整数相加。先创建功能包cd ~/ros2_ws/src ros2 pkg create py_service_demo --build-type ament_python --dependencies rclpy example_interfacesexample_interfaces里包含AddTwoInts服务类型。服务端代码server.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from example_interfaces.srv import AddTwoInts class AddService(Node): def __init__(self): super().__init__(add_service) self.srv self.create_service(AddTwoInts, add_two_ints, self.add_callback) def add_callback(self, request, response): response.sum request.a request.b self.get_logger().info(fReceive {request.a} {request.b} {response.sum}) return response def main(argsNone): rclpy.init(argsargs) node AddService() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()客户端代码client.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from example_interfaces.srv import AddTwoInts class AddClient(Node): def __init__(self): super().__init__(add_client) self.client self.create_client(AddTwoInts, add_two_ints) while not self.client.wait_for_service(timeout_sec1.0): self.get_logger().info(Waiting for service...) self.request AddTwoInts.Request() def send_request(self): self.request.a 3 self.request.b 5 future self.client.call_async(self.request) rclpy.spin_until_future_complete(self, future) if future.result() is not None: self.get_logger().info(fResult: {future.result().sum}) else: self.get_logger().error(Service call failed) def main(argsNone): rclpy.init(argsargs) node AddClient() node.send_request() node.destroy_node() rclpy.shutdown() if __name__ __main__: main()依次在终端注册入口并编译先运行服务端再运行客户端ros2 run py_service_demo server ros2 run py_service_demo client服务端会打印请求参数客户端会收到返回结果。这就是服务的完整调用链路客户端先等待服务上线然后异步调用再通过spin_until_future_complete等待返回。5.3 动作Action——长时间任务与可取消操作动作适合需要持续反馈、可能执行较长时间并且可能需要中途取消的任务例如让机器人导航到某个点、机械臂执行一段轨迹。动作在底层由话题和服务组合而成客户端发送目标Goal使用服务通信。服务端持续发布反馈Feedback和结果Result使用话题通信。动作支持中途取消。ROS2 官方提供了action_tutorials_interfaces示例。先安装sudo apt install -y ros-humble-action-tutorials-interfaces使用Fibonacci动作类型它接收一个目标数order反馈中间序列最终返回结果序列。我这里给一个简化版的 Python 动作服务端思路from action_tutorials_interfaces.action import Fibonacci from rclpy.action import ActionServer这个示例涉及较多代码此处不展开完整实现重点是理解动作的“三段式”流程客户端发送目标。服务端在目标回调中决定是否接受如果不接受可以拒绝。接受后执行循环计算并发布反馈最终发布结果。运行动作示例可以用官方教程包ros2 run action_tutorials_py fibonacci_action_server ros2 run action_tutorials_py fibonacci_action_client客户端终端会不断打印反馈序列最终显示结果。如果中途按CtrlC可以看到服务端响应取消请求。5.4 三种通信机制对比通信类型适合场景数据方向是否阻塞是否可取消话题 Topic传感器数据、状态发布、日志单向持续流非阻塞不支持服务 Service请求-响应、同步查询、简单计算双向短连接通常同步等待不支持动作 Action导航、机械臂控制、复杂任务多段双向流异步支持理解这三个机制的选择标准基本就迈过了 ROS2 入门的第一道分水岭持续数据用话题一问一答用服务复杂任务用动作。6. 系统框架全拆解节点、组件与启动6.1 节点Node——最小执行单元ROS2 中的节点是独立运行的可执行程序每个节点负责一项相对独立的功能。比如摄像头驱动是一个节点激光雷达驱动是一个节点导航算法是另一个节点。节点之间通过 DDS 自动发现。也就是说只要运行在同一个 ROS_DOMAIN_ID 环境下节点不需要知道目标节点的地址就能自动建立通信链路。查看当前域环境echo $ROS_DOMAIN_ID如果输出为空默认是 0。不同域环境之间的节点不会互相通信多机器人项目中经常用这个参数隔离系统。6.2 功能包Package——代码组织单元功能包是 ROS2 代码组织的核心单位类似 Maven 的模块或 Python 的包。一个功能包里包含节点源码、依赖声明、配置文件、启动文件等内容。创建功能包的两种方式# C 功能包 ros2 pkg create pkg_name --build-type ament_cmake --dependencies rclcpp # Python 功能包 ros2 pkg create pkg_name --build-type ament_python --dependencies rclpy--dependencies后面跟的是编译和运行时的依赖项例如rclcpp、rclpy、std_msgs等。6.3 工作空间Workspace——多包管理工作空间是一个包含多个功能包的目录典型的结构如下ros2_ws/ ├── build/ # 编译中间产物 ├── install/ # 安装后的环境 ├── log/ # 编译日志 └── src/ # 源码目录 ├── py_topic_demo/ ├── py_service_demo/ └── ...编译整个工作空间cd ~/ros2_ws colcon build只编译某个包colcon build --packages-select py_topic_demo编译后必须重新加载环境source install/setup.bash6.4 启动文件Launch File——一键启动整机系统机器人系统通常有十几个甚至几十个节点不可能每个都手动ros2 run一次。启动文件Launch File就是用来统一启动多个节点的。创建启动文件launch/demo.launch.pyfrom launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packageturtlesim, executableturtlesim_node, nameturtlesim, outputscreen ), Node( packageturtlesim, executableturtle_teleop_key, nameteleop_turtle, outputscreen ), ])运行启动文件cd ~/ros2_ws colcon build source install/setup.bash ros2 launch py_topic_demo demo.launch.py这样一条命令就能同时启动仿真器和键盘控制节点。实际开发中启动文件还支持参数传递、条件判断、命名空间配置等高级功能是工程化部署的关键。6.5 参数Parameter与节点生命周期ROS2 的节点参数可以在运行时动态修改例如修改乌龟颜色ros2 param set /turtlesim background_r 255节点的生命周期管理是 ROS2 的重要特性节点状态包括未配置、未激活、激活、已停用等。生命周期状态机主要用于需要严格控制的场景例如导航节点在上电后先配置参数、再激活运行确保传感器数据就绪后才开始计划路径。6.6 ROS2 生态工具链除了核心通信机制ROS2 附带了一批高频工具工具命令作用ros2 node list/info查看节点列表和节点信息ros2 topic list/info/echo/pub查看和调试话题ros2 service list/type/call查看和调用服务ros2 action list/info查看动作列表ros2 param list/get/set查看和设置参数ros2 bag record/play录制和回放话题数据rviz2可视化机器人模型、传感器数据、地图gazebo三维物理仿真环境ros2 bag是工程中很实用的工具用它可以录制一段传感器数据回放时反复测试算法这在真机调试中非常有价值。7. 常见问题与排查思路7.1 节点之间无法通信现象是topic list只能看到自己的节点找不到其他机器或容器里的节点。排查步骤确认双方的ROS_DOMAIN_ID是否一致。检查是否在同一台机器、同一网段。检查防火墙和 DDS 使用的端口。确认环境变量ROS_LOCALHOST_ONLY没有被误设。echo $ROS_DOMAIN_ID echo $ROS_LOCALHOST_ONLY如果都在局域网内且 ID 一致仍无法通信可以手动指定 RMW 实现尝试例如export RMW_IMPLEMENTATIONrmw_fastrtps_cpp7.2 colcon build 编译报错常见的报错有两类第一类找不到某个依赖包Package xxx not found解决方式sudo apt install ros-humble-xxx或者使用rosdep自动安装sudo rosdep init rosdep update cd ~/ros2_ws rosdep install -i --from-path src --rosdistro humble -y第二类Python 模块路径错误如果你运行节点时提示ModuleNotFoundError: No module named pkg_name说明没有 sourceinstall/setup.bash或者setup.py的entry_points写错了。7.3 节点重复启动导致端口冲突每个 ROS2 节点在 DDS 层会分配唯一标识如果同名节点反复启动旧节点可能没有完全退出。用以下命令强制查看进程ps aux | grep ros必要时使用kill结束残留进程。开发时也要注意节点命名唯一性避免调试时出现“幽灵节点”。7.4 小乌龟界面不弹出如果运行ros2 run turtlesim turtlesim_node后终端没有报错但界面不显示大概率是图形界面环境问题。在虚拟机里优先检查是否安装了完整桌面版 Ubuntu。是否在 SSH 会话中运行需要配置 X11 转发。虚拟机是否开启 3D 加速。7.5 消息类型不匹配发布话题时报错Inline evaluation of message content failed通常是你给的消息字段和实际类型不一致。先用ros2 interface show确认字段定义再检查拼写。7.6 排查问题的一般思路开发 ROS2 过程中不要凭感觉改代码。建议按下面的顺序排查先看进程ros2 node list确认节点是否都活着。再看话题ros2 topic list、ros2 topic info。然后看消息内容ros2 topic echo或ros2 topic hz。确认参数ros2 param list。最后才看源码逻辑。这个顺序能快速判断问题是出在通信层还是程序逻辑层。8. 最佳实践与工程建议8.1 合理命名话题和服务节点和话题命名要清晰建议遵循“层级前缀 语义化名称”的方式。比如一个底盘控制包/chassis/cmd_vel /chassis/odom /chassis/battery分组命名可以配合命名空间隔离多个机器人避免冲突。8.2 消息类型优先使用标准接口ROS2 官方提供了大量标准消息类型如std_msgs、geometry_msgs、sensor_msgs、nav_msgs。能用标准类型就优先用标准类型原因有两个生态工具如 RViz2默认支持这些类型。第三方算法包能和你无缝对接。只有在自定义结构复杂、标准类型覆盖不了时才定义.msg、.srv、.action文件。8.3 队列长度设置要结合业务场景create_publisher或create_subscription中的队列长度参数例如 10不是越大越好。它的含义是在消息未被及时处理时最多缓存多少条。传感器高频数据如激光雷达队列可以大一些防止丢帧。低频控制指令队列建议设小保证控制命令及时生效。如果订阅端处理慢队列满后会丢弃旧消息保证最新消息优先这一点在很多场景下是有利的。8.4 代码中要区分阻塞与非阻塞ROS2 的rclpy.spin()会阻塞主线程spin_once()和spin_until_future_complete()适合在自定义循环中处理。工程中要注意不要在回调函数里执行耗时的同步操作避免阻塞其他消息处理。需要执行耗时任务时使用多线程执行器MultiThreadedExecutor或异步编程。8.5 日志和调试意识ROS2 自带分级日志系统用法示例self.get_logger().debug(debug message) self.get_logger().info(info message) self.get_logger().warn(warning message) self.get_logger().error(error message)实际项目里日志是定位问题的第一手段。关键节点启动、关键参数变更、重要状态切换都要打日志。不要等出了问题再补代码开发过程中就要养成习惯。8.6 生产环境的系统配置如果你是做真机部署除了代码还需要关注系统使用systemd服务管理关键节点保证开机自启和异常重启。使用docker容器隔离不同版本环境时需要特别处理 DDS 的网络模式默认 bridge 模式下节点间通信经常失败一般建议--network host。重要传感器数据建议同步录制ros2 bag方便离线回放和 bug 复现。机器人是多进程系统崩溃恢复策略要提前设计。8.7 持续学习的路径建议学完本文的基础内容后建议按这个路线继续深入手动实现一个完整的发布订阅系统用代码实现话题、服务、动作三者组合的小型应用。学习 TF2 坐标变换机器人定位与建图离不开坐标变换。学习 URDF 建模在 RViz2 中显示机器人模型。跑通 Nav2 导航将小乌龟替换成真实的差速底盘仿真结合 Gazebo 完成 SLAM 建图和自主导航。了解 MoveIt 机械臂运动规划如果方向是机械臂MoveIt 是绕不开的框架。学习阶段核心内容推荐工具/包入门节点、话题、服务、动作Turtlesim、Demo 示例进阶TF2、URDF、launch 高级用法RViz2、robot_state_publisher中级导航、SLAM、代价地图Gazebo、Nav2、Cartographer高级机械臂、MoveIt、多机协同MoveIt、DDS 多机配置8.8 版本升级注意事项ROS2 版本迭代较快每个版本的生命周期大约 3 到 5 年。实际项目选型时建议新项目优先选择与当前 Ubuntu LTS 对应的 ROS2 LTS 版本。不要在生产环境随意升级 ROS2 主版本。阅读官方迁移指南注意 API 变化。9. 总结与动手挑战这一路下来我们已经完成了四件事在 Ubuntu 22.04 上从零搭建 ROS2 Humble 环境通过小乌龟仿真跑通了第一个节点程序用 Python 代码完整分析了话题、服务、动作三大通信机制的底层逻辑最后拆解了节点、功能包、工作空间、启动文件构成的系统框架。这里留一个动手挑战建议你亲手做一遍创建一个 Python 功能包包含一个发布节点和一个订阅节点。发布节点每 0.5 秒发布一次当前系统时间使用builtin_interfaces/msg/Time或std_msgs/msg/String订阅节点接收后打印。在终端用ros2 topic hz查看实际发布频率再用ros2 topic echo检查消息内容。完成这个挑战意味着你已经具备自己编写 ROS2 节点、调试通信链路的能力后面的导航、SLAM、机械臂控制都是在这个基础上叠加算法和工具。ROS2 的学习曲线确实不低但每一次把节点跑起来、把通信调通的瞬间都是对底层逻辑更深一层的理解。
返回列表