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、可以看到當拉動藍色的圈圈后,機器人一邊轉一邊前進

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15273.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15273.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15273.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神奇動物在哪里,但導演是微軟

大數據產業創新服務媒體 ——聚焦數據 改變商業 一說到計算機視覺&#xff0c;大多數人第一時間聯想到的便是“人臉識別”、“自動駕駛“、道路檢測”等跟我們日常生活息息相關的關鍵詞。而在2024年的5月末&#xff0c;微軟在GitHub上面上傳了這樣一個計算機視覺的項目&#x…

2024年華為OD機試真題-停車場車輛統計-C++-OD統一考試(C卷D卷)

題目描述: 特定大小的停車場,數組cars[]表示,其中1表示有車,0表示沒車。車輛大小不一,小車占一個車位(長度1),貨車占兩個車位(長度2),卡車占三個車位(長度3),統計停車場最少可以停多少輛車,返回具體的數目。 輸入描述: 整型字符串數組cars[],其中1表示有車,0…

通過Python爬取公告內容

在網絡時代&#xff0c;信息獲取變得更加便捷。通過網絡爬蟲技術&#xff0c;我們可以從互聯網上快速獲取各種信息。本文將介紹如何使用 Python 爬蟲工具從指定網站上獲取公告內容&#xff0c;并提取其中的關鍵信息。 1. 簡介 在本文中&#xff0c;我們將使用 Python 的 requ…

幾個速度比較快的 Linux 開源鏡像站及支持的資源列表

搜狐開源鏡像站 https://mirrors.sohu.com/ File Name CPAN/ FreeBSD/ QpenBSD/ RockyL apache/ archlinux/ centos/ ceph/ cygwin/ debian/ debian–cd/ debian-security/ deepin/ deepin-cd/ docker-ce/ fedora/ fedora-epel/ gentoo/ lib/ mysql/ nginx/ opensuse/ php/ ubu…

C++筆試強訓day32

目錄 1.素數回文 2.活動安排 3.合唱團 1.素數回文 鏈接https://www.nowcoder.com/practice/d638855898fb4d22bc0ae9314fed956f?tpId290&tqId39945&ru/exam/oj 現將其轉化為回文數&#xff08;這里用字符串存儲比較方便轉化&#xff09;&#xff0c;然后判斷是否為…

Ubuntu安裝IPOPT和Casadi

1.IPOPT安裝 1.1安裝所需功能包 sudo apt-get install cppad sudo apt-get install gcc g gfortran subversion patch wget1.2下載最新源代碼3.14 https://www.coin-or.org/download/source/Ipopt/1.3解壓進入IPOPT安裝包&#xff0c;下載ASL git clone https://github.com/…

python項目中的__pycache__有什么作用?

在 Python 項目中&#xff0c;目錄 __pycache__ 通常用于存儲已編譯的字節碼文件。這些文件是 Python 解釋器在導入模塊時生成的&#xff0c;以加快后續的模塊加載速度。 具體內容 __pycache__ 目錄中的文件是以 .pyc 擴展名結尾的字節碼文件。文件名通常會包含原始 Python 源…

【FPGA】VGA顯示文字、彩條、圖片——基于DE2-115

文章目錄 前言一、VGA概述1.1 簡述1.2 管腳定義1.3 VGA顯示原理1.4 VGA時序標準1.5 VGA 顯示模式及相關參數 二、VGA顯示自定義的漢字字符2.1 點陣漢字生成2.2 生成BMP文件2.3 生成txt文件2.4 實現效果 三、VGA顯示條紋3.1 實現流程3.2 實現效果 四、VGA輸出一幅彩色圖像4.1 bm…

ArcGIS不同圖斑設置不同的透明度

對于設置一個圖層的整體的透明度&#xff0c;我們在 ArcGIS制作帶蒙版的遙感影像地圖http://mp.weixin.qq.com/s?__bizMzIzNjM2NTYxMg&mid2247509080&idx1&sn38dccf0a52bb3bb3758f57114ee38b72&chksme8da161bdfad9f0d363da90959a8524dcf2b60d0e8d999f8ebeef0…

Unity面試八股文之基礎篇

文章目錄 前言1. Unity的生命周期加載第一個場景Editor在第一次幀更新之前幀之間更新順序協程銷毀對象時退出時 2. Unity 協程和線程,進程的區別3. 本地坐標系 世界坐標系4. 碰撞器和觸發器的區別后話 前言 開設這個欄目的博文會寫一些有關unity的面試題目&#xff0c;在面試的…

如何做好軟件項目的溝通管理

如何做好軟件項目的溝通管理 軟件項目的溝通管理是確保項目信息在團隊成員、利益相關者和相關群體之間有效流通的過程。良好的溝通是項目成功的關鍵&#xff0c;在項目開始時&#xff0c;需要制定詳細的溝通計劃&#xff0c;包括溝通的目的、對象、內容、頻率和渠道等信息。 …

【spring】@ResponseBody注解學習

ResponseBody介紹 ResponseBody 是一個Spring框架中的注解&#xff0c;主要用于Web開發&#xff0c;特別是在Spring MVC框架中。它的核心作用是改變Spring MVC處理HTTP請求響應的行為&#xff0c;使得從控制器方法返回的數據直接寫入HTTP響應體&#xff08;Response Body&…

Python面試寶典:Python中與網絡協議基礎和socket編程相關的知識和面試筆試題(1000加面試筆試題助你輕松捕獲大廠Offer)

Python面試寶典:1000加python面試題助你輕松捕獲大廠Offer【第二部分:Python高級特性:第十四章:網絡編程:第一節:網絡協議基礎和socket編程】 第十四章:并發編程第一節:網絡協議基礎和socket編程網絡協議基礎Socket編程創建SocketTCP服務器TCP客戶端數據傳輸關閉Socket…

Python高級進階--slice切片

slice切片?? 在 Python 中&#xff0c;切片操作是一種常見且方便的方式&#xff0c;用于從字符串、列表或元組中獲取部分元素。這種操作通過指定起始索引、結束索引和步長來實現。下面我們來看一些關于切片的簡單介紹以及一些常見用法。 1. 切片簡介 取一個str、list、tup…

【Unity2D:Animator】為角色添加動畫效果

一、添加Animator組件并創建Animator Controller文件 1. 添加Animator組件&#xff1a; 2. 在Assets-Art文件夾中新建一個名為Animations的文件夾&#xff0c;用來存儲所有動畫資源 3. 在Animations文件夾中新建一個名為Player的文件夾&#xff0c;再創建一個名為Animators的文…

LeetCode //C - 119. Pascal‘s Triangle II

119. Pascal’s Triangle II Given an integer rowIndex, return the rowIndexth (0-indexed) row of the Pascal’s triangle. In Pascal’s triangle, each number is the sum of the two numbers directly above it as shown: Example 1: Input: rowIndex 3 Output: …

vue項目移動端商場

一、項目前端頁面展示 二、項目整體目錄結構 三、項目流程 1. vue快速創建基礎項目 創建項目 vue create hk-shop 1 選擇需要的配置 創建基礎文件夾目錄 src文件夾下文件夾目錄&#xff1a; ① views 文件夾存放界面 ② components 文件夾存放界面中局部組件 ③ config 文件夾存…

【排序算法】——歸并排序(遞歸與非遞歸)含動圖

制作不易&#xff0c;三連支持一下吧&#xff01;&#xff01;&#xff01; 文章目錄 前言一.歸并排序遞歸方法實現二.歸并排序非遞歸方法實現 前言 這篇博客我們將介紹歸并排序的原理和實現過程。 一、歸并排序遞歸方法實現 基本思想&#xff1a; 歸并排序&#xff08;MERGE-…

JS(ES_6)_2

1.創建對象的6種方式&#xff1a; 1. obnew Object() ob.nameah ob.age18 2. ob{name:ah,gae:18} 3.工廠模式&#xff1a; 設計一個函數&#xff0c;專門生產Person類型的對象 <script>function createPerson(name,age,family) {var o new Object();o.name name;o.…

軟件設計師備考 | 案例專題之數據流圖 概念與例題

案例分析專題大綱&#xff1a; 數據流圖基本概念 基本圖形元素&#xff1a;外部實體、加工、數據存儲、數據流 數據流&#xff1a;由一組固定成分的數據組成&#xff0c;表示數據的流向。在DFD中&#xff0c;數據流的流向必須經過加工。加工&#xff1a;描述了輸入數據流到輸出…