当前位置: 首页 > news >正文

2.8 获取IMU数据与航向锁定

1.获取IMU数据

进入src目录

cd  catkin_ws/src/

建立新包imu_pkg,并在对应src目录增加imu_node.cpp

catkin_create_pkg imu_pkg roscpp rospy sensor_msgs

在imu_node.cpp键入代码

#include "ros/ros.h"
#include "sensor_msgs/Imu.h"
#include "tf/tf.h"void IMUCallback(sensor_msgs::Imu msg)
{if(msg.orientation_covariance[0]<0)return;tf::Quaternion quaternion(msg.orientation.x,msg.orientation.y,msg.orientation.z,msg.orientation.w);double roll,pitch,yaw;tf::Matrix3x3(quaternion).getRPY(roll,pitch,yaw);roll=roll*180/M_PI;pitch=pitch*180/M_PI;yaw=yaw*180/M_PI;ROS_INFO("滚转=%.0f 俯仰=%.0f 朝向=%.0f",roll,pitch,yaw);}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"imu_node");ros::NodeHandle n;ros::Subscriber imu_sub = n.subscribe("/imu/data/",10,IMUCallback);ros::spin();return 0;
}

因为设计旋转,欧拉角存在万向锁问题,所以这里引入4元数来解决问题

#include "tf/tf.h"

 启动仿真环境

roslaunch wpr_simulation wpb_simple.launch

 

2.保持航向锁定

#include "ros/ros.h"
#include "sensor_msgs/Imu.h"
#include "tf/tf.h"
#include "geometry_msgs/Twist.h"ros::Publisher vel_pub;void IMUCallback(sensor_msgs::Imu msg)
{if(msg.orientation_covariance[0]<0)return;tf::Quaternion quaternion(msg.orientation.x,msg.orientation.y,msg.orientation.z,msg.orientation.w);double roll,pitch,yaw;tf::Matrix3x3(quaternion).getRPY(roll,pitch,yaw);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;vel_cmd.angular.z=diff_angle*0.01;vel_cmd.linear.x=0.1;vel_pub.publish(vel_cmd);}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"imu_node");ros::NodeHandle n;ros::Subscriber imu_sub = n.subscribe("/imu/data/",10,IMUCallback);vel_pub=n.advertise<geometry_msgs::Twist>("/cmd_vel",10);ros::spin();return 0;
}

http://www.lryc.cn/news/571424.html

相关文章:

  • Kafka 4.0.0集群部署
  • 二十四、【用户管理与权限 - 篇六】前端动态展现:基于权限的菜单与按钮控制
  • Leetcode-​2537. 统计好子数组的数目​
  • SALMONN-omni论文阅读
  • Datawhale YOLO Master 第1次笔记
  • 利用Enigma Virtual Box将QT生成的软件打包成一个exe可执行文件
  • 第100+42步 ChatGPT学习:R语言实现阈值调整
  • uniapp + vite + ts出现红色波浪线,各种ts报错
  • LeetCode--33.搜索旋转排序数组
  • 探秘KingbaseES在线体验平台:技术盛宴还是虚有其表?
  • List、Queue、Deque、Stack常用方法总结
  • 论文笔记:Trajectory generation: a survey on methods and techniques
  • DELL R730XD服务器调整风扇转速
  • python+uniapp微信小程序的共享雨伞租赁系统
  • [特殊字符]华为总部参观预约|企业通道揭秘
  • MySQL 中 DISTINCT 去重的核心注意事项详解
  • MSPM0G3507学习笔记(二) 超便捷配置led与按键
  • ffmpeg webm 透明通道视频转成rgba图片
  • 基于最新豆包大模型1.6实现 ArXiv Paper Reading MCP与Agent构建
  • C++ map代码练习 1、2、priority_queue基础概念、对象创建、数据插入、获取堆顶、出队操作、大小操作,自定义结构、代码练习 1 2
  • 电机及驱动器的安全、性能和能效认证
  • 02 ( chrome 浏览器插件, 立马翻译), 搭建本地 api
  • c++学习-多态
  • MacOS上MySQL的安装以及使用
  • 【编译工具】CodeRider 2.0:驭码 CodeRider 2.0 产品功能分析
  • 【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(软件篇)(二)
  • RK 安卓10/11平台 HDMI-IN 调试
  • RAG轻松通-P1:分块
  • 爬虫技术:数据获取的利器与伦理边界
  • 输电线路电缆护层环流在线监测装置:原理、优势与应用解析