ROS Melodic 初体验用经典小乌龟项目理解ROS核心机制当你终于完成ROS Melodic的安装那种成就感一定很棒。但安装只是第一步真正的乐趣在于开始构建你的第一个机器人项目。本文将带你快速进入ROS的世界通过经典的turtlesim小乌龟仿真器项目理解ROS的核心概念和开发流程。1. 启动ROS核心理解roscore的作用在开始控制小乌龟之前我们需要先启动ROS的核心服务。打开终端输入roscore这个看似简单的命令实际上是ROS系统的基石。roscore启动后它会初始化以下关键组件ROS Master负责节点之间的命名和注册服务Parameter Server存储参数和配置信息rosout集中处理所有节点的日志输出提示roscore必须保持运行状态它是所有ROS节点通信的中枢。如果关闭roscore其他节点将无法正常通信。roscore启动后你会看到类似这样的输出... logging to /home/user/.ros/log/xxxxx/roslaunch-hostname-xxxxx.log Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is 1GB. started roslaunch server http://hostname:xxxxx/ ros_comm version 1.14.3 SUMMARY PARAMETERS * /rosdistro: melodic * /rosversion: 1.14.3 NODES auto-starting new master process[master]: started with pid [xxxxx] ROS_MASTER_URIhttp://hostname:11311/ setting /run_id to xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx process[rosout-1]: started with pid [xxxxx] started core service [/rosout]2. 启动小乌龟仿真器认识ROS节点保持roscore运行打开第二个终端输入rosrun turtlesim turtlesim_node这个命令启动了一个名为turtlesim_node的ROS节点。节点(Node)是ROS中最基本的执行单元可以理解为一个独立的程序或进程。turtlesim_node节点负责创建并显示小乌龟仿真环境维护小乌龟的状态位置、方向等提供控制小乌龟的接口启动后你会看到一个蓝色背景的窗口中间有一只小乌龟。窗口标题显示了ROS节点的名称通常是/turtlesim。2.1 理解节点名称和命名空间ROS节点有完整的命名规则全局名称以斜杠(/)开头如/turtlesim相对名称不以斜杠开头ROS会自动将其解析为相对名称私有名称以波浪线(~)开头通常用于节点内部的参数你可以通过rosnode命令查看当前运行的节点rosnode list这会显示类似如下的输出/rosout /turtlesim3. 控制小乌龟理解ROS话题现在让我们让小乌龟动起来。打开第三个终端输入rosrun turtlesim turtle_teleop_key这个命令启动了另一个节点turtle_teleop_key它允许你通过键盘控制小乌龟。按照终端中的提示使用方向键控制小乌龟移动。3.1 话题(Topic)机制解析turtle_teleop_key和turtlesim_node之间通过ROS话题(Topic)进行通信turtle_teleop_key发布(Publish)控制命令到/turtle1/cmd_vel话题turtlesim_node订阅(Subscribe)这个话题接收控制命令你可以使用rostopic命令查看当前活跃的话题rostopic list典型输出可能包括/rosout /rosout_agg /turtle1/cmd_vel /turtle1/color_sensor /turtle1/pose3.2 查看话题内容要查看/turtle1/cmd_vel话题上传输的具体消息可以使用rostopic echo /turtle1/cmd_vel当按下方向键时你会看到类似这样的消息linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 ---这些数据表示小乌龟的线速度和角速度。4. 可视化ROS系统使用rqt_graph为了更直观地理解节点和话题之间的关系ROS提供了rqt_graph工具。在终端中输入rqt_graph这会显示一个图形化界面清晰地展示当前运行的节点和它们之间的通信关系。在我们的例子中你会看到turtle_teleop_key节点turtlesim_node节点它们之间通过/turtle1/cmd_vel话题连接4.1 理解ROS计算图ROS系统可以看作是一个计算图(Computation Graph)由以下元素组成节点执行具体任务的进程话题节点间传输数据的通道服务请求-响应式的通信机制参数服务器存储共享配置信息rqt_graph工具帮助我们可视化这个计算图对于理解复杂系统特别有用。5. 深入探索小乌龟仿真器现在你已经掌握了基本操作让我们进一步探索turtlesim的功能。5.1 使用ROS服务除了话题ROS还提供了服务(Service)机制。服务允许节点之间进行请求-响应式的通信。查看可用的服务rosservice list你会看到类似如下的输出/clear /kill /reset /rosout/get_loggers /rosout/set_logger_level /spawn /turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative /turtlesim/get_loggers /turtlesim/set_logger_level尝试调用/spawn服务创建第二只小乌龟rosservice call /spawn x: 5.0 y: 5.0 theta: 0.0 name: turtle2如果成功仿真窗口中会出现第二只小乌龟。5.2 使用ROS参数ROS参数服务器存储了各种配置信息。查看当前参数rosparam list尝试获取背景颜色参数rosparam get /turtlesim/background_b你可以修改这个参数来改变背景颜色rosparam set /turtlesim/background_b 0 rosservice call /clear6. 记录和回放数据使用rosbagROS提供了rosbag工具可以记录和回放话题数据。记录当前会话rosbag record -a -O my_turtle.bag这会记录所有话题的数据到my_turtle.bag文件。停止记录后可以回放rosbag play my_turtle.bag回放时你会看到小乌龟重复之前的运动轨迹。7. 扩展练习自主控制小乌龟为了加深理解尝试编写一个简单的Python脚本控制小乌龟#!/usr/bin/env python import rospy from geometry_msgs.msg import Twist def move(): # 创建节点 rospy.init_node(my_turtle_controller) # 创建发布者 pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) # 创建Twist消息 move_cmd Twist() move_cmd.linear.x 1.0 # 前进速度 move_cmd.angular.z 1.0 # 旋转速度 # 设置循环频率 rate rospy.Rate(10) # 10Hz while not rospy.is_shutdown(): pub.publish(move_cmd) rate.sleep() if __name__ __main__: try: move() except rospy.ROSInterruptException: pass将脚本保存为my_controller.py赋予执行权限chmod x my_controller.py然后运行./my_controller.py你会看到小乌龟开始做圆周运动。