基于Ubuntu 18.04与ROS Melodic:从零构建话题通信并驱动Turtlesim绘制几何轨迹

张开发
2026/4/9 3:15:20 15 分钟阅读

分享文章

基于Ubuntu 18.04与ROS Melodic:从零构建话题通信并驱动Turtlesim绘制几何轨迹
1. 环境准备与ROS安装在开始ROS开发之前我们需要先搭建好基础环境。Ubuntu 18.04是ROS Melodic官方推荐的操作系统版本这个组合经过充分测试稳定性有保障。我建议使用全新安装的Ubuntu系统避免之前安装的软件包造成冲突。安装ROS Melodic其实很简单只需要几条命令就能搞定。首先打开终端CtrlAltT依次执行以下命令sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install ros-melodic-desktop-full安装完成后一个容易忽略但非常重要的步骤是初始化rosdep。这个工具用于安装系统依赖很多新手都会在这里卡住。执行以下命令sudo rosdep init rosdep update为了让ROS命令在任意终端都能使用还需要将ROS环境变量添加到bashrc中echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc验证安装是否成功可以尝试运行roscore命令。如果看到类似下面的输出说明ROS核心系统已经正常运行... logging to /home/username/.ros/log/xxxxx started core service [/rosout]2. 创建工作空间与功能包ROS的工作空间是项目开发的基础容器相当于一个独立的编译环境。我习惯在home目录下创建名为catkin_ws的工作空间这个命名是ROS社区的惯例。创建工作空间的完整流程如下mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make执行完这些命令后你会看到工作空间下生成了build和devel两个文件夹。devel文件夹中的setup.bash特别重要每次打开新终端都需要先source它source ~/catkin_ws/devel/setup.bash接下来创建功能包。假设我们要开发一个控制小乌龟的功能包命名为turtle_controlcd ~/catkin_ws/src catkin_create_pkg turtle_control roscpp rospy std_msgs geometry_msgs这个命令创建了一个包含基本依赖的功能包。roscpp和rospy分别是C和Python的ROS客户端库std_msgs提供标准消息类型geometry_msgs则包含几何相关的消息类型比如控制小乌龟移动需要的Twist消息。3. 实现话题通信ROS的核心通信机制之一就是话题Topic。让我们通过一个简单的发布-订阅例子来理解这个概念。想象话题就像是一个公告板发布者Publisher把信息贴在板上订阅者Subscriber从板上读取信息。首先创建发布者节点。在turtle_control包的src目录下创建talker.cpp#include ros/ros.h #include std_msgs/String.h int main(int argc, char **argv) { ros::init(argc, argv, talker); ros::NodeHandle nh; ros::Publisher pub nh.advertisestd_msgs::String(chatter, 10); ros::Rate loop_rate(10); int count 0; while (ros::ok()) { std_msgs::String msg; msg.data hello world std::to_string(count); ROS_INFO(Publishing: %s, msg.data.c_str()); pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); } return 0; }对应的订阅者节点listener.cpp#include ros/ros.h #include std_msgs/String.h void chatterCallback(const std_msgs::String::ConstPtr msg) { ROS_INFO(I heard: [%s], msg-data.c_str()); } int main(int argc, char **argv) { ros::init(argc, argv, listener); ros::NodeHandle nh; ros::Subscriber sub nh.subscribe(chatter, 10, chatterCallback); ros::spin(); return 0; }为了让这些节点能够编译需要在CMakeLists.txt中添加add_executable(talker src/talker.cpp) target_link_libraries(talker ${catkin_LIBRARIES}) add_executable(listener src/listener.cpp) target_link_libraries(listener ${catkin_LIBRARIES})编译并运行测试cd ~/catkin_ws catkin_make source devel/setup.bash # 终端1 roscore # 终端2 rosrun turtle_control talker # 终端3 rosrun turtle_control listener4. 控制Turtlesim绘制圆形轨迹现在进入最有趣的部分 - 控制小乌龟画圆Turtlesim是ROS内置的简单仿真器非常适合学习机器人控制原理。首先需要理解小乌龟的控制接口。它订阅/turtle1/cmd_vel话题接收geometry_msgs/Twist类型的消息。这个消息包含线速度和角速度linear.x前进速度m/sangular.z旋转速度rad/s要让小乌龟画圆需要同时给线速度和角速度。创建draw_circle.cpp#include ros/ros.h #include geometry_msgs/Twist.h int main(int argc, char **argv) { ros::init(argc, argv, circle_controller); ros::NodeHandle nh; ros::Publisher vel_pub nh.advertisegeometry_msgs::Twist(/turtle1/cmd_vel, 10); ros::Rate loop_rate(10); while (ros::ok()) { geometry_msgs::Twist vel_msg; vel_msg.linear.x 2.0; // 前进速度 vel_msg.angular.z 1.5; // 旋转速度 vel_pub.publish(vel_msg); ros::spinOnce(); loop_rate.sleep(); } return 0; }同样地在CMakeLists.txt中添加add_executable(draw_circle src/draw_circle.cpp) target_link_libraries(draw_circle ${catkin_LIBRARIES})运行步骤# 终端1 roscore # 终端2 rosrun turtlesim turtlesim_node # 终端3 rosrun turtle_control draw_circle你会看到小乌龟开始画出一个漂亮的圆形轨迹。调整linear.x和angular.z的比例可以改变圆的半径。这个简单的例子展示了ROS机器人控制的基本原理 - 通过发布适当的控制指令来驱动机器人运动。5. 调试与优化在实际操作中可能会遇到各种问题。这里分享几个我踩过的坑和解决方法找不到功能包确保每次在新终端中都先source了setup.bash文件。可以把这个命令加到.bashrc中自动执行。消息不匹配发布和订阅的消息类型必须完全一致。使用rostopic info /topic_name检查话题类型。控制不精确Turtlesim的运动会有微小误差这是正常的仿真现象。如果需要精确控制可以考虑使用PID控制器。编译错误最常见的CMake错误是忘记添加依赖。在CMakeLists.txt中确保find_package包含了所有需要的依赖。一个实用的调试技巧是使用rqt_graph查看节点和话题的连接情况rosrun rqt_graph rqt_graph这个工具会生成一个可视化的通信图帮助你理解各个组件之间的关系。当系统不按预期工作时这是排查问题的第一站。6. 扩展功能掌握了基础之后可以尝试一些更有挑战性的扩展参数化控制通过ROS参数服务器动态调整圆的半径和速度ros::NodeHandle nh; double linear_vel, angular_vel; nh.paramdouble(linear_vel, linear_vel, 2.0); nh.paramdouble(angular_vel, angular_vel, 1.5);绘制复杂轨迹通过改变速度指令序列让小乌龟画出更复杂的图形比如8字形或方形。添加GUI控制使用rqt创建简单的控制面板实时调整运动参数。多乌龟控制Turtlesim支持同时控制多只乌龟每只乌龟有自己独立的话题。这些扩展不仅能加深对ROS的理解还能为更复杂的机器人项目打下基础。我在实际项目中发现掌握好这些基础通信机制后扩展到真实机器人上会顺利很多。

更多文章