当前位置:   article > 正文

SLAM从入门到精通(IMU数据的读取)_六轴陀螺仪 slam

六轴陀螺仪 slam

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        上一篇文章我们说过,对于差速轮来说,旋转的计算很多程度上依赖于theta=tan(theta)这个公式来进行的。但是,我们也知道,如果机器人转弯很快的话,这个公式其实是不成立的。所以,对于旋转这件事情来说,我们能想到的,就是用IMU来对角度来进行补偿和计算的。

        试想一下,如果在地面上,我们尚可通过电机的编码器数据计算来获取里程计数据信息,那么对于天上的飞机或者其他飞行器来说,就没有这个便利了。这个时候,IMU设备就派上用场了。IMU也称之为陀螺仪,有三轴、六轴、九轴之说。一般三轴IMU包括了三个方向的角度信息;六轴陀螺仪则在三轴的基础上,添加了三个方向的线加速度信息;九轴陀螺仪则在六轴陀螺仪的基础之上,进一步添加了三个方向的磁力计信息。对于速度不是特别高的机器人设备来说,实时获取三个方向的角度信息就可以了,简单处理就是和里程计做一个卡尔曼滤波即可。

1、ros下的imu消息格式

        对于imu来说,我们可以通过index.ros.org网站,借助于关键词sensor_msgs,找到https://github.com/ros/common_msgs这个地址。进一步在sensor_msgs/msg/Imu.msg里面,就可以发现我们想找的信息。

  1. Header header
  2. geometry_msgs/Quaternion orientation
  3. float64[9] orientation_covariance # Row major about x, y, z axes
  4. geometry_msgs/Vector3 angular_velocity
  5. float64[9] angular_velocity_covariance # Row major about x, y, z axes
  6. geometry_msgs/Vector3 linear_acceleration
  7. float64[9] linear_acceleration_covariance # Row major x, y z

        除了通常的header之外,ros中的imu消息包还有三种数据。orientation是方向信息,不过是用四元数来表示的,orientation_covariance表示方向的协方差。angular_velocity是角速度信息,angular_velocity_covariance是角速度的协方差。linear_acceleration是三个方向的线加速度,linear_acceleration_covariance是线加速度的协方差信息。一般来说,我们用的比较多的是orientation和angular_velocity。

2、编写测试代码imu_node.cpp

  1. #include "ros/ros.h"
  2. #include "sensor_msgs/Imu.h"
  3. #include "tf/tf.h"
  4. void IMUCallback(sensor_msgs::Imu msg)
  5. {
  6. if(msg.orientation_covariance[0] < 0)
  7. {
  8. return;
  9. }
  10. tf::Quaternion quarternion(
  11. msg.orientation.x,
  12. msg.orientation.y,
  13. msg.orientation.z,
  14. msg.orientation.w
  15. );
  16. double roll;
  17. double pitch;
  18. double yaw;
  19. tf::Matrix3x3(quarternion).getRPY(roll, pitch, yaw);
  20. roll = roll*180.0f/M_PI;
  21. pitch = pitch*180.0f/M_PI;
  22. yaw = yaw*180.0f/M_PI;
  23. ROS_INFO("roll = %0.3f, pitch=%0.3f, yaw=%0.3f", roll, pitch, yaw);
  24. }
  25. int main(int argc, char* argv[])
  26. {
  27. setlocale(LC_ALL, "");
  28. ros::init(argc, argv, "imu_node");
  29. ros::NodeHandle n;
  30. ros::Subscriber imu_sub = n.subscribe("/imu/data", 10, IMUCallback);
  31. ros::spin();
  32. return 0;
  33. }

        代码不复杂,主要是订阅/imu/data信息,回调函数是ImuCallback。在ImuCallback函数中,我们获取orientation的四元数信息。如果想要获取yaw信息,则要把quaternion转换成矩阵后,再用getRPY生成。这个时候yaw是弧度信息,如果要直观显示的话,需要进一步转成角度信息。

3、添加CMakeLists.txt内容

  1. add_executable(imu_node src/imu_node.cpp)
  2. target_link_libraries(imu_node ${catkin_LIBRARIES})
  3. add_dependencies(imu_node beginner_tutorials_generate_messages_cpp)

4、编译生成imu_node

        编译imu_node的方法很简单,就是直接输入catkin_make即可。

5、开始测试

        测试之前,有几点需要注意。首先,利用roslaunch打开wpb_simple.launch,

roslaunch wpr_simulation wpb_simple.launch

        接着打开imu_node,当然在此之前最好输入./devel/setup.sh,        

rosrun beginner_tutorials imu_node

        这个时候因为机器人还没有旋转,所以imu打印的参数中,都是信息为0。因此,我们可以继续输入rqt命令,让小车转起来,

rosrun rqt_robot_steering rqt_robot_steering

        通过窗口输入旋转的命令,这个时候,就可以看到console的打印命令了,yaw数据也开始发生了变化。这说明我们的imu数据已经被采集到了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/415951
推荐阅读
相关标签
  

闽ICP备14008679号