【7. ROS 中的 IMU 惯性测量单元消息包】

本文涉及的产品
资源编排,不限时长
简介: 【7. ROS 中的 IMU 惯性测量单元消息包】

1. 前言

Ubuntu环境搭建

【经典Ubuntu20.04版本U盘安装双系统教程】

【Windows10安装或重装ubuntu18.04双系统教程】

【Ubuntu同步系统时间】

【Ubuntu中截图工具】

【Ubuntu安装QQ】

【Ubuntu安装后基本配置】

【Ubuntu启动菜单的默认项】

【ubuntu系统中修改hosts配置】

【18.04Ubuntu中解决无法识别显示屏】

【ROS 开发神器 Visual Studio Code 的安装和设置】

ROS学习笔记

【1. Ubuntu18.04安装ROS Melodic】

【2. 在Github上寻找安装ROS软件包】

【3. 初学ROS,年轻人的第一个Node节点】

【4. ROS的主要通讯方式:Topic话题与Message消息】

【5. ROS机器人的运动控制】

【6. 激光雷达接入ROS】

【7. ROS 中的 IMU 惯性测量单元消息包】

接下来学习ROS 中的 IMU 惯性测量单元消息包和导航,IMU 惯性测量单元是用来测量机器人的空间姿态!


1.png

2. IMU 惯性测量单元

2.1 sensor_msgs

进入ROS Index官网搜索sensor_msgs

2.png

3.png

进入website

4.png

2.2 IMU 惯性测量单元的格式定义

在消息中找到Imu

5.png

这就打开了IMU 惯性测量单元的格式定义

6.png

7.png

8.png

3. 使用C++实现IMU获取数据节点

3.1 通用IMU姿态数据格式

9.png

直接获取IMU融合好的机器人姿态四元数


3.2 构思功能的思路和步骤

构思

10.png


实现步骤

  1. 构建一个新的软件包,包名叫做imu_pkg。
  2. 在软件包中新建一个节点,节点名叫做imu_node。
  3. 在节点中,向ROS大管家NodeHandle申请订阅话题/imu/data,并设置回调函数为IMUCallback()。
  4. 构建回调函数IMUCallback(),用来接收和处理IMU数据。
  5. 使用TF工具将四元数转换成欧拉角。
  6. 调用ROS_INFO()显示转换后的欧拉角数值。

3.3 创建imu_pkg包

在工作空间src文件创建基于sensor_msgs模板的imu_pkg

cd ~/catkin_ws/src/
catkin_create_pkg imu_pkg roscpp rospy sensor_msgs

11.png

在imu_pkg文件夹下src中创建imu_node.cpp


12.png

3.4 编写imu_node订阅者节点

imu_node源码



#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;
}


ctrl+s快捷保存


3.5 设置C++编译规则

打开CMake文件

add_executable(imu_node src/imu_node.cpp)
add dependencies(imu_node ${${PROJECT_NAVE}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(imu_node
  ${catkin_LIBRARIES}
)

ctrl+s快捷保存

13.png


ctrl+shift+b快捷编译


3.6 编译运行imu_node节点

编译,打开终端




cd ~/catkin_ws/
catkin_make

采用wpr_simulation开源工程,打开三个终端分别运行三条指令


roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun imu_pkg imu_node

15.png


拖动机器人绕z轴正方向旋转90度

16.png



可参照可以打开wpr_simulation里src文件夹下的demo_imu_data.cpp文件,对照一下代码,排查错误

17.png



4. 用python获取IMU 数据节点

4.1 通用IMU姿态数据格式

18.png

直接获取IMU融合好的机器人姿态四元数


4.2 构思功能的思路和步骤

构思

19.png

实现步骤

  1. 构建一个新的软件包,包名叫做imu_pkg。
  2. 在软件包中新建一个节点,节点名叫做imu_node.py。
  3. 在节点中,向ROS大管家rospy申请订阅话题/imu/data,并设置回调函数为imu_callback()。
  4. 构建回调函数imu_callback(),用来接收和处理IMU数据。
  5. 使用TF工具将四元数转换成欧拉角。
  6. 调用loginfo()显示转换后的欧拉角数值。

4.3 创建imu_pkg包

在工作空间src文件创建基于sensor_msgs模板的imu_pkg,编译




cd ~/catkin_ws/src/
catkin_create_pkg imu_pkg roscpp rospy sensor_msgs
cd ..
catkin_make


20.png


在imu_pkg文件夹下新建script文件夹中创建imu_node.py

21.png


4.4 编写imu_node订阅者节点

先引入python包,设置中文utf-8显示


  • ros>=20.04,采用python3
  • ros<20.04,采用python

lidar_node.py源码



#!/usr/bin/env python3
#coding=utf-8
import rospy
from sensor msgs.msg import Imu
from tf.transformations import euler_from_quaternion
import math
def imu callback(msg):
  if msg.orientation covariance[0]< 0:
  return
  quaternion =[
  msg .orientation.x,
  msg.orientation.y,
  msg.orientation.z,
  msg.orientation.w
  ]
  (roll,pitch , yaw) = euler_from_quaternion(quaternion)
  roll = roll*180/math.pi
  pitch = pitch*180/math.pi
  yaw = yaw*180/math.pi
  rospy.loginfo(滚转=%.0f俯仰= %.0f朝向= %.of" ,roll,pitch,yaw)
if _name ="_main_":
  rospy.init_node( "imu _node")
  imu_sub = rospy.subscriber( "/imu/data",Imu,imu_callback,queue_size=10)
  rospy.spin()



ctrl+s快捷保存


4.5 添加可执行的权限

在所在文件夹打开终端




cd catkin_ws/src/imu_pkg/scripts/
ls
chmod +x imu_node.py
ls


文件名变成绿色表示权限添加成功


22.png


4.6 运行imu_node节点

采用wpr_simulation开源工程,打开三个终端分别运行三条指令




roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun vel_pkg vel_node.py

23.png

24.png

25.png

可参照可以打开wpr_simulation里的script文件夹中创建imu_node.py

26.png

5. 用C++编写 IMU 航向锁定节点


27.png

基于前面学习的机器人运动控制和 IMU 惯性测量单元数据,下面将联系这两点编写 IMU 航向锁定节点,我们可以直接在前面实验的程序上做修改


5.1 构思功能的思路和步骤

让大管家NodeHandle 发布速度控制话题/cmd_vel。

设定一个目标朝向角,当姿态信息中的朝向角和目标朝向角不一致时,控制机器人转向目标朝向角。

5.2 修改imu_node.cpp

28.png


见3.4源码

修改成如下lidar_node源码



#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.0l;
  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;
}

ctrl+s快捷保存


ctrl+shift+b快捷编译

29.png


可参照开源项目wpr_simulation下的src文件夹的demo_imu_behavior.cpp


30.png


5.3 运行imu_node节点

采用wpr_simulation开源工程,打开三个终端分别运行三条指令


roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun imu_pkg imu_node

31.png

拖动机器人绕Z轴旋转,也会自动转回去


32.png


5.4 优化航向策略

当机器人检测前方障碍物时,最简单把转弯角度调大一点,原地转弯

imu_node源码



#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;
  geometr_msgS::Twist vel_cmd ;
  vel_cmd.angular.z = diff_angle * 0.0l;
  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;
}




ctrl+s快捷保存


ctrl+shift+b快捷编译

采用wpr_simulation开源工程,打开三个终端分别运行三条指令


roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun imu_pkg imu_node

33.png

6. 用python编写 IMU 航向锁定节点


34.png

基于前面学习的机器人运动控制和 IMU 惯性测量单元数据,下面将联系这两点编写 IMU 航向锁定节点,我们可以直接在前面实验的程序上做修改


6.1 构思功能的思路和步骤

构思

35.png

实现步骤


  1. 让大管家NodeHandle 发布速度控制话题/cmd_vel。
  2. 设定一个目标朝向角,当姿态信息中的朝向角和目标朝向角不一致时,控制机器人转向目标朝向角。

6.2 修改imu_node.py

打开4.4编写imu_node.py


36.png


修改imu_node.py源码



#!/usr/bin/env python3
#coding=utf-8
import rospy
from sensor msgs.msg import Imu
from tf.transformations import euler_from_quaternion
import math
from geometry msgs.msg import Twist
def imu callback(msg):
  if msg.orientation covariance[0]< 0:
  return
  quaternion =[
  msg .orientation.x,
  msg.orientation.y,
  msg.orientation.z,
  msg.orientation.w
  ]
  (roll,pitch , yaw) = euler_from_quaternion(quaternion)
  roll = roll*180/math.pi
  pitch = pitch*180/math.pi
  yaw = yaw*180/math.pi
  rospy.loginfo(滚转=%.0f俯仰= %.0f朝向= %.of" ,roll,pitch,yaw)
  target_yaw = 90
  diff_angle = target yaw - yaw
  vel_cmd = Twist()
  vel_cmd.angular.z = diff_angle * 0.01
  global vel_pub
  vel_pub.publish(vel_cmd)
if _name ="_main_":
  rospy.init_node( "imu _node")
  imu_sub = rospy.subscriber( "/imu/data",Imu,imu_callback,queue_size=10)
  vel_pub = rospy.Publisher( "/cmd_vel",Twist,queue_size=10)
  rospy.spin()


ctrl+s快捷保存


6.3 运行imu_node节点

采用wpr_simulation开源工程,打开三个终端分别运行三条指令


roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun imu_pkg imu_node.py

37.png

38.png


6.4 优化航向策略

修改imu_node.py源码

#!/usr/bin/env python3
#coding=utf-8
import rospy
from sensor msgs.msg import Imu
from tf.transformations import euler_from_quaternion
import math
from geometry msgs.msg import Twist
def imu callback(msg):
  if msg.orientation covariance[0]< 0:
  return
  quaternion =[
  msg .orientation.x,
  msg.orientation.y,
  msg.orientation.z,
  msg.orientation.w
  ]
  (roll,pitch , yaw) = euler_from_quaternion(quaternion)
  roll = roll*180/math.pi
  pitch = pitch*180/math.pi
  yaw = yaw*180/math.pi
  rospy.loginfo(滚转=%.0f俯仰= %.0f朝向= %.of" ,roll,pitch,yaw)
  target_yaw = 90
  diff_angle = target yaw - yaw
  vel_cmd = Twist()
  vel_cmd.angular.z = diff_angle * 0.01
  vel_cmd.linear.x = 0.1
  global vel_pub
  vel_pub.publish(vel_cmd)
if _name ="_main_":
  rospy.init_node( "imu _node")
  imu_sub = rospy.subscriber( "/imu/data",Imu,imu_callback,queue_size=10)
  vel_pub = rospy.Publisher( "/cmd_vel",Twist,queue_size=10)
  rospy.spin()


ctrl+s快捷保存

采用wpr_simulation开源工程,打开三个终端分别运行三条指令


roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun imu_pkg imu_node.py

39.png


可参照可以打开wpr_simulation里的script文件夹中demo_imu_behavior.py

40.png


7. 总结

本节学习了ROS机器人的IMU 惯性测量单元,尝试C++和python两种语言编写获取机器人姿态信息,并且结合前面的机器人运动编写了航向锁定节点,接下来会介绍机器人的更精彩的操作,期待你的关注。🎉🎉🎉

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
3月前
|
机器人 C++ Python
ROS2教程 02 功能包
本文是关于ROS2(机器人操作系统2)中功能包(package)管理的教程,介绍了如何检查功能包的依赖、创建新功能包、列出可执行文件、列出所有功能包、查询功能包的位置和描述信息,以及为C++和Python功能包配置必要的文件。
91 0
|
数据采集 数据可视化 Ubuntu
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 使用方法
该功能包提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 使用方法
|
3月前
|
Ubuntu Shell C++
在Ubuntu18.04上安装ros2的环境,ros2的常用命令:播放包、录制包等
在Ubuntu18.04上安装ros2的环境,ros2的常用命令:播放包、录制包等
138 1
|
3月前
|
机器人 Shell 开发者
ROS2教程08 ROS2的功能包、依赖管理、工作空间配置与编译
这篇文章是关于ROS2(Robot Operating System 2)中功能包、依赖管理、工作空间配置和编译的教程,涵盖了ROS2工作空间的概念、如何获取和安装功能包的依赖、构建工作空间的步骤,以及如何创建和管理ROS2功能包,包括使用命令行工具对功能包进行操作的方法。
317 0
ROS2教程08 ROS2的功能包、依赖管理、工作空间配置与编译
|
3月前
|
存储 缓存
02 ROS创建工作空间和功能包
如何在ROS中创建工作空间和功能包,包括初始化工作空间、编译、设置环境变量以及使用`catkin_create_pkg`创建新功能包的步骤。
47 1
|
Ubuntu Linux
ROS利用ros-kinetic-serial包与下位机串口通信
ROS利用ros-kinetic-serial包与下位机串口通信
223 0
ROS创建工作空间添加包并编译
ROS创建工作空间添加包并编译
198 0
|
开发工具 git
ROS 环境下 安装 turtlebot3 功能包及其仿真包 并测试 —— 全流程(报错及解决)
ROS 环境下 安装 turtlebot3 功能包及其仿真包 并测试 —— 全流程(报错及解决)
ROS 环境下 安装 turtlebot3 功能包及其仿真包 并测试   —— 全流程(报错及解决)
|
机器学习/深度学习 Ubuntu 开发工具
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 介绍
**什么是相机与激光雷达外参标定?** 就是相机坐标系和激光雷达坐标系的TF变化。位置x,y,z 欧拉角 roll,pitch,yaw,6个变量构成一个4*4的旋转变换矩阵 标定的就是这个4维的旋转矩阵。 标定的方法有: - 基于特征 - 基于运动观测 - 基于最大化互信息 - 基于深度学习 基于特征 的方法是根据对应特征点求解PnP问题,需要标定板来获取特征 基于运动观测可以看作手眼标定问题,精度决定于相机和雷达的运动估计 基于最大化互信息认为图像灰度于反射强度具有相关性 基于深度学习需要长时间的训练并且泛化能力不高
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 介绍
ROS学习-编译Package包
ROS学习-编译Package包
114 0

推荐镜像

更多