问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ROS应用之基于PID控制的机器人运动控制调试与优化

创作时间:
作者:
@小白创作中心

ROS应用之基于PID控制的机器人运动控制调试与优化

引用
CSDN
1.
https://blog.csdn.net/hcx25909/article/details/144826722

PID(比例-积分-微分)控制是一种经典的反馈控制算法,在机器人领域有着广泛的应用。本文将深入探讨基于PID控制的机器人底盘速度调节,包括其原理、实现细节、在ROS中的应用、代码实现与调试技巧。通过本文,读者将能够掌握PID控制的基本概念,并能够在实际项目中应用这一技术。

原理介绍

基本概念

PID控制通过误差反馈机制计算控制量,使系统的输出尽可能接近目标值。PID控制器的数学公式如下:

  • 误差 e(t):定义为目标值 r(t) 与当前值 y(t) 的差值: e(t)=r(t)−y(t)
  • 控制量 u(t):作用于被控对象的指令(如电机转速)。
  • 比例项 Kp:按当前误差值放大控制信号。
  • 积分项 Ki:累积历史误差以消除系统稳态误差。
  • 微分项 Kd:预测误差变化趋势以减小超调。

整体流程

  1. 误差计算:从目标值与当前状态中获得误差。
  2. PID运算:结合比例、积分和微分的计算生成控制量。
  3. 控制量输出:将控制信号传递到执行机构。
  4. 状态更新:通过传感器实时测量反馈数据。

关键特点

  • 灵活调参:通过调整 Kp、Ki、Kd 实现不同控制性能。
  • 低计算成本:适用于嵌入式系统和实时性要求高的场景。
  • 强鲁棒性:能有效应对噪声和非线性干扰。

算法流程解析

PID控制器的具体步骤如下:

  1. 初始化目标值 r(t) 和 PID 参数 Kp、Ki、Kd。
  2. 获取传感器反馈 y(t),计算误差: e(t)=r(t)−y(t)
  3. 计算控制量:
  • 比例项
  • 积分项(误差累积):
  • 微分项(误差变化率):

  1. 合成控制信号:
  2. 输出控制信号并更新误差值。
  3. 重复上述过程,形成闭环控制。

控制性能分析

  • 比例控制:响应速度快,但稳态误差无法消除。
  • 积分控制:消除稳态误差,但可能引入振荡。
  • 微分控制:改善动态性能,减小超调。

调整 PID 参数时需权衡三者的权重,以达到最优效果。

部署环境介绍

硬件

  • 机器人底盘:支持差速驱动(如 TurtleBot3)。
  • 编码器:测量车轮速度,用于闭环反馈。
  • 电机驱动:执行速度控制命令。

软件

  • 操作系统:Ubuntu 20.04。
  • ROS版本:ROS 2 Foxy。
  • 开发工具:C++(使用 rclcpp 库)。
  • 依赖包:
  • nav_msgs:获取里程计信息。
  • geometry_msgs:发布速度指令。

部署流程

1. 创建 ROS 包

创建一个名为 pid_controller 的 ROS 包:

ros2 pkg create --build-type ament_cmake pid_controller

2. 编辑 CMakeLists.txt

确保引入必要的依赖:

find_package(rclcpp REQUIRED)
find_package(nav_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
add_executable(pid_node src/pid_node.cpp)
ament_target_dependencies(pid_node rclcpp nav_msgs geometry_msgs)
install(TARGETS pid_node DESTINATION lib/${PROJECT_NAME})

3. 编写主程序

在 src/pid_node.cpp 中实现 PID 控制逻辑:

#include <rclcpp/rclcpp.hpp>
#include <geometry_msgs/msg/twist.hpp>
#include <nav_msgs/msg/odometry.hpp>
class PIDController : public rclcpp::Node {
public:
 PIDController() : Node("pid_controller") {
 cmd_pub_ = this->create_publisher<geometry_msgs::msg::Twist>("/cmd_vel", 10);
 odom_sub_ = this->create_subscription<nav_msgs::msg::Odometry>(
 "/odom", 10, std::bind(&PIDController::odomCallback, this, std::placeholders::_1));
 target_speed_ = 0.5; // 目标速度
 kp_ = 2.0; // 比例系数
 ki_ = 0.5; // 积分系数
 kd_ = 0.1; // 微分系数
 error_sum_ = 0.0;
 last_error_ = 0.0;
 }
private:
 void odomCallback(const nav_msgs::msg::Odometry::SharedPtr msg) {
 double current_speed = msg->twist.twist.linear.x;
 double error = target_speed_ - current_speed;
 // PID计算
 error_sum_ += error;
 double delta_error = error - last_error_;
 double control = kp_ * error + ki_ * error_sum_ + kd_ * delta_error;
 // 发布速度命令
 geometry_msgs::msg::Twist cmd_msg;
 cmd_msg.linear.x = control;
 cmd_pub_->publish(cmd_msg);
 last_error_ = error;
 }
 rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr cmd_pub_;
 rclcpp::Subscription<nav_msgs::msg::Odometry>::SharedPtr odom_sub_;
 double target_speed_;
 double kp_, ki_, kd_;
 double error_sum_, last_error_;
};

4. 编译和运行

colcon build
source install/setup.bash
ros2 run pid_controller pid_node

代码解读

  1. PID 参数初始化
  • 设置 Kp=2.0K_p = 2.0、Ki=0.5K_i = 0.5、Kd=0.1K_d = 0.1。
  • 确定目标速度 target_speedtarget_speed 为 0.5 m/s。
  1. 速度反馈与误差计算
  • 使用 /odom 主题提供的线速度计算误差 e(t)e(t)。
  1. PID 控制器计算
  • 累积积分误差 error_sum_。
  • 根据公式生成控制量 u(t)u(t)。
  1. 指令发布
  • 将计算得到的控制量作为速度命令发布到 /cmd_vel 主题。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号