参考链接

  • github源码 https://github.com/ros-planning/navigation/tree/kinetic-devel/robot_pose_ekf
  • 创客智造教程 https://www.ncnynl.com/archives/201708/1909.html
  • csdn修改参考https://blog.csdn.net/shenghuaijing3314/article/details/78220151
  • https://blog.csdn.net/xiekaikaibing/article/details/80403264
  • csdn源码分析参考https://blog.csdn.net/zhxue_11/article/details/83828877
  • ros wiki http://wiki.ros.org/robot_pose_ekf

硬件,运行环境等

笔者使用的是创客智造中diy arduino 底盘的方式,相关信息见链接https://www.ncnynl.com/category/ros-car/

上位机没有使用树莓派,而是使用了如下:

联想笔记本 i5 6267u    8g 内存

虚拟机软件:vmware

版本:Ubuntu16.04lts + kinetic

底盘控制使用ros arduino birdge 参见链接:http://wiki.ros.org/ros_arduino_bridge

imu使用 saprkfun 的9250版imu 参见链接https://learn.sparkfun.com/tutorials/9dof-razor-imu-m0-hookup-guide

教程参见链接:http://wiki.ros.org/razor_imu_9dof

有关

Go to "Tools" → "Board" and select "Arduino Pro or Pro Mini (3.3v, 8mhz) w/ATmega328". Note: in Aduino 1.5+, the board menu doesn't allow selecting the voltage/frequency; go to the Processor menu after selecting "Arduino Pro or Pro Mini" and select "ATMega 328 (3.3V, 8Mhz)"

这里板子的型号应为arduino zero 笔者Ubuntu中arduino IDE 无法添加新的开发板和库,故在windows环境下完成固件的烧写工作;

(某宝买的板子micro USB 口相当不结束,直接就掉下来了,还好找人把他搞上去了,吐槽一句就不能用那种带固定引脚的口么)

选择:

Caution: choose the correct Razor hardware revision when compiling and uploading the firmware to the board. The setting is located in Razor_AHRS.ino under "HARDWARE OPTIONS"!

更新IMU固件,并在ROS中安装包,并编译后可进行测试和矫正。

现在进入正题:

  1. robot_pose _ekf的使用

修改robot_pose _ekf的launch文件,

仅使用里程计和IMU,故将VO参数改为false,

修改output_frame为odom_combined,

修改base_footprint_frame为base_link

重映射robot_pose_ekf/odom_combined到odom_combined

<launch><node pkg="robot_pose_ekf" type="robot_pose_ekf" name="robot_pose_ekf"><param name="output_frame" value="odom_combined"/><param name="base_footprint_frame" value="base_link"/><remap from="robot_pose_ekf/odom_combined" to="odom_combined"/><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="flase"/><param name="debug" value="true"/></node></launch>

首先启动 底盘节点,启动键盘控制包测试底盘是否正常运行,使用rostopic命令查看话题发布和里程计信息,查看tf tree ,可以看到,此时发布tf的节点为arduino

启动IMU,启动robot_pose_ekf节点,发现此时出现两个错误,即wiki中的两个error:

Covariance specified for measurement on topic xxx is zero

这里的xxx为odom,这是因为ros arduino birdge中并没有发布odom的协方差矩阵,所以在这里我们在base controller文件添加Covariance的发布代码

ODOM_POSE_COVARIANCE = [1e-3, 0, 0, 0, 0, 0, 0, 1e-3, 0, 0, 0, 0,0, 0, 1e6, 0, 0, 0,0, 0, 0, 1e6, 0, 0,0, 0, 0, 0, 1e6, 0,0, 0, 0, 0, 0, 1e3]
ODOM_POSE_COVARIANCE2 = [1e-9, 0, 0, 0, 0, 0, 0, 1e-3, 1e-9, 0, 0, 0,0, 0, 1e6, 0, 0, 0,0, 0, 0, 1e6, 0, 0,0, 0, 0, 0, 1e6, 0,0, 0, 0, 0, 0, 1e-9]ODOM_TWIST_COVARIANCE = [1e-3, 0, 0, 0, 0, 0, 0, 1e-3, 0, 0, 0, 0,0, 0, 1e6, 0, 0, 0,0, 0, 0, 1e6, 0, 0,0, 0, 0, 0, 1e6, 0,0, 0, 0, 0, 0, 1e3]
ODOM_TWIST_COVARIANCE2 = [1e-9, 0, 0, 0, 0, 0, 0, 1e-3, 1e-9, 0, 0, 0,0, 0, 1e6, 0, 0, 0,0, 0, 0, 1e6, 0, 0,0, 0, 0, 0, 1e6, 0,0, 0, 0, 0, 0, 1e-9]

以及

......................... odom.twist.twist.angular.z = vth# todo sensor_state.distance == 0
if self.v_des_left == 0 and self.v_des_right == 0:odom.pose.covariance = ODOM_POSE_COVARIANCE2odom.twist.covariance = ODOM_TWIST_COVARIANCE2
else:odom.pose.covariance = ODOM_POSE_COVARIANCEodom.twist.covariance = ODOM_TWIST_COVARIANCEself.odomPub.publish(odom)...........................

此时里程计相关的协方差矩阵为0错误消失

(这里使用的IMU包已经发布了协方差,故不存在错误,有相关错误的可以参考上面的修改文章)

还有一点需要注意的是,我们需要让robot pose ekf 来发布odom到base link或footprint的tf,解决方案是屏蔽base controller中相关的tf 如图

            quaternion.w = cos(self.th / 2.0)#           # Create the odometry transform frame broadcaster.#           self.odomBroadcaster.sendTransform(#               (self.x, self.y, 0), #               (quaternion.x, quaternion.y, quaternion.z, quaternion.w),#               rospy.Time.now(),#               self.base_frame,#               "odom"#               )odom = Odometry()

此时运行rqt tf tree以及rqt graph即可看到正确的node topic 以及tf tree

使用rqt plot可以绘制相应的坐标,更好的办法是将数据导入到matlab中,详细分析。

第一次修改:将imu相关的tf静态发布

将以下代码添加到arduino.launch 中,注意添加的位置

<node name="base_imu_link" pkg="tf" type="static_transform_publisher" args="0 0 0 0 3.1415926 0  /base_link /base_imu_link 50"/>

添加成功后运行

rosrun robot_pose_ekf wtf.py 

查看odom 和imu 的运行状态

2.robot_pose _ekf的源码理解

文件结构

robot pose ekf相关推荐

  1. SLAM笔记——turtlebot传感器ekf实验实验

    这里写目录标题 实验内容 实验准备 msg数据类型 给uwb和odom增加噪声 robot_pose_ekf 发布路径 实验结果 实验内容 本实验将在gazebo仿真环境中使用ekf进行传感器数据融合 ...

  2. ros ekf融合odom imu ov信息

    1.这里是ros_ekf_pose包的简单介绍: 这个包用于评估机器人的3D位姿,使用了来自不同源的位姿测量信息,它使用带有6D(3D position and 3D orientation)模型信息 ...

  3. ekf 传感器数据融合

    robot_pose_ekf.launch  默认配置: 2d  odom   imu  vo <launch> <node pkg="robot_pose_ekf&quo ...

  4. ROS与navigation教程——概述

    navigation是ROS的二维导航功能包,简单来说,就是根据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令. 代码库:https://githu ...

  5. AMCL定位融合UWB

    2021/12/26,实验效果不好,发现多传感器融合好像不像我想得那么简单,还不太懂- 2021/12/27,一个大问题ekf并没有融合odom,odom_combined发布的数据和uwb(gps) ...

  6. 智能小车传感器(摄像头、雷达、红外传感器、RFID、AGV、IMU)总结及数据获取打印(ROS、C++)

    Camera 1.简介: 摄像头由镜头.镜 头模组.滤光片.CMOS/CCD.ISP.数据传输部分组成.光线经过光学镜头 和滤光片后聚焦到传感器上,通过 CMOS 或 CCD 集成电路将光信号转换成电 ...

  7. [学习SLAM]基于EKF使用 robot_pose_ekf 对imu和odom进行融合定位(robot_pose_ekf) 篇章 (2)

    使用 robot_pose_ekf 对imu和odom进行融合 robot_pose_ekf 是 ROS Navigation stack 中的一个包,通过扩展卡尔曼滤波器对 imu.里程计 odom ...

  8. 【全局地图mapping】二维全局地图的开源方案及对比--gmapping、hector、karto、cartographer

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.gmapping算法建图[基于Raoo-Blackwellize ...

  9. EKF-SLAM simulated in MATLAB

    Reference: Simulataneous localization and mapping with the extended Kalman filter - `A very quick gu ...

最新文章

  1. hashmap实现原理_Java中HashMap底层实现原理(JDK1.8)源码分析
  2. NetMagic Simple Overview
  3. 数论 —— 最大公约数与最小公倍数
  4. PHP发送和接收JSON请求
  5. 提示账户不被允许使用docker的情况
  6. 腾讯云联合信通院发布《超低延时直播白皮书》,推动直播延时降低90%以上
  7. 程序员锁死服务器导致公司倒闭,案件终于开庭了
  8. 想成为时间管理大师?试试番茄工作法!
  9. [树剖]月下“毛景树”
  10. [bzoj4874]筐子放球
  11. Cinnamon 任务栏网速
  12. IOS swift 清理缓存
  13. 小游戏吃饭,睡觉,打豆豆,亲
  14. c++文件的读取和写入
  15. eclipse vail_在Windows Home Server“ Vail”上安装Microsoft Security Essentials 2.0 Beta
  16. 整合NGFW和威胁分析后,防火墙这是要上天?
  17. 方舟无限琥珀服务器,方舟生存进化无限琥珀版
  18. 算法梳理(二)逻辑回归算法梳理
  19. Qt模仿QQ聊天窗口合并功能
  20. 中国交通运输发展白皮书

热门文章

  1. liunx学习日记(一)---Linux系统的安装
  2. 过滤器和拦截器的区别和执行顺序
  3. 如何将一个网页文件设置为屏幕保护程序
  4. 浙江大学控制科学与工程学院冯冬芹教授团队招聘软件开发工程师(python)2名
  5. 扑克牌魔术的暴力算法——可用来骗美女哦
  6. swust.oj1015: 堆排序算法
  7. 2022年总结与2023年展望
  8. linux看系统 查看数据库命令,linux查询数据库命令
  9. 微软的员工们,现在可以永久在家办公了
  10. 首款上线XBOX ONE的Cocos游戏!