ROS系列(二):别光看!5分钟动手搞定ROS第一个机器人 ---小乌龟实战
引言
ROS(Robot Operating System)是机器人应用开发的得力助手,其核心价值在于实现机器人软件的模块化,便于代码复用和多机器人协同,解决了复杂机器人系统开发难题。ROS1 与 ROS2 最大区别在于通信机制,ROS1 主要是主从通信,ROS2 则采用分布式通信架构。在开发环境搭建上,推荐 ROS1 Noetic 配合 Ubuntu 20.04,通过一键安装、验证及更新软件列表步骤,能快速搭建起开发平台。而第一个程序 “控制小乌龟”,通过启动 turtlesim 节点、用 rostopic pub 命令控制乌龟移动,以及查看节点与话题,让我们深入理解了话题通信机制。ROS 的节点、话题、服务、消息等关键概念贯穿其中,为后续深入学习机器人开发奠定了坚实基础。
最后,如果大家喜欢我的创作风格,请大家多多关注up主,你们的支持就是我创作最大的动力!如果各位观众老爷觉得我哪些地方需要改进,请一定在评论区告诉我,马上改!在此感谢大家了。
各位观众老爷,本文通俗易懂,快速熟悉ROS,收藏本文,关注up不迷路,后续将持续分享ROS纯干货(请观众老爷放心,绝对又干又通俗易懂)。请多多关注、收藏、评论,评论区等你~~~
一、 ROS是什么?
1.1. 机器人操作系统核心价值 — 为什么需要ROS?
-
问题:为什么需要ROS?
- 传统机器人开发痛点:
- 硬件驱动、感知算法、控制逻辑需重复开发
- 模块间通信混乱(串口/UDP自定义协议)
- 缺乏标准化工具(仿真、可视化)
- 传统机器人开发痛点:
-
ROS的解决方案:
- 提供通信中间件:标准化数据传输(Topic/Service)
- 模块化设计:节点(Node)独立开发,松耦合
- 丰富工具链:RViz(3D可视化)、Gazebo(仿真)、rqt(调试)
- 开源生态:数千个可复用功能包(导航、机械臂控制)
1.2 ROS1 vs ROS2 一句话区别
| 特性 | ROS1 | ROS2 |
|---|---|---|
| 通信架构 | 中心化(依赖Master节点) | 去中心化(DDS协议) |
| 实时性 | 不支持 | 支持 |
| 适用场景 | 教学/研究/非实时机器人 | 工业/自动驾驶/多机器人系统 |
注释: 初学者建议:从 ROS1 入门,资料丰富且社区成熟!
1.3 典型应用场景展示
- 扫地机器人:
- 动图展示:激光雷达构建地图 → 路径规划 → 自动避障

- 机械臂抓取(MoveIt!):
- 动图展示:摄像头识别物体 → 运动规划 → 抓取放置

- 无人机编队:
- 动图展示:多机协同飞行

二、快速搭建ROS1开发环境
注释: 尽可能不在系统环境下进行测试,所以我们使用docker容器进行学习ros !
2.1 选择ROS版本(推荐Noetic + Ubuntu 20.04)
首先使用docekr拉取镜像 docker pull 指令:
拉取 ROS:Noetic :
docker pull osrf/ros:humble-desktop-full
拉取 Ubuntu:20.04 :
docker pull ubuntu:20.04
检查拉取:
docker imgaes
| REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
|---|---|---|---|---|
| osrf/ros | noetic-desktop-full | (一堆数字和字母) | (时间) | 4.56GB |
| ubuntu | 20.04 | (一堆数字和字母) | (时间) | 72.8MB |
2.2 一键安装ROS
创建容器,并命名为 ros1 :
# 创建容器并启动
docker run -itd \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=$DISPLAY \
--network host --privileged=true \
--name ros1 \
osrf/ros:noetic-desktop-full \
/bin/bash
# 此时已经进入容器,设置.bashrc文件,自动初始化ROS
echo "source /ros_entrypoint.sh" >> ~/.bashrc
source ~/.bashrc
# 退出容器
exit
2.3 验证安装成功并更新软件列表
rosversion -d
#输出
noetic
更新软件列表并安装qtwayland5(跑小乌龟用):
apt-get update
apt-get upgrade
apt-get install qtwayland5
三、第一个ROS程序:控制小乌龟
3.1 启动turtlesim节点(可视化窗口)
-
打开三个终端窗口:
- 终端1:运行ROS核心服务
- 终端2:运行乌龟可视化程序
- 终端3:运行控制程序
-
启动ROS核心服务(必须首先运行):
# 终端1 roscore- 输出示例:
... logging to /home/user/.ros/log/9cf88c9a-... started core service [/rosout] - 作用:ROS的"大脑",管理节点间的通信
- 输出示例:
-
启动乌龟可视化节点:
# 终端2 rosrun turtlesim turtlesim_node- 这时会出现一个蓝色背景窗口,中间有一只乌龟
- 节点概念:
turtlesim_node是一个独立的程序(节点),负责:- 可视化乌龟
- 维护乌龟的位置状态
- 接收运动指令并更新位置
-
启动键盘控制节点:
# 终端3 rosrun turtlesim turtle_teleop_key- 终端会显示提示:
Control Your Turtle! --------------------------- Moving around: w a s d x w/x : increase/decrease linear velocity a/d : increase/decrease angular velocity space key : force stop - 操作:在此终端按方向键控制乌龟移动(确保光标在此窗口)
- 终端会显示提示:
3.2 使用rostopic pub命令控制乌龟移动(理解话题通信)
-
查看控制话题:
rostopic list | grep cmd_vel # 输出:/turtle1/cmd_vel- 这是控制乌龟运动的话题
-
查看话题消息类型:
rostopic type /turtle1/cmd_vel # 输出:geometry_msgs/Twist -
查看消息结构:
rosmsg show geometry_msgs/Twistgeometry_msgs/Vector3 linear float64 x # 前进/后退速度 (m/s) float64 y # 左右平移速度 (m/s) float64 z # 上升/下降速度 (m/s) geometry_msgs/Vector3 angular float64 x # 绕X轴旋转 (rad/s) float64 y # 绕Y轴旋转 (rad/s) float64 z # 绕Z轴旋转 (rad/s)- 乌龟是2D运动,所以只需关注:
linear.x:前进/后退速度angular.z:旋转速度
- 乌龟是2D运动,所以只需关注:
-
发布移动命令:
# 让乌龟以0.5m/s速度前进 rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear: x: 0.5 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0"- 乌龟会持续直线前进,直到按Ctrl+C停止
-
发布旋转命令:
# 让乌龟原地旋转 (0.5rad/s ≈ 28.6度/秒) rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.5" -
组合运动:
# 让乌龟画弧线前进 rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear: x: 0.3 angular: z: 0.2" -
连续发送命令:
# 每0.1秒发送一次命令,持续发送 rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear: {x: 0.2}"
3.3 使用rosnode list/rostopic list查看节点与话题
节点管理工具:
-
查看所有活跃节点:
rosnode list/rosout /teleop_turtle /turtlesim/rosout:日志记录节点(roscore自动启动)/teleop_turtle:键盘控制节点/turtlesim:乌龟可视化节点
-
查看节点详细信息:
rosnode info /turtlesimNode [/turtlesim] Publications: * /rosout [rosgraph_msgs/Log] * /turtle1/color_sensor [turtlesim/Color] * /turtle1/pose [turtlesim/Pose] Subscriptions: * /turtle1/cmd_vel [geometry_msgs/Twist] Services: * /clear * /kill * /reset * /spawn * /turtle1/set_pen * /turtle1/teleport_absolute * /turtle1/teleport_relative * /turtlesim/get_loggers * /turtlesim/set_logger_level
话题管理工具:
-
查看所有活跃话题:
rostopic list/rosout /rosout_agg /turtle1/cmd_vel /turtle1/color_sensor /turtle1/pose -
查看话题详细信息:
rostopic info /turtle1/cmd_velType: geometry_msgs/Twist Publishers: * /teleop_turtle (http://user-pc:42846/) Subscribers: * /turtlesim (http://user-pc:42936/) -
实时查看话题数据:
# 监控乌龟位置 rostopic echo /turtle1/posex: 5.544445 y: 5.544445 theta: 0.0 linear_velocity: 0.0 angular_velocity: 0.0 --- x: 5.544445 y: 5.544445 theta: 0.0 -
查看话题发布频率:
rostopic hz /turtle1/poseaverage rate: 62.500 min: 0.016s max: 0.016s std dev: 0.00007s window: 62
四、关键概念总结
| 概念 | 命令示例 | 功能说明 |
|---|---|---|
| 节点(Node) | rosnode list |
独立执行的程序单元 |
| 话题(Topic) | rostopic list |
节点间通信的数据通道 |
| 消息(Message) | rosmsg show |
话题传递的数据格式 |
| 发布(Publisher) | rostopic pub |
向话题发送数据 |
| 订阅(Subscriber) | rostopic echo |
从话题接收数据 |
能够看到这里的观众老爷,无疑是对up的最大肯定和支持,在此恳求各位观众老爷能够多多点赞、收藏和关注。在这个合集中,未来将持续给大家分享关于Docker的多种常见开发实用操作。未来也将继续分享Docker、conda、ROS等等各种实用干货。感谢大家支持!
往期回顾 — 往期专栏 和 系列博文
本期专栏:
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐




所有评论(0)