1.配置和显示惯性测量单元AHRS模块_GY-951
0x00 AHRS模块简介
在机器人的设计中,惯性测量单元IMU(Inertial measurement unit)是必不可少的一个模块,但是目前高精度的IMU模块是非常贵的,一般Xsens MTi系列IMU都在上万块,在这里我们介绍一款便宜实惠的IMU模块,但是与IMU不同的是该模块是AHRS(Attitude and heading reference system)航姿参考系统,淘宝价格大概80块左右,虽然输出数据有点误差,但是对于我们一般的ROS机器人已经可以用了。下面是该模块图片及相关参数:
GY-951(三轴陀螺仪+三轴加速度计+三轴数字罗盘) | ||
外观尺寸 | 2.3cm*1.7cm | |
供电电压 | 3-5V | |
通信方式 | TTL串口,波特率57600 | |
模块芯片 | 处理器芯片 | ATMEGA328P |
三轴陀螺仪 | ITG3205 | |
三轴加速度计 | ADXL345 | |
三轴数字罗盘 | HMC5883L | |
输出数据 | 偏行角(YAW ) | ±180° |
横滚角( ROLL ) | ±180° | |
俯仰角(PITCH) | ±180° |
0x01 连接GY-951模块
由于刚买回来的GY-951模块如下图左边所示,排针需要我们自己用电烙铁根据需要焊接上,右边的是我焊接好的样子:
我们要想将模块输出的数据发送到ROS上进行处理显然我们还需要一个转接模块,我这里使用的是USB转TTL,当然其他的模块也可以,下面这三款是我用过确定可以和GY-951正常通信的,唯一不同的是另外两款需要再接一根miniUSB接口的线,跟安卓手机的那种microUSB线不同,如下图所示:
需要注意的是我们在进行GY-951的固件代码更新时,需要连接上DTR引脚才能将固件代码下载到GY-951中,在正常通信时就不用接DTR引脚,只需要接上VCC,GND,TX,RX即可,下面是总结:
GY-951模块 | USB转接模块 | 连接图 | 备注 | |
正常通信 |
VCC GND TX RX |
VCC GND RX TX |
在连接时需要注意IMU模块与转接模块连接时, VCC,GND都是接相应的引脚,在接TX和RX 引脚时IMU模块需要与转接模块相反,即IMU模块 的TX接转接模块的RX,IMU模块的RX接转接模块的TX。 |
|
更新固件 |
VCC GND TX RX DTR |
VCC GND RX TX DTR |
在更新GY-951固件代码时连接引脚时唯一的不一样 就是多接了一根DTR引脚,只有接了DTR引脚才能 将固件代码通过Arduino IDE下载到GY-951中。 (此时需要带有miniUSB接口的转接模块才带有DTR引脚) |
0x02 更新GY-951固件
由于从淘宝上买回来的GY-951固件代码比较旧,要想模块可以正常工作,第一件事就是要更新模块的固件代码,在这里我们使用ROS中razor_imu_9dof这个软件包里面的固件代码,之所以要使用该软件包中估计代码是因为该软件包是为SparkFun出品的Razor IMU 9DOF (Degree of freedom) sensor boards,该IMU模块的各传感器模块正好与我们的GY-951相同,所以代码也应该是一样的可以通用。
然后从gitHub下载相应的代码,下载命令:git clone https://github.com/blmhemu/razor_imu_9dof.git,由于该代码目前只有ROS Indigo分支,因此我们需要先在Indigo上做测试,我们需要将该代码下载到ROS的工作空间源码目录下,一般就是我们自己ROS小车的工作目录,在这里我用自己的ROS工作空间做演示下载源码并解析源码各目录内容:
下面来简单介绍固件代码的各源码文件作用,其中Math.ino没地方来标明了,它的作用就是一些简单的数学计算,例如向量的加法,向量的点乘(数量积、点积),矩阵乘法等:
接下来就需要在Arduino IDE中打开该固件代码,直接打开Razor_AHRS.ino文件即可:
接下来我们需要根据GY-951模块来配置该代码,直接修改Razor_AHRS.ino代码中HARDWARE OPTIONS部分即可:
接下来需要配置开发板和处理器和端口,找到适合GY-951的,这样才能将该代码下载到模块中,注意开发板需要选择:Arduino Pro or Pro Mini,处理器选择:ATmega328P(3.3V,8MHz),端口根据需要选择,我这里选择的是ttyUSB0:
当点击上传按钮后,即可自动编译该固件代码,然后将生成的文件上传到GY-951模块中,根据Arduino IDE下面的窗口可得知是否上传成。
接下来通过调试模块的串口输出数据来看模块是否可以工作了,直接打开IDE中的串口监视器即可,当看到串口有数据输出表明我们的模块固件更新已经完成了:
0x03 配置ROS代码
现在GY-951模块代码已经有数据输出,但是该数据我们还无法在ROS中使用,需要将该数据进行ROS能识别的IMU格式数据封装才行,接下来我们就开始配置相应的ROS部分代码,首先我们从launch文件入手来分析ROS部分代码,我们先从razor-pub.launch分析,该文件内容如下:
<launch> <arg name="razor_config_file" default="$(find razor_imu_9dof)/config/my_razor.yaml"/> <node pkg="razor_imu_9dof" type="imu_node.py" name="imu_node" output="screen"> <rosparam file="$(arg razor_config_file)" command="load"/> </node> </launch>
从arg部分看出,需要加载razor_config_file参数,该参数是从my_razor.yaml文件中读取,但是该文件默认不存在,需要我们从razor.yaml文件复制一份用:
我们查看my_razor.yaml文件,查看该配置文件中内容,然后根据需要做相应的修改,主要需要修改的就是port端口号:
## USB port port: /dev/ttyUSB0 ##### Calibration #### ### accelerometer accel_x_min: -250.0 accel_x_max: 250.0 accel_y_min: -250.0 accel_y_max: 250.0 accel_z_min: -250.0 accel_z_max: 250.0 ### magnetometer # standard calibration magn_x_min: -600.0 magn_x_max: 600.0 magn_y_min: -600.0 magn_y_max: 600.0 magn_z_min: -600.0 magn_z_max: 600.0 # extended calibration calibration_magn_use_extended: false magn_ellipsoid_center: [0, 0, 0] magn_ellipsoid_transform: [[0, 0, 0], [0, 0, 0], [0, 0, 0]] # AHRS to robot calibration imu_yaw_calibration: 0.0 ### gyroscope gyro_average_offset_x: 0.0 gyro_average_offset_y: 0.0 gyro_average_offset_z: 0.0
我们需要修改的部分主要就是USB port端口号,但是在使用该端口号时需要注意权限问题,注意当前用户有没有在dialout组中,如果没有的话需要使用"sudo usermod -aG dialout 用户名"将当前用户添加到dialout组中, 因为默认情况下,只有root用户和属于dialout组的用户会有读写权限,因此直接把自己的用户加入到dialout组就可以了,操作完命令后要logout一下或者重启电脑后,以后就永久生效了。
通过groups命令可以查看当前用户有没有在dialout组中,由于我以前已经把用户添加到dialout组中,因此我就不用执行了,如果你没有发现dialout组,可以通过上述命令来添加。当增加好权限后,我们就可通过3D可视化来查看GY-951模块的输出数据的实际效果了,但是在使用可视化模块前需要安装一个软件,通过以下命令安装:
sudo apt-get install python-visual
然后就可以在ROS工作空间代码下执行catkin_make进行编译,编译完成后source devel/setup.bash,就可以来执行razor-imu-9dof的ROS部分代码来3D显示数据:
此时可以查看话题列表,通过rostopic list查看,可以发现已经组装好的imu话题,可以echo出来查看数据格式和内容:
0x04 在Rviz中显示IMU数据
在Rviz中如果要想显示IMU数据的话,需要提前安装一个Rviz显示插件,安装方式有两种,第一种直接通过apt-get install来安装,第二种通过源码自己编译,下面我分别来介绍两种安装方式:
(1)apt直接安装
这种方式是最简单快捷的,我们直接在终端中输入:sudo apt-get install ros-indigo-imu-tools就可以了,当然我这里是在indigo系统下安装的,大家需要根据自己安装的ROS版本来选择可以在kinetic系统中输入 sudo apt-get install ros-kinetic-imu-tools就可以安装了。
(2)通过源码安装
由于源码需要通过git来下载,那么就需要先保证已经安装了git-core软件包,直接通过sudo apt-get install git-core来安装,接下来下载源码,我们首先需要切换到ROS中自己创建的工作空间源码目录下,然后开始从github下载源码:
git clone -b indigo https://github.com/ccny-ros-pkg/imu_tools.git
我这里下载的是indigo分支代码,大家根据自己ROS的版本来选择,该源码网址是:https://github.com/ccny-ros-pkg/imu_tools,大家可以从该网址找到更多的信息。接下来在编译该源码之前,需要检查该源码的依赖包,将依赖包先安装好才能源码编译,安装依赖包的命令是:rosdep install imu_tools,安装好依赖包后,接下来就开始在工作空间的根目录下执行catkin_make就可以了。
当安装好Rviz中显示IMU的插件后,我们就可以打开Rviz了,直接在终端中输入rviz即可打开,当打开后第一步就是要添加我们刚才安装好的插件:
当添加好插件后,就可以在Rviz的中心显示区域显示出一个xyz的坐标,我们接下来需要配置一下就可以将GY-951模块的信息在Rviz中显示出来了,根据下图提示来配置Rviz即可,这样当我们晃动GY-951模块时会发现在Rviz中的IMU插件也同步在晃动:
[wshop_reward]