ROS 学习系列 -- 使用Rviz 可视化调试9轴机器人姿态融合

2023-05-16

机器人平面行走时只需要知道行进方向角度即可,也就是yaw. 但当行走在有坡度的地方时则需要识别出其它两个倾角:pitch 和 raw. 借助9轴传感器的姿态融合就可以识别。下面就是在Rviz中的识别效果测试(IE可能无法观看):

直接看优酷视频吧:http://v.youku.com/v_show/id_XOTE0OTEwNzM2.html

1. 九轴姿态融合,欧拉角和四元数

机器人三维空间的姿态的表达是用欧拉角, 就是ptich roll 和 yaw. 详见链接

ROS中使用的是四元数而不是欧拉角,好在提供了API进行转换tf::createQuaternionMsgFromRollPitchYaw(roll, pitch,yaw)

九轴传感器:重力加速计,陀螺仪和电子罗盘。9个数据的姿态融合能够得出欧拉角。

整体思路:

1)使用九轴传感姿态融获取ptich roll 和 yaw

2)使用ROS的API转换成四元数,交给tf,详细方法见我的文章

3 ) 3D建模在Rviz中显示,详细方法见我的文章1,文章2

2. pitch,roll的计算和滤波算法选择

重力加速计直接可以计算出pitch,roll. 根据三个重力场分量x,y,z 就可以算出来:

pitch = -atan2(x, sqrt((z * z) + (y * y));
roll  =  atan2(y, sqrt((x * x) + (z * z));
这时候在Rviz中观察会发现,即便实际世界中的机器人不动,计算机中的机器人却在抽筋儿似的乱动,但是用手翻滚机器人也能正确的反应变化,但是很不稳定。这是因为 重力加速计自身的硬件误差引入的噪音数据造成的,只能通过陀螺仪进行滤波。

陀螺仪的动态性能比叫稳定,但是也有噪音。两组数据的融合就必须采用滤波算法降噪,这也就是大名鼎鼎的卡尔曼滤波就是这么来的。但是该算法过于复杂,在实际使用中我们采用了补偿滤波算法,效果和卡尔曼几乎完全一样,但是算法相当简单。

如图所示,其中红色的点为单纯从 重力加速计 计算出的X轴向倾角pitch,而绿色的点为经过滤波后计算出的倾角。

补偿滤波算法公式:

pitch = K * (pitch + gyro_y * time_diff) + ( ( 1-K) * accelerometer.read_pitch());
roll = K * (roll + gyro_x * time_diff) + ( (1- K) * accelerometer.read_roll());

gyro_y , gyro_x是实时陀螺仪x,y方向分量

time_diff 是积分时间片,单位秒。该值越小越好

accelerometer.read_pitch() accelerometer.read_roll()是实时重力加速计算出的pitch roll

K 取值一般为0.9 -0.98 之间

3. yaw的数据融合

yaw需要电子罗盘的x,y,z分量融合pitch,roll得出,公式非常复杂,无法贴出来。

4.九轴芯片的选择

市场上多见的芯片是mpu9205,mpu9105. 我选用的是gy95, 包括加速度计(Accelerometer)ADXL345,陀螺仪(Gyroscope)ITG3205以及电子罗盘 (Compass)HMC5883L。它们都使用I2C总线通讯。

4. ROS 代码

该代码需要配合RVIz使用,而且fixed_frame要设置为 "odom"

#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <nav_msgs/Odometry.h>
#include "gy85/imu.h"

int main(int argc, char** argv){
  ros::init(argc, argv, "imu_publisher");

  ros::NodeHandle n;
  ros::Publisher odom_pub = n.advertise<nav_msgs::Odometry>("odom", 50);
  tf::TransformBroadcaster odom_broadcaster;

  double x = 0.0;
  double y = 0.0;
  double th = 0.0;

  double vx = 0.1;
  double vy = -0.1;
  double vth = 0.1;
	
  IMU imu;
  imu.set_compass_offsets(750, -900, -200);
  imu.set_gyro_offsets(35, -5, -6);
  double pitch=0, roll=0, yaw=0;

  ros::Time current_time;
  current_time = ros::Time::now();

  ros::Rate r(50.0);
  while(n.ok()){

    ros::spinOnce();

    //since all odometry is 9DOF we'll need a quaternion 
    imu.read_pitch_roll_yaw(pitch, roll, yaw);
  
    geometry_msgs::Quaternion odom_quat = tf::createQuaternionMsgFromRollPitchYaw(roll, pitch, -yaw);

    //first, we'll publish the transform over tf
    geometry_msgs::TransformStamped odom_trans;
    odom_trans.header.stamp = current_time;
    odom_trans.header.frame_id = "odom";
    odom_trans.child_frame_id = "base_link";

    odom_trans.transform.translation.x = x;
    odom_trans.transform.translation.y = y;
    odom_trans.transform.translation.z = 0.5;
    odom_trans.transform.rotation = odom_quat;

    //send the transform
    odom_broadcaster.sendTransform(odom_trans);

    //next, we'll publish the odometry message over ROS
    nav_msgs::Odometry odom;
    odom.header.stamp = current_time;
    odom.header.frame_id = "odom";

    //set the position
    odom.pose.pose.position.x = x;
    odom.pose.pose.position.y = y;
    odom.pose.pose.position.z = odom_trans.transform.translation.z;
    odom.pose.pose.orientation = odom_quat;

    //set the velocity
    odom.child_frame_id = "base_link";
    odom.twist.twist.linear.x = vx;
    odom.twist.twist.linear.y = vy;
    odom.twist.twist.angular.z = vth;

    //publish the message
    odom_pub.publish(odom);
    r.sleep();
  }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS 学习系列 -- 使用Rviz 可视化调试9轴机器人姿态融合 的相关文章

随机推荐

  • 基于单片机的心率监测系统设计(#0495)

    功能描述 1 采用51 52单片机 通用 作为主控芯片 xff1b 2 采用1602液晶显示 xff1a 当前心率 报警上限 报警下限 xff1b 3 采用ST188红外对管检测心率 xff0c 当单片机检测到大约第5次信号时 xff0c
  • Verilog - 利用加法器实现乘法器 [代码]

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • LCD1602液晶 - 开发技术详解

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • LCD1602温度显示程序设计流程

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • 语音处理WT588D-20SS芯片 - 原理详解

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • 基于单片机的智能温度监测系统设计(电路图+程序)

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • 基于单片机的电子秤系统设计(电路+流程)

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • MPU6050 - 陀螺仪 - 技术总结

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • JavaParser使用指南

    抱歉这个博客是很久以前写的 xff0c 现在我已经不用javaparser了 xff0c 这个包也一直在更新所以这篇博客参考意义不大 大家可以根据官网的例子去试试 JavaParser使用指南 前言入门 StartJavaParser Cl
  • 共享式与交换式以太网

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是共享式与交换式以太网 一 共享式以太网 xff1a Hub 与同轴电缆都是典型的共享式以太网所使用的设备 xff0c 工作在OSI模型
  • 51单片机入门 - 自己动手搭建实验板

    博主福利 xff1a 100G 43 电子设计学习资源包 xff01 http mp weixin qq com mp homepage biz 61 MzU3OTczMzk5Mg 61 61 amp hid 61 7 amp sn 61
  • TCP 协议

    传输层协议作用 1 分段及封装应用层送来的数据 2 提供端到端的传输服务 3 在发送主机与接收主机之间构建逻辑通信 4 包括两个协议 xff1a 1 xff09 TCP 2 xff09 UDP 怎样提供的逻辑通信 xff1a 两台主机进程间
  • 海康门禁 远程控制

    1 登录海康官网下载sdk包 https www hikvision com cn download 61 html 2 登录海康sdk包 库文件中的ClientDemo exe 然后添加设备 只用填写ip xff0c 用户名 xff0c
  • TCP、UDP通信例程(C语言)

    xff08 转载 xff09 socket笔记 TCP UDP通信总结 1 基于TCP的本地客户端 服务端信息交互实例 xff08 windows xff09 xff08 已验证 xff09 实现功能 xff1a 本地TCP客户端往本地TC
  • STM32F030F4P6 HAL库 PPM信号输出 24L01 PPM接收机制作

    事件起因 因为给PX4测试缺少遥控器 xff0c 手撸了一套支持PPM的遥控器系统 xff0c 这篇文章将在接收机上遇到的问题分享一二 xff0c 供大家借鉴 1 需求分析 接收机需要输出至少8通道的PPM信号 xff0c 可以将 通PPM
  • Linux网络编程——简单基于TCP协议的服务器/客户端示例

    说明 xff1a 本文章旨在总结备份 方便以后查询 xff0c 由于是个人总结 xff0c 如有不对 xff0c 欢迎指正 xff1b 另外 xff0c 内容大部分来自网络 书籍 和各类手册 xff0c 如若侵权请告知 xff0c 马上删帖
  • vue vlc插件的使用

    公司要求使用vlc插件播放rtsp实时视频 span class token operator lt span object span class token operator span id span class token operat
  • c++按键退出循环 windows平台

    span class token macro property span class token directive keyword include span span class token string lt windows h gt
  • 关于c++ char char*

    span class token macro property span class token directive keyword include span span class token string lt iostream gt s
  • ROS 学习系列 -- 使用Rviz 可视化调试9轴机器人姿态融合

    机器人平面 行走时只需要知道行进方向角度即可 xff0c 也就是yaw 但当行走在有坡度的地方时则需要识别出其它两个倾角 xff1a pitch 和 raw 借助9轴传感器的姿态融合就可以识别 下面就是在Rviz中的识别效果测试 IE可能无