ROS学习记录:用C++实现IMU航向锁定
前言
获取IMU数据的C++节点
在了解了如何获取到IMU的姿态信息(链接在上面)后,接下来尝试实现让一个节点在订阅IMU数据的时候,还能发布运动控制指令,使机器人能对姿态变化做出反应,达到一个航向锁定的效果。
一、实现步骤

二、开始操作
1、打开一个终端,输入cd ~/catkin_ws1/src,进入工作空间

2、输入 code . 打开VScode

3、在VScode中打开上一篇文章编写的imu_node.cpp, 上一篇文章链接已经放在开头

4、在imu_node.cpp中写入如下代码
#include "ros/ros.h" //包含ros头文件
#include "sensor_msgs/Imu.h" //包含sensor_msgs/Imu消息类型头文件
#include "tf/tf.h"//用于使用TF工具,将四元素转换为欧拉角
#include "geometry_msgs/Twist.h"//引入速度消息包的头文件ros::Publisher vel_pub;//定义一个发布对象vel_pubvoid IMUCallback(sensor_msgs::Imu msg) //IMU消息回调函数
{if(msg.orientation_covariance[0]<0) //检查协方差,确保数据有效性return; //如果协方差小于0,数据无效,直接返回tf::Quaternion quaternion( //创建四元素msg.orientation.x, //从IMU消息中获取四元素数据msg.orientation.y,msg.orientation.z,msg.orientation.w);double roll,pitch,yaw; //定义滚转、俯仰、偏航角tf::Matrix3x3(quaternion).getRPY(roll,pitch,yaw);// 利用TF库将四元数转换为欧拉角roll = roll*180/M_PI; // 弧度转换为角度pitch = pitch*180/M_PI; // 弧度转换为角度yaw = yaw*180/M_PI; // 弧度转换为角度ROS_INFO("滚转= %.0f 俯仰= %.0f 偏航= %.0f",roll,pitch,yaw); // 打印欧拉角double target_yaw = 90; //设置目标偏航角double diff_angle = target_yaw-yaw;// 计算目标偏航角与当前偏航角之间的差值geometry_msgs::Twist vel_cmd;// 创建Twist类型消息对象用于发布速度指令vel_cmd.angular.z = diff_angle*0.01;// 计算角速度vel_pub.publish(vel_cmd);// 发布速度指令
}int main(int argc, char *argv[]) // 主函数
{setlocale(LC_ALL,""); // 设置本地区域选项ros::init(argc,argv,"imu_node"); // 初始化ROS节点ros::NodeHandle n; // 创建节点句柄ros::Subscriber imu_sub = n.subscribe("/imu/data",10,IMUCallback); // 创建imu_sub订阅者,订阅IMU数据消息vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel",10);//创建速度指令发布器ros::spin();// 进入自发循环,阻塞程序直至节点关闭return 0;
}
5、按CTRL+S进行保存,再按CTRL+SHIFT进行编译,编译成功

6、在终端中输入cd ~/catkin_ws1,进入工作空间

7、再输入source ./devel/setup.bash,设置ROS的环境变量,以便在当前的终端窗口中正确运行ROS软件包。

8、再输入roslaunch wpr_simulation wpb_simple.launch,启动机器人仿真环境

9、再打开一个终端,进入工作空间后输入source ./devel/setup.bash,设置环境变量

10、输入rosrun imu_pkg imu_node运行刚刚我们更新的节点

11、可以看到机器人偏航角锁定在了90度

12、这时因为在代码中,我们设定了目标偏航角为90度,如果想要机器人朝向其它角度可以自行修改

13、点这个旋转按钮,对机器人进行旋转,拖动这个蓝色的圈圈,机器人转动后,一松开鼠标,可以发现机器人会自行转回去直至目标角度90度,这便是偏航角锁定。

ROS机器人偏航角锁定演示
14、回到节点代码,在这里加上这一句代码,给机器一个前进的速度,可以预想到,机器人会一边前进一边转弯。

#include "ros/ros.h" //包含ros头文件
#include "sensor_msgs/Imu.h" //包含sensor_msgs/Imu消息类型头文件
#include "tf/tf.h"//用于使用TF工具,将四元素转换为欧拉角
#include "geometry_msgs/Twist.h"//引入速度消息包的头文件ros::Publisher vel_pub;//定义一个发布对象vel_pubvoid IMUCallback(sensor_msgs::Imu msg) //IMU消息回调函数
{if(msg.orientation_covariance[0]<0) //检查协方差,确保数据有效性return; //如果协方差小于0,数据无效,直接返回tf::Quaternion quaternion( //创建四元素msg.orientation.x, //从IMU消息中获取四元素数据msg.orientation.y,msg.orientation.z,msg.orientation.w);double roll,pitch,yaw; //定义滚转、俯仰、偏航角tf::Matrix3x3(quaternion).getRPY(roll,pitch,yaw);// 利用TF库将四元数转换为欧拉角roll = roll*180/M_PI; // 弧度转换为角度pitch = pitch*180/M_PI; // 弧度转换为角度yaw = yaw*180/M_PI; // 弧度转换为角度ROS_INFO("滚转= %.0f 俯仰= %.0f 偏航= %.0f",roll,pitch,yaw); // 打印欧拉角double target_yaw = 90; //设置目标偏航角double diff_angle = target_yaw-yaw;// 计算目标偏航角与当前偏航角之间的差值geometry_msgs::Twist vel_cmd;// 创建Twist类型消息对象用于发布速度指令vel_cmd.angular.z = diff_angle*0.01;// 计算角速度vel_cmd.linear.x = 0.1;//给机器人x轴方向一个0.1m/s的线速度vel_pub.publish(vel_cmd);// 发布速度指令
}int main(int argc, char *argv[]) // 主函数
{setlocale(LC_ALL,""); // 设置本地区域选项ros::init(argc,argv,"imu_node"); // 初始化ROS节点ros::NodeHandle n; // 创建节点句柄ros::Subscriber imu_sub = n.subscribe("/imu/data",10,IMUCallback); // 创建imu_sub订阅者,订阅IMU数据消息vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel",10);//创建速度指令发布器ros::spin();// 进入自发循环,阻塞程序直至节点关闭return 0;
}
15、CTRL+S保存后,在按CTRL+SHIFT编译,编译成功

16、先按CTRL+Z停止运行刚刚的节点,在重新运行节点

17、可以看到当拉动蓝色的圈圈后,机器人一边转一边前进。

相关文章:
ROS学习记录:用C++实现IMU航向锁定
前言 获取IMU数据的C节点 在了解了如何获取到IMU的姿态信息(链接在上面)后,接下来尝试实现让一个节点在订阅IMU数据的时候,还能发布运动控制指令,使机器人能对姿态变化做出反应,达到一个航向锁定的效果。 …...
设计模式-策略模式-使用
设计模式-策略模式-CSDN博客 系统中有很多类,它们之间的区别仅在于它们的行为。策略模式可以定义一系列的算法,并将它们一个个封装起来,使它们可以相互替换。这样,算法就可以独立于使用它的客户而变化。需要使用算法的不同变体。…...
WebSocket——相关介绍以及后端配置
一、WebSocket介绍: WebSocket是一种在单个TCP连接上进行全双工通信的协议,旨在改进客户端和服务器之间的实时通信。以下是关于WebSocket的详细介绍: 1、定义与标准 WebSocket是独立的、创建在TCP上的协议,通过HTTP/1.1协议的10…...
单片机设计注意事项
1.电源线可以30mil走线,信号线可以6mil走线 2.LDO推荐 SGM2019-3.3,RT9013,RT9193,1117-3.3V。 3.单片机VCC要充分滤波后再供电,可以接0.1uf的电容 4.晶振附件不要走其他元件,且放置完单片机后就放置晶振,晶振靠近X1,X2。...
Ubuntu 如何根据NVIDIA显卡型号确定对应的显卡驱动版本并安装
目录 一、查询推荐安装的驱动版本 二、安装推荐版本的驱动 1. 通过终端安装,只安装 nvidia 驱动(亲测可用!) 2. 通过 software & Updates 安装,安装 nvidia 驱动。 三、查询能安装的最新的显卡驱动版本 1. 方…...
如何选择一款安全高效的数据自动同步工具?
随着科技的不断发展,企业处理的数据量愈发庞大。数字化浪潮的涌现使得数据在业务活动和决策中的角色变得日益重要,然而这些数据往往分布在不同的位置,需要进行同步和分类,以便更有效地利用。以下是一些常见的数据自动同步场景&…...
【linux】docker下nextcloud安装人脸识别插件
一、插件源码地址: GitCode - 开发者的代码家园 二、插件官网地址: Releases - Face Recognition - Apps - App Store - Nextcloud 三、插件安装教程: 1、查看本地nextcloud版本号 http://ipAddress:8080/settings/admin/overview 2、找…...
2. C++服务器编程-信号
什么是信号 其实信号就是一个中断。就是在执行程序的时候突然来了一个信号,然后我们去执行这个新来的程序了,这就是中断。 处理方法 信号的处理方式∶忽略、捕获、默认处理 linux中都有那些信号 man7 signal 比如说kill -9 安装man中文手册 自己百…...
C#_库的引用
类库的引用 还可以自己引用类库:解决方案-添加-新建项目 主程序 using System; using System.Windows.Forms; using Tools;namespace ConsoleApp2 {class Program{static void Main(string[] args){//Console.WriteLine("helloword");// Form form ne…...
C++:STL—算法
C:STL—算法 算法 算法 STL(Standard Template Library)中的算法是为了操作数据集合(如容器)而设计的函数模板集合,它们提供了丰富的功能和灵活的接口,可以用于对数据进行排序、查找、遍历等操作。STL中的…...
深入探索:移动云服务器的强大之处
文章目录 一 什么是移动云二 移动云服务器的使用三 移动云服务器的优点四 在移动云上部署node.js项目五 移动云服务器的应用场景六 移动云服务器的使用体验总结 一 什么是移动云 移动云是指用户可以通过移动设备访问云端的数据和应用,无需在本地设备上进行存储和处…...
线性表(从数据结构的三要素出发)
文章目录 逻辑结构存储结构顺序存储链式存储单链表双链表循环单链表循环双链表静态链表 数据的操作顺序结构链式结构单链表双链表 逻辑结构 线性表是具有相同数据类型的 n ( n ≥ 0 ) n(n≥0) n(n≥0)个数据元素的有限序列,其中 n n n为表长,当 n 0 n0…...
[SCTF2019]babyre
打开看看还是有花指令 解除后首先pass1是解maze,好像又是三维的 x是25,也就是向下跳五层,注意是立体的 得到 passwd1: ddwwxxssxaxwwaasasyywwdd 接着往下看 有一个加密函数IDA逆向常用宏定义_lodword-CSDN博客 unsigned __int64 __fastca…...
uniapp实现下拉过滤查询列表
<picker bindchange"bindPickerChanges" value"{{selectedIndex}}"range"{{pickerArray}}"range-key"name"><view class"area-select">在线状态:<label for"">{{pickerArray[select…...
C++—— set、map、multiset、multimap的介绍及使用
目录 关联式容器 关联式容器的特点和使用场景 树形结构与哈希结构 树形结构 哈希结构 键值对 set set的介绍 set的定义方式 set的使用 multiset map map的介绍 map的定义方式 map的使用 multimap 关联式容器 C标准模板库(STL)中的关联…...
STM32 学习——1. STM32最小系统
这是一个最小系统的测试,LED灯会进行闪烁。选用PC13口,因为STM32F103C8T6 硬件开发板中,这个端口是一个LED 1. proteus8.15 原理图 2. cubemx 新建工程 3. keil 代码 while (1){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);HAL_Delay(100);…...
react实现table可拖拽表头(给react-jss样式传递参数、滚动条样式)
目录 react实现table可拖拽表头安装依赖resizableTitle / index.tsxdrapTable.tsx使用DragTable 组件滚动条样式效果 react实现table可拖拽表头 安装依赖 yarn add react-resizable yarn add react-jssresizableTitle / index.tsx import { createUseStyles } from react-js…...
如何跨过robots协议的限制爬取内容?
在讨论如何“跨过robots协议的限制爬取内容”之前,重要的是强调遵循网络礼仪和法律法规的必要性。robots协议(Robots Exclusion Standard)是网站所有者向网络爬虫(包括搜索引擎和其他自动化工具)传达其爬取意愿的一种方…...
Parasoft C++Test软件静态分析操作指南_编码规范/标准检查
系列文章目录 Parasoft CTest软件安装指南 Parasoft CTest软件静态分析操作指南_编码规范/标准检查 Parasoft CTest软件静态分析操作指南_软件质量度量 Parasoft CTest软件静态分析_自动提取静态分析数据生成文档 Parasoft CTest软件单元测试_操作指南 Parasoft CTest软件单元…...
[AIGC] CompletableFuture如何实现任务链式调用?
Java 中的 CompletableFuture 提供了多种方法来支持任务链式调用。这些方法允许你将一组操作链接在一起,形成一个任务链,每一个任务只有在上一个任务成功完成后才会被执行。现在,我们来看一下一些常用的链接任务的方法: thenAppl…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
