不止于安装:在Ubuntu 18.04上配置好ROS Melodic后,你的第一个机器人仿真项目该怎么做?

不止于安装:在Ubuntu 18.04上配置好ROS Melodic后,你的第一个机器人仿真项目该怎么做? 不止于安装在Ubuntu 18.04上配置好ROS Melodic后你的第一个机器人仿真项目该怎么做当你终于看到那只可爱的小乌龟在屏幕上缓缓爬行时那种成就感一定很特别吧但兴奋过后面对空荡荡的终端窗口你是否感到一丝迷茫——接下来我该做什么这正是大多数ROS新手都会遇到的安装后困惑期。别担心让我们把这份成就感延续下去一起迈出从安装到实际开发的第一步。ROS Melodic在Ubuntu 18.04上的安装只是你机器人开发之旅的起点。真正的乐趣在于开始构建自己的项目。本文将带你完成三个关键跃迁从运行演示到创建自己的ROS包从使用预置节点到编写自定义发布者/订阅者从基础测试到Gazebo仿真环境搭建。我们会避开那些华而不实的理论直接动手创建一个能实际工作的简单项目。1. 从零创建你的第一个ROS工作空间在开始任何ROS项目前你都需要一个专属的工作空间(workspace)。这就像是为你的代码搭建一个整洁的房间所有相关文件都会井然有序地存放在这里。让我们从最基础的catkin工作空间开始。打开终端依次执行以下命令来创建并初始化工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make这组命令完成了三件事在用户主目录下创建了catkin_ws/src目录结构进入工作空间根目录使用catkin_make初始化工作空间初始化完成后你需要让系统知道这个工作空间的存在。执行以下命令将工作空间添加到ROS环境source devel/setup.bash为了让这个设置永久生效避免每次打开新终端都要重新source可以把这行命令添加到你的.bashrc文件中echo source ~/catkin_ws/devel/setup.bash ~/.bashrc常见问题排查如果遇到catkin_make: command not found错误说明你可能漏装了构建工具可以通过sudo apt install ros-melodic-catkin来修复工作空间名称不一定非要是catkin_ws你可以使用任何喜欢的名称只需相应调整路径即可2. 创建并理解你的第一个ROS包ROS包(package)是ROS中的基本组织单元每个功能模块通常对应一个独立的包。让我们创建一个名为my_first_robot的简单包它将包含我们后续要开发的节点。在工作空间的src目录下运行以下命令创建包cd ~/catkin_ws/src catkin_create_pkg my_first_robot rospy std_msgs这个命令创建了一个包含基本结构的ROS包并指定它依赖rospy(Python ROS库)和std_msgs(标准消息类型)。让我们看看这个命令创建了哪些重要文件my_first_robot/ ├── CMakeLists.txt # 包的构建规则 ├── package.xml # 包的元数据和依赖声明 ├── scripts/ # (可选)Python脚本存放目录 ├── src/ # (可选)C源文件存放目录 └── include/ # (可选)C头文件存放目录现在我们需要构建这个新创建的包。回到工作空间根目录执行cd ~/catkin_ws catkin_make构建成功后你可以用以下命令验证包是否被ROS正确识别rospack find my_first_robot这应该返回你的包的完整路径/home/你的用户名/catkin_ws/src/my_first_robot。3. 编写简单的发布者(Publisher)和订阅者(Subscriber)理解了ROS包的结构后让我们实现ROS中最基础的通信模式——发布/订阅。我们将创建一个发布者节点定期发送消息一个订阅者节点接收并显示这些消息。首先在包中创建scripts目录如果尚未存在来存放Python脚本mkdir -p ~/catkin_ws/src/my_first_robot/scripts3.1 创建发布者节点使用你喜欢的文本编辑器创建talker.py文件#!/usr/bin/env python import rospy from std_msgs.msg import String def talker(): pub rospy.Publisher(chatter, String, queue_size10) rospy.init_node(talker, anonymousTrue) rate rospy.Rate(10) # 10hz while not rospy.is_shutdown(): hello_str hello world %s % rospy.get_time() rospy.loginfo(hello_str) pub.publish(hello_str) rate.sleep() if __name__ __main__: try: talker() except rospy.ROSInterruptException: pass给脚本添加可执行权限chmod x ~/catkin_ws/src/my_first_robot/scripts/talker.py3.2 创建订阅者节点在同一目录下创建listener.py文件#!/usr/bin/env python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo(rospy.get_caller_id() I heard %s, data.data) def listener(): rospy.init_node(listener, anonymousTrue) rospy.Subscriber(chatter, String, callback) rospy.spin() if __name__ __main__: listener()同样添加可执行权限chmod x ~/catkin_ws/src/my_first_robot/scripts/listener.py3.3 测试通信现在我们可以测试这两个节点的通信了。你需要打开三个终端窗口终端1- 启动ROS核心服务roscore终端2- 运行发布者节点rosrun my_first_robot talker.py终端3- 运行订阅者节点rosrun my_first_robot listener.py如果一切正常你应该能在发布者终端看到类似下面的输出[INFO] [1620000000.000000]: hello world 1620000000.00 [INFO] [1620000000.100000]: hello world 1620000000.10同时在订阅者终端看到接收到的消息[INFO] [1620000000.100000]: /listener_1234 I heard hello world 1620000000.104. 在Gazebo中加载并控制简单机器人模型现在你已经掌握了ROS的基础通信机制是时候进入更激动人心的部分——机器人仿真了。Gazebo是ROS中最常用的仿真工具我们将用它来加载一个简单的机器人模型并控制其运动。4.1 安装必要的Gazebo包首先确保你已安装Gazebo和相关ROS包sudo apt install ros-melodic-gazebo-ros-pkgs ros-melodic-gazebo-ros-control4.2 创建机器人URDF模型URDF(Unified Robot Description Format)是ROS中描述机器人模型的XML格式。在你的包中创建urdf目录mkdir -p ~/catkin_ws/src/my_first_robot/urdf然后创建简单的机器人模型文件my_robot.urdfrobot namemy_first_robot link namebase_link visual geometry box size0.2 0.1 0.1/ /geometry material nameblue color rgba0 0 0.8 1/ /material /visual /link /robot这个模型描述了一个简单的蓝色长方体作为我们的机器人。4.3 启动Gazebo并加载模型创建一个启动文件来简化Gazebo启动过程。在包中创建launch目录mkdir -p ~/catkin_ws/src/my_first_robot/launch然后创建my_robot_gazebo.launch文件launch !-- 启动Gazebo空世界 -- include file$(find gazebo_ros)/launch/empty_world.launch/ !-- 加载机器人模型 -- param namerobot_description textfile$(find my_first_robot)/urdf/my_robot.urdf / !-- 在Gazebo中生成机器人模型 -- node namespawn_urdf pkggazebo_ros typespawn_model args-param robot_description -urdf -model my_first_robot / /launch现在你可以用以下命令启动Gazebo并加载你的机器人模型roslaunch my_first_robot my_robot_gazebo.launchGazebo启动可能需要一些时间完成后你应该能看到一个蓝色长方体出现在空世界中。4.4 通过话题控制机器人位置虽然我们的简单模型还没有添加运动关节但我们可以通过直接发布位姿消息来移动它。创建一个新的Python脚本move_robot.py#!/usr/bin/env python import rospy from gazebo_msgs.msg import ModelState from gazebo_msgs.srv import SetModelState def move_robot(): rospy.init_node(move_robot, anonymousTrue) pub rospy.Publisher(/gazebo/set_model_state, ModelState, queue_size10) rate rospy.Rate(10) # 10Hz state_msg ModelState() state_msg.model_name my_first_robot state_msg.pose.position.x 0 state_msg.pose.position.y 0 state_msg.pose.position.z 0.5 while not rospy.is_shutdown(): state_msg.pose.position.x 0.05 if state_msg.pose.position.x 2: state_msg.pose.position.x -2 pub.publish(state_msg) rate.sleep() if __name__ __main__: try: move_robot() except rospy.ROSInterruptException: pass运行这个脚本你应该能看到Gazebo中的蓝色长方体开始水平移动rosrun my_first_robot move_robot.py