
🎬 渡水无言 :个人主页渡水无言
❄专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》
❄专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》
❄专栏传送门 :《产品测评专栏》 《Ai智能体专栏) 《ROS开发专栏》
⭐️流水不争先,争的是滔滔不绝
📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生
| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生
在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连
目录
前言
前几期博客我们已经完成了ROS2的编程基础,包括节点与软件包、话题通信、Launch,本期博客我们来完成机器人的运动控制。
一、机器人速度控制基础
对机器人的速度控制是通过向机器人的核心节点发送速度消息来实现的,这个消息的类型在ROS里已经有了定义,就是geometry_msgs::Twist。
Twist 消息结构(6 个速度)

linear: 线速度
x: 前后(+前 -后) y: 左右(很少用) z: 上下(很少用)
angular: 角速度
x: 滚转(不用) y: 俯仰(不用) z: 左右转(+左转 -右转)
我们只需要控制两个值:
linear.x:前进速度。
angular.z:转向速度。
二、机器人运动控制的实现
本此实验实现一个发布者节点,如下图所示,向"/cmd_vel"话题发布geometry_msgs::Twist类型的消息包。以此来实现对机器人运动速度的控制。

步骤如下:创建包 → 创建节点 → 创建发布者 → 构建消息 → 循环发布
2.1、创建速度控制软件包
输入以下代码:
cpp
cd ~/ros2_zice/src
ros2 pkg create vel_pkg
2.2、编写速度控制节点
在 vel_pkg/src 新建 vel_node.cpp,输入如下代码:
cpp
#include <rclcpp/rclcpp.hpp>
#include <geometry_msgs/msg/twist.hpp> // 引入速度消息头文件
int main(int argc, char** argv)
{
// 初始化ROS2环境
rclcpp::init(argc, argv);
// 创建节点对象,节点名为"velocity_command_node"
auto node = std::make_shared<rclcpp::Node>("velocity_command_node");
// 创建发布者:话题名"/cmd_vel",消息类型为geometry_msgs::msg::Twist,队列长度10
auto vel_pub = node->create_publisher<geometry_msgs::msg::Twist>("/cmd_vel", 10);
// 定义速度消息变量
geometry_msgs::msg::Twist vel_msg;
// 设置速度值:前进0.1m/s,不转弯
vel_msg.linear.x = 0.1; // 线速度:前进
vel_msg.linear.y = 0.0;
vel_msg.linear.z = 0.0;
vel_msg.angular.x = 0.0;
vel_msg.angular.y = 0.0;
vel_msg.angular.z = 0.0; // 角速度:不转弯
// 设置循环频率:30Hz(每秒发送30次速度指令)
rclcpp::Rate loop_rate(30);
// 循环发布速度指令
while (rclcpp::ok())
{
vel_pub->publish(vel_msg); // 发布速度消息
loop_rate.sleep(); // 按设定频率延时
}
// 关闭ROS2环境
rclcpp::shutdown();
return 0;
}
2.3、编译配置
在CMakeLists.txt文件中输入如下代码:
cpp
cmake_minimum_required(VERSION 3.8)
project(vel_pkg)
# 编译选项设置
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# -------------------------- 依赖查找 --------------------------
# 必须先找基础依赖,顺序不能乱
find_package(ament_cmake REQUIRED) # ROS2编译工具链依赖
find_package(rclcpp REQUIRED) # ROS2 C++客户端库依赖
find_package(geometry_msgs REQUIRED) # 几何消息库依赖(Twist消息在这里)
# -------------------------- 节点编译 --------------------------
# 编译vel_node.cpp为可执行文件vel_node
add_executable(vel_node src/vel_node.cpp)
# 为vel_node链接所需的依赖库
ament_target_dependencies(vel_node
rclcpp
geometry_msgs
)
# -------------------------- 安装配置 --------------------------
# 将编译好的可执行文件安装到系统路径
install(TARGETS
vel_node
DESTINATION lib/${PROJECT_NAME}
)
# -------------------------- 测试配置 --------------------------
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
# 标记功能包为ament包,必须在最后一行
ament_package()
2.4、编写package.xml
输入如下代码:
cpp
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>vel_pkg</name>
<version>0.0.0</version>
<description>Robot velocity control package using /cmd_vel topic</description>
<maintainer email="duan@todo.todo">duan</maintainer>
<license>TODO: License declaration</license>
<!-- 编译工具依赖 -->
<buildtool_depend>ament_cmake</buildtool_depend>
<!-- 运行依赖:必须添加rclcpp和geometry_msgs -->
<depend>rclcpp</depend>
<depend>geometry_msgs</depend>
<!-- 测试依赖 -->
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
2.5、编译与节点自测
打开终端,输入以下指令:
cpp
cd ~/ros2_zice
# 清理旧缓存,避免编译出错
rm -rf build install log
# 编译功能包
colcon build
# 加载环境变量,让ROS2能找到我们的包
source install/setup.bash
自测,步骤如下:
cpp
# 终端1:运行速度发布节点
ros2 run vel_pkg vel_node
# 终端2:查看/cmd_vel话题的消息
ros2 topic echo /cmd_vel
能看到持续输出如图以下内容,说明节点正常工作:

三、仿真平台运行:让机器人动起来
首先得把wpr_simulation2下到ros2_zice文件夹中,然后回到工作空间根目录并编译并加载环境,代码如下:
cpp
cd ~/ros2_zice
colcon build
source install/setup.bash
再验证包是否安装成功
cpp
ros2 pkg list | grep wpr_simulation2
如下图所示:

再启动仿真平台
cpp
ros2 launch wpr_simulation2 wpb_simple.launch.py
如下图所示,机器人会往前启动

总结
本期博客我们完成了机器人的运动控制。