ROS开发专栏---机器人运动控制 ---适配Ubuntu 22.04

🎬 渡水无言个人主页渡水无言

专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》

专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏

专栏传送门《产品测评专栏》 《Ai智能体专栏) 《ROS开发专栏

⭐️流水不争先,争的是滔滔不绝

📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生

| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生

在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

目录

前言

一、机器人速度控制基础

二、机器人运动控制的实现

2.1、创建速度控制软件包

2.2、编写速度控制节点

2.3、编译配置

2.4、编写package.xml

2.5、编译与节点自测

三、仿真平台运行:让机器人动起来

总结


前言

前几期博客我们已经完成了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

如下图所示,机器人会往前启动


总结

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

相关推荐
tom021818 小时前
软考中级《嵌入式系统设计师》全套备考资料(真题 + 教材 + 笔记)
笔记·嵌入式·软考·自学·电子技术·电子资料·变成
番茄灭世神1 天前
PN学堂GD32教程第21篇——WiFiIOT
c语言·stm32·单片机·嵌入式·gd32
kobesdu1 天前
【ROS2实战笔记-23】参数系统中的动态参数与远程加载安全剖析
笔记·安全·slam·ros2
NPE~1 天前
[嵌入式]嵌入式在线仿真平台 —— Wokwi 入门指南
stm32·嵌入式·esp32·教程·平台
番茄灭世神1 天前
Vscode开发/调试ARM单片机最新教程
c语言·arm开发·vscode·stm32·嵌入式·gd32
lularible2 天前
从沙子到车辙(3.3):数据通路与控制器的“双人舞“
开源·嵌入式·汽车电子
lularible2 天前
从沙子到车辙(3.5):存储层次
开源·嵌入式·汽车电子
lularible2 天前
从沙子到车辙(3.4):流水线——指令级并行的艺术
开源·嵌入式·汽车电子
kyle~2 天前
ros_gz_bridge---底层通信的实现
c++·机器人·仿真·ros2