ros入门(六)–imu融合里程计robot_pose_ekf扩展卡尔曼融合包

IMU, 一般具有两个基本器件:加速计和陀螺仪。主要用于测量自身位姿,位姿包括位置和姿态。
最近在研究imu 融合里程计方面的内容,初学一些内容,总结一下:

环境信息:

Ubuntu:18.04
ROS : melodic

一. IMU接入ROS系统

imu型号:ROS IMU hfi_a9型号

1.安装ros-imu功能依赖包
sudo apt-get install ros-melodic-imu-tools ros-melodic-rviz-imu-plugin   #如果不安装,imu在rviz中无法正常显示

2.下载并编译 handsfree_ros_imu 驱动包
cd ~/catkin_ws/src/
git clone https://github.com/HANDS-FREE/handsfree_ros_imu.git
cd ..
catkin_make -DCATKIN_WHITELIST_PACKAGES='handsfree_ros_imu'
#如果git上下载慢,可以在gitee上下载:git clone https://gitee.com/HANDS-FREE/handsfree_ros_imu.git

3.修改权限
cd src/handsfree_ros_imu/scripts/
sudo chmod 777 *.py

4.插上imu设备运行可视化程序
ls /dev/ttyUSB*
sudo chmod 777 /dev/ttyUSB0
roslaunch handsfree_ros_imu rviz_and_imu.launch

5.查看topic 信息
rostopic list
rostopic echo /handsfree/imu

在这里插入图片描述

#内容解析:
linear_acceleration表示线加速度,
linear_acceleration_covariance表示线加速度协方差,
angular_velocity表示角速度,
angular_velocity_covariance角速度协方差,
orientation表示姿态,使用四元数表示,
orientation_covariance表示姿态协方差。

参考链接视觉-惯导多传感器融合https://blog.csdn.net/hhaowang/article/details/121249997

二. IMU融合里程计—robot_pose_ekf

惯性融合里程计:通过机器人运动学解算可以把测量的电机运动数据转换成里程计数据,电机里程计通过扩展卡尔曼滤波融合IMU偏航角(yaw)的数据后,可以将机器人里程计的精度大大提高。

1.robot_pose_ekf安装编译
1.下载
cd ~/catkin_ws/src
git clone https://github.com/ros-planning/robot_pose_ekf.git

2.编译
rosdep install robot_pose_ekf
roscd robot_pose_ekf
rosmake

3.运行
roslaunch robot_pose_ekf.launch

4.查看topic
rostopic list

在这里插入图片描述

2. 在启动文件中进行配置:
<launch>
  <node pkg="robot_pose_ekf" type="robot_pose_ekf" name="robot_pose_ekf">
    <param name="output_frame" value="odom"/>  
    <param name="base_footprint_frame" value="base_link"/>   #这里改成自己的基坐标系
    <param name="freq" value="30.0"/>
    <param name="sensor_timeout" value="1.0"/>
    <param name="odom_used" value="true"/>
    <param name="imu_used" value="true"/>
    <param name="vo_used" value="false"/>
   
    <remap from="/imu_data" to="/handsfree/imu" />  #改成已经发布imu数据的话题名称,odom如果不是实际的也需要修改为实际odom数据话题名称
  </node>
</launch>

freq: 滤波器更新和发布频率。注意:频率高仅仅意味着一段时间可以获得更多机器人位姿信息,但是并不表示可以提高每次位姿评估的精度。

sensor_timeout: 当传感器停止向滤波器发送信息时,滤波器在没有传感器的情况下等待多长时间才重新开始工作。

odom_used (编码器), imu_used (imu), vo_used (视觉里程计): 确认是否输入

output_frame=:odom, 里程计(可以随意命名)。底盘中发布的 <里程计话题名> 要与源码odom_estimation_node.cpp (112行) 订阅的 <里程计话题名 “odom”> 保持一致,如果不一致,会影响底盘节点<scout_base_node> 与 <robot_pose_ekf>节点之间的数据传输及tf树。

base_footprint_frame: 基坐标系, 需要与imu中hfi_a9_ros.py中imu_msg.header.frame_id =‘base_link’ 保持一致(111行), 不一致会导致tf树报错。

#映射处理
remap:将想要接收 IMU 话题,映射到实际IMU 发布的话题名:/handsfree/imu

修改配置之后再次启动,查看话题:
在这里插入图片描述

3. 节点之间的数据传输
开启底盘的launch发布odom的topic
开启imu的launch发布imu的topic
开启运行robot_pose_ekf的launch

查看节点之间的数据传输:rqt_graph
在这里插入图片描述

查看tf树:rosrun rqt_tf_tree rqt_tf_tree
在这里插入图片描述

4.源码分析

launch启动文件中:type对应的是可执行文件,robot_pose_ekf可执行文件在~/catkin_ws/devel/lib 下robot_pose_ekf文件夹下,robot_pose_ekf 源码是src下的文件。
源码分析请参考链接:源码笔记

参考链接:
IMU和里程计融合
http://wiki.ros.org/robot_pose_ekf
https://www.guyuehome.com/34607

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年2月28日 下午9:57
下一篇 2023年2月28日

相关推荐