用在ROS2系统中保持差速轮方向不变的PID程序

news2024/12/27 11:16:10

在这里插入图片描述
在ROS 2中,为了保持差速轮机器人的方向不变,通常需要使用PID(Proportional Integral Derivative)控制器来控制机器人的角速度。PID控制器可以帮助调整机器人的角速度,以维持其朝向不变。

下面是一个简单的ROS 2节点示例,使用PID控制器来控制差速轮机器人的角速度,使其保持在一个固定的方向上。这个示例假设你已经有了一个订阅geometry_msgs/msg/Twist类型消息的主题,该主题提供了机器人的线速度和角速度。同时,我们也假设你有一个发布geometry_msgs/msg/Twist类型消息的主题,用于向机器人发送速度命令。

ROS 2 PID 控制器示例

#include <rclcpp/rclcpp.hpp>
#include <geometry_msgs/msg/twist.hpp>
#include <std_msgs/msg/float64.hpp>
#include <sensor_msgs/msg/imu.hpp>
#include <cmath>

using namespace std::chrono_literals;

class PIDControllerNode : public rclcpp::Node {
public:
    PIDControllerNode()
        : Node("pid_controller_node"), target_heading_(0.0), kp_(1.0), ki_(0.1), kd_(0.5),
          integral_(0.0), previous_error_(0.0), dt_(0.1) {
        
        // 创建PID控制器参数
        this->declare_parameter("kp", 1.0);
        this->declare_parameter("ki", 0.1);
        this->declare_parameter("kd", 0.5);
        this->get_parameter("kp", kp_);
        this->get_parameter("ki", ki_);
        this->get_parameter("kd", kd_);

        // 创建订阅者
        imu_sub_ = this->create_subscription<sensor_msgs::msg::Imu>(
            "/imu/data", 10, std::bind(&PIDControllerNode::imuCallback, this, _1));

        // 创建发布者
        cmd_vel_pub_ = this->create_publisher<geometry_msgs::msg::Twist>("/cmd_vel", 10);

        // 创建定时器
        timer_ = this->create_wall_timer(
            dt_ * 1000, std::bind(&PIDControllerNode::controlLoop, this));
    }

private:
    void imuCallback(const sensor_msgs::msg::Imu::SharedPtr msg) {
        // 提取IMU数据中的偏航角
        double yaw = getYawFromImu(*msg);
        // 更新目标偏航角
        target_heading_ = yaw;
    }

    double getYawFromImu(const sensor_msgs::msg::Imu & imu_msg) {
        // 假设IMU数据提供了四元数
        double q0 = imu_msg.orientation.w;
        double q1 = imu_msg.orientation.x;
        double q2 = imu_msg.orientation.y;
        double q3 = imu_msg.orientation.z;

        // 从四元数计算偏航角
        double yaw = atan2(2 * (q0 * q3 + q1 * q2), 1 - 2 * (q2 * q2 + q3 * q3));
        return yaw;
    }

    void controlLoop() {
        // 获取当前偏航角
        double current_heading = getYawFromImu(last_imu_);

        // 计算误差
        double error = target_heading_ - current_heading;

        // 计算积分项
        integral_ += error * dt_;

        // 计算微分项
        double derivative = (error - previous_error_) / dt_;

        // PID输出
        double output = kp_ * error + ki_ * integral_ + kd_ * derivative;

        // 更新之前的误差
        previous_error_ = error;

        // 发布速度命令
        geometry_msgs::msg::Twist cmd_vel;
        cmd_vel.linear.x = 0.0; // 假设线速度为0
        cmd_vel.angular.z = output; // 发布角速度

        cmd_vel_pub_->publish(cmd_vel);
    }

    double target_heading_; // 目标偏航角
    double kp_, ki_, kd_; // PID系数
    double integral_; // 积分项
    double previous_error_; // 上一次误差
    double dt_; // 采样时间
    rclcpp::Subscription<sensor_msgs::msg::Imu>::SharedPtr imu_sub_; // IMU订阅者
    rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr cmd_vel_pub_; // 速度命令发布者
    rclcpp::TimerBase::SharedPtr timer_; // 控制循环定时器
    sensor_msgs::msg::Imu last_imu_; // 最近接收到的IMU数据
};

int main(int argc, char * argv[]) {
    rclcpp::init(argc, argv);
    auto node = std::make_shared<PIDControllerNode>();
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

代码解释

  1. 初始化节点

    • 创建PID控制器节点。
    • 设置PID控制器的参数(kp, ki, kd)。
  2. 订阅IMU数据

    • 通过IMU数据获取机器人的当前偏航角。
    • 更新目标偏航角。
  3. 控制循环

    • 计算当前偏航角与目标偏航角之间的误差。
    • 计算PID输出。
    • 发布角速度命令。

编译和运行

  1. 创建一个新的ROS 2工作空间

    mkdir -p ~/ros2_ws/src
    cd ~/ros2_ws/src
    git clone https://github.com/your-repo/pid_controller.git
    
  2. 编译代码

    cd ~/ros2_ws
    colcon build --packages-select pid_controller
    source install/setup.bash
    
  3. 运行节点

    ros2 run pid_controller pid_controller_node
    

请确保你已经在ROS 2环境中设置了相应的主题,并且有IMU数据发布到 /imu/data 主题。此外,你还需要确保 /cmd_vel 主题被你的机器人系统正确订阅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker镜像文件加密(Win11)

分享一个可以给docker导出的tar包加密的方法 要使用openssl&#xff0c;地址&#xff1a;openssl安装&#xff0c;安装exe就行&#xff0c;选择不带Light的&#xff0c;下面的是二进制文件 傻瓜式安装&#xff0c;最后的赞助页面&#xff0c;根据自己经济实力选择赞助&#xf…

PWM信号转模拟信号转换器GP8101/GP8101M

前言&#xff1a; 各位大佬&#xff0c;听说过PAC吗&#xff1f;PAC (PWM to Analog Converter)。 今天介绍一个小众的转换芯片&#xff0c;PWM转模拟信号的&#xff0c;有一定的应用场景,单价一元多。这种芯片隔离PWM还是很容易的。 0%-100% PWM to 0-5V/0-10V SOP8封装的GP…

裸机:SDRAM引入

SDRAM引入 SDRAM&#xff1a;Synchronous Dynamic Random Access Memory&#xff0c;同步动态随机存储器 DDR 就是DDR ADRAM DDR SDRAM是Double Data Rate SDRAM的缩写 SDRAM通过地址总线和数据总线接口&#xff08;总线接口&#xff09;与SoC通信。 SDRAM的特性&#xff08…

【Linux】进程IO|重定向|缓冲区|dup2|dup|用户级缓冲区|模拟缓冲区

目录 前言 重定向 实验一 为什么log.txt文件的文件描述符是1 为什么向stdout打印的信息也出现在文件中 实验二 用户级缓冲区 为什么要有用户级缓冲区 系统调用 dup 为什么close(fd1)之后还能向log.txt写入数据&#xff1f; dup2 缓冲区 观察现象 测试1 测试2 测…

IGV.js | 载入自己下载的gtf文件

1.安装 htslib-1.20 https://www.htslib.org/doc/tabix.html J3$ cd ~/Downloads/ $ wget https://github.com/samtools/htslib/releases/download/1.20/htslib-1.20.tar.bz2 $ tar jxvf htslib-1.20.tar.bz2编译安装&#xff1a; $ cd htslib-1.20/ $ ./configure --prefix/…

【图文多模态】

GPT4o 架构的核心是<font color"red">**Transformer**</font>&#xff0c;它通过自注意力机制&#xff08;Self-Attention&#xff09;来处理输入的序列数据端到端的方式训练&#xff1a;即从输入到输出的整个过程都在同一个网络中进行多模态大模型&…

不看后悔 养宠家庭的必备好物——最值得买的宠物空气净化器推荐

"猫毛满天飞&#xff0c;打扫永无尽头&#xff01;"这是多少养猫人的日常写照。或许你已经尝试了各种方法&#xff0c;从手动打扫到普通空气净化器&#xff0c;但效果总是不尽人意。普通空气净化器虽然有点用&#xff0c;但实际上它们并非专为宠物家庭设计&#xff0…

应用层自定义协议以及序列化和反序列化

文章目录 应用层自定义协议以及序列化和反序列化1、应用层自定义协议1.1、应用层1.2、协议 2、序列化和反序列化3、TCP 为什么支持全双工4、jsoncpp基础4.1、序列化4.2、反序列化 5、实现网络版计算器6、手写序列化和反序列化 应用层自定义协议以及序列化和反序列化 1、应用层…

【YOLOv8系列】图像分类篇----通过YOLOv8实现图像分类功能

最近需要使用YOLOv8对自己的数据集进行训练,从而实现图像分类的功能,因此记录一下整个过程。 YOLOv8的github地址:https://github.com/ultralytics/ultralytics 参考链接:超详细YOLOv8图像分类全程概述:环境、训练、验证与预测详解 文章目录 一、YOLOv8环境搭建二、准备…

【C++】:红黑树深度剖析 --- 手撕红黑树!

目录 前言一&#xff0c;红黑树的概念二&#xff0c;红黑树的性质三&#xff0c;红黑树节点的定义四&#xff0c;红黑树的插入操作4.1 第一步4.2 第二步4.3 插入操作的完整代码 五&#xff0c;红黑树的验证六&#xff0c;实现红黑树的完整代码五&#xff0c;红黑树与AVL树的比较…

从 NextJS SSRF 漏洞看 Host 头滥用所带来的危害

前言 本篇博文主要内容是通过代码审计以及场景复现一个 NextJS 的安全漏洞&#xff08;CVE-2024-34351&#xff09;来讲述滥用 Host 头的危害。 严正声明&#xff1a;本博文所讨论的技术仅用于研究学习&#xff0c;旨在增强读者的信息安全意识&#xff0c;提高信息安全防护技能…

Java Linux操作系统

1、操作系统是协助用户调度硬件工作&#xff0c;充当用户和计算机硬件之间的桥梁 2、Linux内核 提供了linux系统的主要功能 3、发行版Centos&#xff1a;内核应用程序 4、快照&#xff1a;保存虚拟机的状态&#xff0c;当虚拟机出现问题的时候&#xff0c;可以恢复原始的状态…

Hospital 14.6.0全开源医院管理预约系统源码

InfyHMS 具有 60 种功能和 9 种不同类型的用户类型&#xff0c; 他们可以登录系统并根据他们的角色访问他们的数据。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89580674 更多资源下载&#xff1a;关注我。

MyBatis--11-- 判断 Integer类型,值为0动态SQL不生效

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 MyBatis标签&#xff1a; Integer类型&#xff0c;值为0动态SQL不生效1.现象2.分析原因3.解决办法去掉判断条件 dto.status ! "即可 MyBatis标签&#xff1a; …

CSS相关记录

文章目录 backgroundposition文字displayflexjustify-contentalign-itemsflex-directionflex-wrap gridimportant transformtranslate&#xff08;位移&#xff09;scale&#xff08;缩放&#xff09;rotate&#xff08;旋转&#xff09;origin (旋转中心点)skew (倾斜 ) borde…

kafka架构+原理+源码

1.安装jdk17 sudo yum -y update sudo wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm sudo yum -y install ./jdk-17_linux-x64_bin.rpm、 sudo java -version 2.安装kafka How to easily install kafka without zookeeper | Aditya’s Blog …

C++——保持原有库头文件不变的情况下,成功编译运行工程

问&#xff1a;想要保持原来库方式&#xff0c;应该怎么操作呢&#xff1f; 答&#xff1a;如果想保持原来的方式&#xff0c;则只需要将 库所在路径 tracker/detector/rknn_model_zoo/utils 加入到 工程库包含中即可。

DVWA的安装和使用

背景介绍 DVWA是Damn Vulnerable Web Application的缩写&#xff0c;是一个用于安全脆弱性检测的开源Web应用。它旨在为安全专业人员提供一个合法的测试环境&#xff0c;帮助他们测试自己的专业技能和工具&#xff0c;同时也帮助web开发者更好地理解web应用安全防范的过程。DV…

FastAPI(七十)实战开发《在线课程学习系统》接口开发--留言功能开发

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 在之前的文章&#xff1a;FastAPI&#xff08;六十九)实战开发《在线课程学习系统》接口开发--修改密码&#xff0c;这次分享留言功能开发 我们梳理…

gstreamer使用cairo实现视频OSD叠加

前言 gstreamer中视频叠加OSD有很多种方式,比如textoverlay添加文字,gdkpixbufoverlay添加图片,clockoverlay或timeoverlay插件显示时间,pango插件进行复杂文本渲染,使用cairo插件绘制图形或者文字。 今天使用最后一种:cairo 项目源码: 如果是QT,pro文件需要导入: …