https://blog.csdn.net/ZhangRelay/article/details/166834164
《ROS机器人程序设计》实验报告(ROS1 Kinetic & ROS2 Lyrical 深化对比版)
专业: 机器人工程
学号: 自填
姓名: 自填
实验地点: 百工楼201 / 蓝桥云课
实验环境: Ubuntu + ROS1 Kinetic(截图环境) / ROS2 Lyrical(文档环境)
实验日期: 2026年10月5日(根据截图系统时间)
实验项目与内容一览表
| 序号 | 实验项目名称 | 内容提要 | 实验类型 | 实验要求 |
|---|---|---|---|---|
| 1 | 实验一、ROS1/ROS2入门 | 机器人操作系统安装、虚拟机、Docker、嵌入式系统 | 验证性 | 必修 |
| 2 | 实验二、ROS1/ROS2架构及概念 | 文件系统级、计算图级、社区级、创建功能包并实现功能 | 验证性 | 必修 |
| 3 | 实验三、可视化和调试工具 | 调试节点、日志、检测系统状态、动态参数、rqt、可视化 | 验证性 | 必修 |
| 4 | 实验四、3D建模与仿真 | 自定义3D模型,创建URDF文件、xacro文件、仿真 | 验证性 | 必修 |
| 5 | 实验五、导航功能 | 创建变换、发布传感器消息、代价地图、RViz配置、AMCL | 验证型 | 必修 |
| 6 | 实验六、使用MoveIt! | 机械臂、体系结构、简单运动规划、抓取放置任务 | 验证型 | 必修 |
| 7 | 实验七、ROS1/ROS2外设使用 | 游戏手柄、鼠标遥控、RGBD传感器、OpenCV、点云库 | 验证型 | 必修 |
实验一:ROS1/ROS2Kinetic/Lyrica II入门
设计要求: 机器人操作系统安装、虚拟机、Docker、嵌入式系统。
实验时间与截图时间戳说明

- 截图顶部系统时间:Oct 5 10:10 ~ 10:16。
- 终端标签页时间:2:06:43 ~ 2:07:06(表示终端运行时长)。
- 实验操作集中在ROS1 Kinetic环境,使用阿里云镜像源查询软件包信息。
实验记录(70分)
1. 查询系统软件包信息
执行命令:
bash
apt show ros-kinetic-desktop
输出关键信息:
- Version:
1.3.2-0xenial-20210503-171953-0800 - Priority: extra
- Section: misc
- Maintainer: Mikael Arguedas
<mikael@osrfoundation.org> - Installed-Size: 13.3 kB
- Depends:
ros-kinetic-angles,ros-kinetic-common-tutorials,ros-kinetic-geometry-tutorials,ros-kinetic-robot,ros-kinetic-ros-tutorials,ros-kinetic-roslaunch,ros-kinetic-visualization-tutorials,ros-kinetic-viz - Download-Size: 1,778 B
- APT-Manual-Installed: no
- APT-Sources:
https://mirrors.aliyun.com/ros/ubuntu xenial/main amd64 Packages - Description: A metapackage to aggregate several packages.
2. 环境变量自动加载
bash
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
这样每次打开终端都会自动加载ROS1环境。
3. ROS2 Lyrical对应操作
在ROS2 Lyrical中,查询命令为:
bash
sudo apt install ros-lyrical-desktop-full
输出显示:"ros-lyrical-desktop-full 已经是最新版(0.13.0-3resolute.20260817.181219)"。系统软件为2026年8月17日发布。同样需要配置:
bash
echo "source /opt/ros/lyrical/setup.bash" >> ~/.bashrc
source ~/.bashrc
思考题(30分)
问题: 有4个软件包可以升级,但执行 apt list --upgradeable 时提示无法下载,报错 https://packages.osrfoundation.org/gazebo/ubuntu-stable/dists/te/InRelease 暂时不能解析域名,原因是什么?
解答:
这是网络连接问题 ,不是ROS1/ROS2安装损坏。只是软件源访问不了,域名解析警告不影响 rosrun、roslaunch 等基础开发功能。ROS本体已经安装好了,只是无法升级这4个包。可以先正常使用ROS2,待网络恢复后再执行升级。
ROS1与ROS2深度对比
| 对比项 | ROS1 Kinetic | ROS2 Lyrical |
|---|---|---|
| 系统依赖 | Ubuntu 16.04 Xenial,强绑定 | Ubuntu Resolute,支持现代系统 |
| 构建系统 | catkin_make / catkin build |
colcon build |
| 环境配置 | source /opt/ros/kinetic/setup.bash |
source /opt/ros/lyrical/setup.bash |
| 包管理 | apt show ros-kinetic-desktop |
apt show ros-lyrical-desktop-full |
| 版本格式 | 1.3.2-0xenial-... |
0.13.0-3resolute... |
实验二:ROS1/ROS2Kinetic/Lyrica II架构及概念
内容: 机器人操作系统文件系统级、计算图级、社区级、创建功能包并实现功能等。
实验时间与截图时间戳说明

- 截图2:系统时间 Oct 5 10:16 ,终端标签 2:16:46 ,TurtleSim窗口标题
TurtleSim。

- 截图10:系统时间 Oct 5 11:25 ,终端标签 3:25 ,运行自定义节点
./butterflypro。 - 实验二涵盖两个典型操作:官方五边形绘制和自定义蝴蝶曲线绘制。
实验记录(70分)
1. 运行Turtlesim并绘制五边形
启动节点:
bash
rosrun turtlesim turtlesim_node
使用动作服务器:
bash
rosrun turtlesim turtle_actiolib_shape_server
客户端发送目标指令后,小乌龟在蓝底画布上精准绘制出白色五边形 (截图2)。
控制话题:/turtle1/cmd_vel,消息类型:geometry_msgs/Twist。
linear.x:前进速度angular.z:偏航旋转速度(正值左转,负值右转)
2. 自定义节点绘制蝴蝶图案
根据截图10,运行自定义编写的可执行文件:
bash
./butterflypro
终端提示:
当前速度:100
输入新速度(1.0-200.0,回车生效,输入0保持当前值):
输入 100 后,小乌龟在画布上绘制出复杂的蝴蝶曲线 。这验证了ROS1计算图级中节点与话题的松耦合特性:自定义节点发布 /turtle1/cmd_vel,turtlesim_node 订阅并执行。
3. 常用修改
- 画圆形 :修改
linear.x和angular.z,保持比值恒定。 - 修改正方形边长 :调整
move_straight的第二个参数(持续时间)。 - 画三角形:把循环次数改成3,旋转角度改为120度。
思考题(30分)
问题: 键盘遥控小乌龟实验中,为什么按方向键乌龟不动?
解答:
- 光标焦点问题 :必须选中
turtle_teleop_key所在的终端窗口,点击海龟窗口无效。 - 环境变量问题 :检查是否执行
source /opt/ros/kinetic/setup.bash。 - 网络/源报错 :不影响,
turtlesim已经安装好了。
原理: turtle_teleop_key 读取键盘按键,持续往 /turtle1/cmd_vel 发布 Twist 速度消息;turtlesim_node 订阅该话题,驱动海龟移动。
ROS1与ROS2深度对比
| 对比项 | ROS1 Kinetic | ROS2 Lyrical |
|---|---|---|
| 节点运行 | rosrun turtlesim turtlesim_node |
ros2 run turtlesim turtlesim_node |
| 消息类型 | geometry_msgs/Twist |
geometry_msgs/msg/Twist |
| 通信底层 | 中心化 roscore + TCP/IP |
去中心化 DDS |
| 动作机制 | actionlib |
原生Action,生命周期节点 |
| 话题发布 | rostopic pub |
ros2 topic pub |
实验三:可视化和调试工具
内容: 调试节点、日志消息、检测系统状态、设置动态参数、可视化节点诊断、绘制标量数据图、图像可视化、3D可视化、保存与回放数据、插件。
实验时间与截图时间戳说明

- 截图3:系统时间 Oct 5 10:22 ,终端标签 2:16:46 附近,键盘遥控终端。

-
截图4:系统时间 Oct 5 10:25 ,rqt Console显示消息时间 02:24:54.780227298 (2026-10-05) ,节点
/turtlesim,严重级别Warn。
-
截图5:系统时间 Oct 5 10:30 ,终端标签 2:30 ,rqt Service Caller调用
/turtle1/set_pen。 -
时间戳格式说明:ROS1终端显示自1970年1月1日以来的秒和纳秒累计计数(如
1785187166.894860150),对应北京时间 UTC+8:2026-07-28(文档示例);截图4中rqt显示的是格式化后的本地时间。
实验记录(70分)
1. 键盘遥控小乌龟
运行:
bash
rosrun turtlesim turtle_teleop_key
终端显示:
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
Use g|b|v|c|d|e|r|t keys to rotate to absolute orientations. 'f' to cancel a rotation.
'q' to quit.
重要坑点: 光标必须聚焦在 turtle_teleop_key 终端内,按键才生效。
2. rqt图形化调试与日志分析
打开 rqt,切换到 Console 插件。控制小乌龟撞墙后,捕获到日志:
- 节点:
/turtlesim - 时间:
02:24:54.780227298 (2026-10-05) - 严重级别:
Warn - 消息:
Oh no! I hit the wall! (Clamping from x=6.080470, y=0.028881) - 位置:
/tmp/binarydeb/ros-kinetic-turtlesim-0.7.1/src/turtle.cpp:Turtle::update:162
这说明ROS1日志系统能精确定位到源码文件和行号,便于调试。
3. 动态参数重配与服务调用
在 rqt 的 Service Caller 插件中,调用 /turtle1/set_pen 服务(类型 turtlesim/SetPen):
r = 0g = 240b = 0(绿色)width = 8(画笔粗细)off = 0(开启画笔,若为1则抬笔)
点击 Call 后,左侧画布中小乌龟绘制出粗绿色轨迹(截图5)。这展示了ROS基于服务的通信模型:客户端发送请求,服务端修改画笔参数,实现实时控制。
思考题(30分)
问题: 如何修改机器人轨迹色彩,例如轨迹曲线为黄色?
解答:
使用 rqt 的 Service Caller 调用 /turtle1/set_pen 服务,设置:
r = 200,g = 200,b = 0→ 黄色width = 8,off = 0
点击Call后,海龟移动时即按新参数绘制黄色轨迹。
核心原理: ROS服务通信模型,turtlesim_node提供/turtle1/set_pen服务,rqt作为客户端发送请求,服务端接收后修改画笔参数。
ROS1与ROS2深度对比
| 对比项 | ROS1 Kinetic | ROS2 Lyrical |
|---|---|---|
| 命令行工具 | rostopic, rosservice |
ros2 topic, ros2 service |
| 动态参数 | rqt_reconfigure / dynamic_reconfigure |
ros2 param,支持参数回调 |
| 日志系统 | rqt_console,文件行号定位 |
ros2 run 统一日志,支持时间同步 |
| 时间戳 | 自1970年秒+纳秒计数 | 标准化 builtin_interfaces/Time |
| rqt兼容 | 大部分插件可用 | 部分插件需适配ROS2 |
实验四:3D建模与仿真
内容: 自定义机器人3D模型,创建一个URDF文件、xacro文件、ROS1/ROS2仿真。
实验时间与截图时间戳说明

- 截图6:系统时间 Oct 5 10:45 ,终端标签 2:45。
- RViz窗口标题:
urdf.rviz* - RViz。 - 底部时间栏显示:
ROS Time: 791168324.89ROS Elapsed: 65.48Wall Time: 791168324.92Wall Elapsed: 65.45
joint_state_publisher窗口显示关节滑块数值。
实验记录(70分)
1. URDF模型加载与关节控制
在RViz中加载移动机器人模型:
- RobotModel :加载模型,数据来自
/robot_description话题。 - Alpha = 0.5:设置模型半透明度,0完全透明,1不透明。
- TF:勾选后显示各连杆坐标系(红X、绿Y、蓝Z)。
运行 joint_state_publisher,弹出GUI界面,拖动滑块可实时改变关节角度:
left_front_wheel_joint:2.41left_back_wheel_joint:2.83gripper_extension:0.00left_gripper_joint:0.48right_gripper_joint:0.43head_swivel:1.58
按钮:Randomize(随机化)、Center(归中)。
2. 原理
- URDF:机器人统一描述文件,定义连杆、关节、几何外形。
- robot_state_publisher :将URDF发布到
/robot_description话题。 - joint_state_publisher:发布关节状态。
- RViz:订阅话题,渲染模型和TF坐标系。
启动命令:
bash
ros2 launch urdf_tutorial display.launch.py model:=<你的urdf文件>
思考题(30分)
问题1: URDF和Xacro调整模型颜色有什么区别?
解答:
- URDF:XML格式,代码量庞大,扩展外部结构时维护极不方便。
- Xacro:支持宏定义、条件语句和数学运算,能大幅减少代码量,特别适合调整模型颜色和复杂逻辑操作。
问题2: ROS机器人进行三维仿真,可视化和仿真的工具是哪些?
解答:
- 三维机器人模型:URDF(Unified Robot Description Format),XML格式,描述关节、传感器、链接和碰撞体。
- 可视化工具:RViz,ROS内置3D可视化工具,显示机器人模型、传感器数据、路径规划信息。
- 仿真工具 :
- Gazebo:强大的物理仿真器,提供ROS接口。
- Webots:支持多种编程语言,可与ROS集成。
- CoppeliaSim:V-REP升级版,提供运动规划和控制功能。
ROS1与ROS2深度对比
| 对比项 | ROS1 Kinetic | ROS2 Lyrical |
|---|---|---|
| Launch文件 | XML .launch |
Python .launch.py |
| 启动命令 | roslaunch urdf_tutorial display.launch |
ros2 launch urdf_tutorial display.launch.py |
| URDF/Xacro | 通用 | 通用 |
| 仿真工具 | Gazebo, V-REP | Gazebo, Webots, CoppeliaSim |
| 时间同步 | 较弱 | 强,支持 /clock |
实验五:导航功能
内容: 创建变换、发布传感器消息、里程数据信息、创建基础控制器、创建地图、机器人配置、全局和局部代价地图、RViz详细配置、自适应蒙特卡洛定位、避障、目标发送。
实验时间与截图时间戳说明

- 截图7:系统时间 Oct 5 10:49 ,终端标签 2:49。
- RViz窗口标题:
rviz_navigation.rviz* - RViz。 - 底部时间栏:
ROS Time: 96.00ROS Elapsed: 95.60Wall Time: 791168599.44Wall Elapsed: 95.89
- 地图为黑白栅格,代价地图彩色,全局路径绿色。
实验记录(70分)
1. 启动导航仿真环境
启动命令:
bash
ros2 launch nav2_bringup tb3_simulation_launch.py
一键启动:
- Gazebo物理仿真器,加载TurtleBot3机器人与仿真场景。
- Nav2导航栈(定位、全局规划、局部规划、代价地图等所有导航节点)。
- 自动打开RViz,加载导航预设配置。
2. RViz导航可视化界面
- Fixed Frame :
map。 - 黑白栅格地图:机器人SLAM建好的环境地图,黑色=障碍物,白色=可通行区域。
- 彩色区域(代价地图) :
- 红色/紫色:障碍物膨胀区,机器人禁止驶入。
- 浅蓝:安全缓冲区域。
- 绿色线条:全局规划路径,Nav2全局规划器搜索得到的最优路径。
- 顶部工具栏 :
2D Pose Estimate(初始位姿估计)、2D Nav Goal(目标点发送)。 - 左侧Navigation2面板:显示导航、定位状态(active代表正常运行)。
3. 整体工作流程
- Gazebo仿真:TurtleBot3移动,激光雷达+里程计输出传感器数据。
- AMCL定位:利用激光匹配已有地图,实时估算机器人位置姿态。
- Nav2导航栈 :
- 全局规划:根据地图规划全局路径(RViz绿色线)。
- 局部规划:根据实时激光数据,躲避动态障碍物,输出速度指令。
- RViz:可视化地图、代价地图、规划路径、机器人模型,提供交互按钮。
4. 操作简要步骤
- 执行启动命令,Gazebo和RViz同时弹出。
- RViz使用
2D Pose Estimate点击地图,给出机器人初始位置。 - 使用
2D Nav Goal在地图上点击目标位置。 - Nav2自动生成绿色全局路径,机器人在Gazebo环境中自主沿路径移动,躲避障碍物。
思考题(30分)
问题: 如何优化导航效果,例如提升导航中机器人的行驶速度?
解答:
环境:ROS2 + Nav2 + TurtleBot3 Gazebo仿真。
提速不能只改一个参数,速度上限、加速度、代价地图、规划器参数需要配套修改,否则容易撞障碍物、抖动、导航失败。
修改 nav2_params.yaml:
- 增大
max_vel_x最大前进线速度,同步调高acc_lim_x加速度。 - 提高PurePursuit控制器
lookahead_dist预瞄距离,避免高速路径抖动。 - 适当减小局部代价地图
inflation_radius障碍物膨胀半径,减少远距离减速。 - 优化AMCL定位参数,保证高速下定位稳定。
调试要点: 参数逐步上调,速度越高碰撞风险越大;若出现振荡、丢定位,降低速度或增大安全膨胀半径。
其他优化:开启路径平滑,合理设置目标到达容差,选用高质量地图。
ROS1与ROS2深度对比
| 对比项 | ROS1 Kinetic | ROS2 Lyrical |
|---|---|---|
| 导航框架 | move_base |
Nav2 |
| 核心机制 | 插件机制 | 行为树 + 生命周期节点 |
| 参数配置 | move_base YAML |
按节点细分YAML |
| 定位算法 | AMCL | AMCL(封装更标准) |
| 启动命令 | roslaunch |
ros2 launch |
| 实时性 | 较弱 | DDS支持,更强 |
实验六:使用MoveIt!
内容: 机械臂、体系结构、简单运动规划、抓取放置任务。
实验时间与截图时间戳说明

-
截图8:系统时间 Oct 5 10:56 ,终端标签 2:56 ,RViz窗口
moveit.rviz* - RViz。
-
截图9:系统时间 Oct 5 10:57 ,终端标签 2:57。
-
终端日志时间戳:
[1791169018.802540588]: RRTConnect: Created 5 states (2 start + 3 goal)[1791169018.802671331]: RRTConnect: Starting planning with 1 states already in datastructure[1791169018.802763589]: RRTConnect: Created 4 states (2 start + 2 goal)[1791169018.802845843]: ParallelPlan::solve(): Solution found by one or more threads in 0.000582 seconds[1791169018.803843805]: SimpleSetup: Path simplification took 0.000530 seconds and changed from 3 to 2 states
实验记录(70分)
1. MoveIt2运动规划配置
在RViz中加载Panda机械臂模型,左侧 MotionPlanning 面板:
- Planning Group :
panda_arm(7个关节)。 - Planning Time(s):5.0秒。
- Planning Attempts:10次。
- Velocity Scaling:0.10(机械臂只能运行最大速度的10%)。
- Accel Scaling:0.10。
2. 规划与执行
终端显示 RRTConnect 规划器创建状态,ParallelPlan::solve() 在 0.000582秒 内找到解,路径简化耗时 0.000530秒 ,从3个状态变为2个状态。
操作流程:
- 拖拽机械臂末端设置目标位姿(橙色模型)。
- 设置规划组
panda_arm,调整规划时间、速度缩放。 - 点击
Plan:MoveIt求解轨迹,RViz预览。 - 点击
Execute:机械臂沿规划轨迹运动;也可直接Plan & Execute。 Stop:停止机械臂运动。Clear octomap:清除八叉树障碍物地图。
3. 选项
- Use Cartesian Path:笛卡尔路径规划,控制末端沿直线运动(默认关节空间规划)。
- Collision-aware IK:带碰撞检测的逆运动学求解。
4. 原理
- MoveIt2:ROS2机器人运动规划框架,负责逆运动学求解、碰撞检测、轨迹规划。
- 流程:设置起始位姿与目标位姿 → MoveIt规划器在关节空间搜索无碰撞轨迹 → RViz预览 → 执行轨迹。
- Panda:7自由度机械臂,冗余自由度,同一末端位姿下存在多种关节姿态。
思考题(30分)
问题: 如何结合实验5导航Nav2和实验6移动抓取MoveIt,设计移动抓取任务?
解答:
任务目标: 复合机器人(移动底盘+机械臂)自主完成:导航到抓取台 → 抓取方块 → 导航到放置台 → 释放方块。
系统组成:
- Gazebo:物理仿真环境,机器人、工作台、待抓取方块。
- Nav2:底盘定位、路径规划、自主导航避障。
- MoveIt2:机械臂逆解、无碰撞轨迹规划、夹爪控制。
- ROS2状态机:任务调度,实现导航与机械臂动作互斥(底盘移动时机械臂锁定;机械臂作业时底盘静止)。
- TF2:坐标系转换,完成全局地图坐标与机械臂基座坐标转换。
任务流程:
- 系统启动,加载仿真环境、Nav2、MoveIt2,机器人处于初始安全位姿。
- 调用Nav2,发送抓取工作台目标点,机器人自主导航、避障行驶至抓取台,到达后底盘锁止。
- 调度节点启动MoveIt2:机械臂运动至物体上方,下降,夹爪闭合抓取方块,抬升物体。
- 抓取完成,再次调用Nav2,导航至放置工作台,底盘停止。
- MoveIt2规划轨迹,机械臂下放方块,夹爪打开,机械臂退回安全姿态。
- 任务结束。
关键优化要点:
- 动作互锁:使用状态机保证导航和机械臂不会同时动作,防止碰撞。
- 坐标校准 :依靠TF2转换方块在
map坐标系和机械臂base_link坐标系的位姿。抓取物体后,将方块绑定在机械臂末端,更新MoveIt规划场景,避免碰撞误检。 - 参数优化:Nav2合理设置到达容差,保证停靠位置精度;适当降低停靠速度。MoveIt2调整速度、加速度缩放系数;预留充足规划时间。
- 容错设计:导航失败/机械臂规划失败时,停止任务并报警。
实验预期结果: 机器人能够自主避开障碍物,导航到达目标工作台;机械臂规划无碰撞轨迹,稳定抓取方块;携带物体导航至放置点,完成物体放置,全程无碰撞。
ROS1与ROS2深度对比
| 对比项 | ROS1 Kinetic | ROS2 Lyrical |
|---|---|---|
| 框架名称 | MoveIt! (moveit_ros) |
MoveIt2 |
| 配置方式 | Setup Assistant生成大量配置 | Python脚本 + launch文件 |
| 与导航结合 | 较松散 | 与Nav2紧密集成 |
| 实时控制 | 一般 | DDS支持,多线程规划执行 |
| 规划器 | OMPL, RRTConnect | OMPL, RRTConnect等,支持并行 |
实验七:ROS1/ROS2外设使用
内容: 使用游戏手柄、使用RGBD传感器、摄像头驱动、与OpenCV库、标定摄像头、视觉里程计、点云库、可视化点云、滤波和缩减采样、配准与匹配、点云分区。
实验时间与截图时间戳说明

- 截图10(鼠标遥控):系统时间 Oct 5 11:08 ,终端标签 3:08 。
- Mouse Teleop窗口显示:
v = 0.35 m/s,w = 19.25 deg/s。 - rqt_graph显示计算图:
/mouse_teleop→/turtle1/cmd_vel→/turtlesim。
- Mouse Teleop窗口显示:
- 截图11(蝴蝶绘制):系统时间 Oct 5 11:25 ,终端标签 3:25 。
- 终端提示:"当前速度:100,输入新速度(1.0-200.0,回车生效,输入0保持当前值):"。
- 文档中手柄实验时间戳:
[INFO] [1785188131.610344171] [joy_node]: Opened joystick: GreenAsia Inc. USB Joystick. deadzone: 0.0500。
实验记录(70分)
1. 鼠标遥控(teleop_tools)
运行:
bash
ros2 run mouse_teleop mouse_teleop
mouse_teleop节点读取鼠标位置,直接输出Twist速度指令。- 通过
rqt_graph看到:/mouse_teleop发布/turtle1/cmd_vel,/turtlesim订阅该话题。 - 界面显示线速度
v=0.35 m/s,角速度w=19.25 deg/s。 - 小乌龟在屏幕上画出折线轨迹,验证遥控指令有效。
2. 游戏手柄遥控
运行:
bash
ros2 run joy joy_node
输出:
[INFO] [1785188131.610344171] [joy_node]: Opened joystick: GreenAsia Inc. USB Joystick. deadzone: 0.0500
所有数据都被加上时间标签:
sec: 1785190276nanosec: 845294638frame_id: joy
原理:
joy_node读取手柄硬件,持续发布/joy话题(摇杆axes、按键buttons)。- 自定义节点订阅
/joy,把摇杆偏移量转换成小乌龟的线速度、角速度,发布/turtle1/cmd_vel,驱动小乌龟移动。
3. 用到软件库
- joy :ROS2官方手柄驱动包,读取手柄按键、摇杆数据,发布
/joy话题。 - turtlesim:小乌龟仿真包。
- rclpy:ROS2 Python客户端库,编写手柄消息订阅+速度指令发布的转换节点。
- teleop_tools(mouse_teleop) :ROS2官方遥控工具集,
mouse_teleop节点读取鼠标位置,输出Twist速度指令。
思考题(30分)
问题: 使用游戏手柄控制Turtlesim小乌龟。
解答:
使用joy软件包读取游戏手柄输入,joy_node节点采集摇杆与按键信息并发布/joy话题;自定义ROS2节点订阅手柄话题,将摇杆信号转换为速度指令cmd_vel,发送给turtlesim,从而实现游戏手柄遥控小乌龟运动。
用到软件库:
- joy :ROS2官方手柄驱动包,读取游戏手柄按键、摇杆数据,发布
/joy话题(截图里运行的joy_node)。 - turtlesim:小乌龟仿真包。
- rclpy:ROS2 Python客户端库,用来编写手柄消息订阅+速度指令发布的转换节点。
原理:
joy_node读取手柄硬件,持续发布/joy话题(摇杆axes、按键buttons);自定义节点订阅/joy,把摇杆的偏移量转换成小乌龟的线速度、角速度,发布/turtle1/cmd_vel,驱动小乌龟移动。
ROS1与ROS2深度对比
| 对比项 | ROS1 Kinetic | ROS2 Lyrical |
|---|---|---|
| 手柄驱动 | joy |
joy(API基本一致) |
| 鼠标遥控 | teleop_tools |
teleop_tools |
| 时间戳 | 自1970年秒+纳秒 | 标准化builtin_interfaces/Time |
| 多传感器同步 | 较弱 | 强,支持rosbag2时序录制回放 |
| 图像/点云 | cv_bridge, pcl_ros |
cv_bridge, pcl_conversions,零拷贝传输 |
| 数据录制 | rosbag |
rosbag2 |
实验总结
本次实验基于ROS1 Kinetic环境完成了从基础入门、架构理解、调试工具、3D建模、导航、MoveIt到外设接入的全流程操作。通过对比发现:
- 通信机制 :ROS1依赖中心化
roscore和TCP/IP;ROS2采用去中心化DDS,实时性、容错性、多机协同能力更强。 - 构建系统 :ROS1使用
catkin;ROS2全面转向colcon,支持Python/C++混合编译。 - 导航栈 :ROS1使用
move_base;ROS2升级为Nav2,引入行为树和生命周期节点,参数配置更清晰。 - MoveIt :ROS1使用MoveIt!;ROS2升级为MoveIt2,与Nav2集成更紧密,支持实时控制。
- 调试工具 :ROS1依赖
rostopic、rosservice、rqt;ROS2升级为ros2 topic、ros2 service、ros2 param,并新增ros2 doctor。 - 时间戳与同步 :ROS2对每条消息附加标准化时间标签,强调多传感器时间对齐,支持
rosbag2时序录制回放,保证感知、控制逻辑的时间一致性。 - 实验时间记录 :截图中的系统时间(Oct 5 10:10 ~ 11:25)、终端标签时间(2:06:43 ~ 3:25)、ROS时间戳(如
02:24:54.780227298、1791169018.802540588)完整反映了实验操作时序,也体现了ROS时间与系统时间的对应关系。
ROS2在现代化重构后,更适合多机协同、实时控制和工业级部署,是未来机器人开发的主流方向。