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:预测误差变化趋势以减小超调。
整体流程
- 误差计算:从目标值与当前状态中获得误差。
- PID运算:结合比例、积分和微分的计算生成控制量。
- 控制量输出:将控制信号传递到执行机构。
- 状态更新:通过传感器实时测量反馈数据。
关键特点
- 灵活调参:通过调整 Kp、Ki、Kd 实现不同控制性能。
- 低计算成本:适用于嵌入式系统和实时性要求高的场景。
- 强鲁棒性:能有效应对噪声和非线性干扰。
算法流程解析
PID控制器的具体步骤如下:
- 初始化目标值 r(t) 和 PID 参数 Kp、Ki、Kd。
- 获取传感器反馈 y(t),计算误差: e(t)=r(t)−y(t)
- 计算控制量:
- 比例项:
- 积分项(误差累积):
- 微分项(误差变化率):
- 合成控制信号:
- 输出控制信号并更新误差值。
- 重复上述过程,形成闭环控制。
控制性能分析
- 比例控制:响应速度快,但稳态误差无法消除。
- 积分控制:消除稳态误差,但可能引入振荡。
- 微分控制:改善动态性能,减小超调。
调整 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
代码解读
- 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。
- 速度反馈与误差计算:
- 使用 /odom 主题提供的线速度计算误差 e(t)e(t)。
- PID 控制器计算:
- 累积积分误差 error_sum_。
- 根据公式生成控制量 u(t)u(t)。
- 指令发布:
- 将计算得到的控制量作为速度命令发布到 /cmd_vel 主题。
热门推荐
双福街道:深化在职党员“双报到” 赋能社区治理“新活力”
晚晴捻军兴起及其山东防御措施:以围子城为例
保障宠物狗健康:疫苗接种的重要性与必要性
学会这4招,正确护眼
东方之美的器具之究:一地一“烧”
茶器与茶道:传统工艺与现代审美的完美融合
茶具的演变与茶艺美学:一部中华茶文化的历史
一文读懂DRG分组术语
2025年医保大变革:DRG/DIP付费模式详解
鸿钧老祖门下弟子之谜:论《封神演义》的圣贤谱系重构
未病先防:中医如何让健康先行一步
信·期权 | 科创50ETF周五大幅上涨,期权加权隐含波动率同步上升
“on”在不同语境中的八大常见用法
生态保护在风景园林的原则有哪些?六个方面很关键!
白名单(允许名单):日常用户的基本见解
家里装修文案短句干净治愈 家在装修朋友圈配文
探寻汕尾梅陇:曾氏古民居的文脉渊源
中医教你,不同体质如何喝茶
掌握六大茶的科学冲泡法及最佳饮用时机,提升品茗体验
燃气轮机工作原理你知多少?
空调能效比的重要性及如何进行评估
什么是高速公路
《哪吒2》创作背后:4000多名动画人托举,饺子拒绝国外三流团队
《哪吒2》史上最壮观特效背后,是全国138家动画公司的合力托举
古方清石茶治疗胆结石效果如何?怎么饮用?能否长期喝?
揭秘桂花树生长速度,一年能长多少(桂花树生长速度的影响因素与培育方法)
头晕、眼花、视力模糊和后头痛该如何治疗
全身骨扫描检查的价格范围及影响因素
女生做销售哪行最吃香?女性销售人员的最佳行业选择
排球:团队精神的最佳诠释