0x00 AHRS模块简介

在机器人的设计中,惯性测量单元IMU(Inertial measurement unit)是必不可少的一个模块,但是目前高精度的IMU模块是非常贵的,一般Xsens MTi系列IMU都在上万块,在这里我们介绍一款便宜实惠的IMU模块,但是与IMU不同的是该模块是AHRS(Attitude and heading reference system)航姿参考系统,淘宝价格大概80块左右,虽然输出数据有点误差,但是对于我们一般的ROS机器人已经可以用了。下面是该模块图片及相关参数:

GY-951(三轴陀螺仪+三轴加速度计+三轴数字罗盘)

Screenshot from 2017-12-27 10:07:12.png

外观尺寸 2.3cm*1.7cm
供电电压 3-5V
通信方式 TTL串口,波特率57600
模块芯片 处理器芯片 ATMEGA328P
三轴陀螺仪 ITG3205
三轴加速度计 ADXL345
三轴数字罗盘 HMC5883L
输出数据 偏行角(YAW  ) ±180°
横滚角( ROLL ) ±180°
俯仰角(PITCH) ±180°


0x01 连接GY-951模块

由于刚买回来的GY-951模块如下图左边所示,排针需要我们自己用电烙铁根据需要焊接上,右边的是我焊接好的样子:

sensor.jpeg

我们要想将模块输出的数据发送到ROS上进行处理显然我们还需要一个转接模块,我这里使用的是USB转TTL,当然其他的模块也可以,下面这三款是我用过确定可以和GY-951正常通信的,唯一不同的是另外两款需要再接一根miniUSB接口的线,跟安卓手机的那种microUSB线不同,如下图所示:

1514282536520880.jpeg

需要注意的是我们在进行GY-951的固件代码更新时,需要连接上DTR引脚才能将固件代码下载到GY-951中,在正常通信时就不用接DTR引脚,只需要接上VCC,GND,TX,RX即可,下面是总结:

GY-951模块 USB转接模块 连接图 备注
正常通信

VCC

GND

TX

RX

VCC

GND

RX

TX

1514358285904130.jpeg

在连接时需要注意IMU模块与转接模块连接时,

VCC,GND都是接相应的引脚,在接TX和RX

引脚时IMU模块需要与转接模块相反,即IMU模块

的TX接转接模块的RX,IMU模块的RX接转接模块的TX。

更新固件

VCC

GND

TX

RX

DTR

VCC

GND

RX

TX

DTR

1514358915174733.jpeg

在更新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相同,所以代码也应该是一样的可以通用。

Screenshot from 2017-12-27 09:58:52.png

然后从gitHub下载相应的代码,下载命令:git clone https://github.com/blmhemu/razor_imu_9dof.git,由于该代码目前只有ROS Indigo分支,因此我们需要先在Indigo上做测试,我们需要将该代码下载到ROS的工作空间源码目录下,一般就是我们自己ROS小车的工作目录,在这里我用自己的ROS工作空间做演示下载源码并解析源码各目录内容:

1514355316426407.png

下面来简单介绍固件代码的各源码文件作用,其中Math.ino没地方来标明了,它的作用就是一些简单的数学计算,例如向量的加法,向量的点乘(数量积、点积),矩阵乘法等:

Screenshot from 2017-12-27 15:22:35.png

接下来就需要在Arduino IDE中打开该固件代码,直接打开Razor_AHRS.ino文件即可:

Screenshot from 2017-12-27 15:21:48.png

Screenshot from 2017-12-27 15:39:57.png

接下来我们需要根据GY-951模块来配置该代码,直接修改Razor_AHRS.ino代码中HARDWARE OPTIONS部分即可:

Screenshot from 2017-12-27 16:03:17.png

接下来需要配置开发板和处理器和端口,找到适合GY-951的,这样才能将该代码下载到模块中,注意开发板需要选择:Arduino Pro or Pro Mini,处理器选择:ATmega328P(3.3V,8MHz),端口根据需要选择,我这里选择的是ttyUSB0:

board.jpeg

cpu.jpeg

port.jpeg

当点击上传按钮后,即可自动编译该固件代码,然后将生成的文件上传到GY-951模块中,根据Arduino IDE下面的窗口可得知是否上传成。

Screenshot from 2017-12-27 16:40:18.png

接下来通过调试模块的串口输出数据来看模块是否可以工作了,直接打开IDE中的串口监视器即可,当看到串口有数据输出表明我们的模块固件更新已经完成了:

serialPort.jpeg

1514365061769103.png


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文件复制一份用:

Screenshot from 2017-12-27 19:33:49.png

我们查看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一下或者重启电脑后,以后就永久生效了。

Screenshot from 2017-12-27 20:37:39.png

通过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显示数据:

corvin@workspace:~/project/omniWheelCareRobot/rosCode$ roslaunch razor_imu_9dof razor-pub-and-display.launch
... logging to /home/corvin/.ros/log/fc30add4-ec66-11e7-8528-1866da14be59/roslaunch-workspace-16324.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://192.168.31.186:19943/

SUMMARY
========

PARAMETERS
 * /imu_node/accel_x_max: 250.0
 * /imu_node/accel_x_min: -250.0
 * /imu_node/accel_y_max: 250.0
 * /imu_node/accel_y_min: -250.0
 * /imu_node/accel_z_max: 250.0
 * /imu_node/accel_z_min: -250.0
 * /imu_node/calibration_magn_use_extended: False
 * /imu_node/gyro_average_offset_x: 0.0
 * /imu_node/gyro_average_offset_y: 0.0
 * /imu_node/gyro_average_offset_z: 0.0
 * /imu_node/imu_yaw_calibration: 0.0
 * /imu_node/magn_ellipsoid_center: [0, 0, 0]
 * /imu_node/magn_ellipsoid_transform: [[0, 0, 0], [0, 0...
 * /imu_node/magn_x_max: 600.0
 * /imu_node/magn_x_min: -600.0
 * /imu_node/magn_y_max: 600.0
 * /imu_node/magn_y_min: -600.0
 * /imu_node/magn_z_max: 600.0
 * /imu_node/magn_z_min: -600.0
 * /imu_node/port: /dev/ttyUSB0
 * /rosdistro: indigo
 * /rosversion: 1.11.21

NODES
  /
    display_3D_visualization_node (razor_imu_9dof/display_3D_visualization.py)
    imu_node (razor_imu_9dof/imu_node.py)

auto-starting new master
process[master]: started with pid [16336]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to fc30add4-ec66-11e7-8528-1866da14be59
process[rosout-1]: started with pid [16349]
started core service [/rosout]
process[imu_node-2]: started with pid [16360]
process[display_3D_visualization_node-3]: started with pid [16367]
[INFO] [WallTime: 1514531273.567938] Reconfigure request for yaw_calibration: 0
[INFO] [WallTime: 1514531273.568119] Set imu_yaw_calibration to 0
[INFO] [WallTime: 1514531273.583307] Opening /dev/ttyUSB0...
[INFO] [WallTime: 1514531273.587696] Giving the razor IMU board 5 seconds to boot...
[INFO] [WallTime: 1514531279.590087] Writing calibration values to razor IMU board...
[INFO] [WallTime: 1514531280.710073] Printing set calibration values:
ACCEL_X_MIN:-250.00
ACCEL_X_MAX:250.00
ACCEL_Y_MIN:-250.00
ACCEL_Y_MAX:250.00
ACCEL_Z_MIN:-250.00
ACCEL_Z_MAX:250.00

MAGN_X_MIN:-600.00
MAGN_X_MAX:600.00
MAGN_Y_MIN:-600.00
MAGN_Y_MAX:600.00
MAGN_Z_MIN:-600.00
MAGN_Z_MAX:600.00

MAGN_USE_EXTENDED:false
magn_ellipsoid_center:[0.0000,0.0000,0.0000]
magn_ellipsoid_transform:[[0.0000000,0.0000000,0.0000000],[0.0000000,0.0000000,0.0000000],[0.0000000,0.0000000,0.0000000]]

GYRO_AVERAGE_OFFSET_X:0.00
GYRO_AVERAGE_OFFSET_Y:0.00
GYRO_AVERAGE_OFFSET_Z:0.00

[INFO] [WallTime: 1514531280.710284] Flushing first 200 IMU entries...
[INFO] [WallTime: 1514531284.814904] Publishing IMU data...

Screenshot from 2017-12-29 15:11:07.png

此时可以查看话题列表,通过rostopic list查看,可以发现已经组装好的imu话题,可以echo出来查看数据格式和内容:

Screenshot from 2017-12-29 15:56:57.png


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就可以了。

Screenshot from 2017-12-29 17:10:27.png

当安装好Rviz中显示IMU的插件后,我们就可以打开Rviz了,直接在终端中输入rviz即可打开,当打开后第一步就是要添加我们刚才安装好的插件:

Screenshot from 2017-12-29 16:41:46.png

当添加好插件后,就可以在Rviz的中心显示区域显示出一个xyz的坐标,我们接下来需要配置一下就可以将GY-951模块的信息在Rviz中显示出来了,根据下图提示来配置Rviz即可,这样当我们晃动GY-951模块时会发现在Rviz中的IMU插件也同步在晃动:

Screenshot from 2017-12-29 16:42:25.png

分类: 惯性测量单元

发表评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d 博主赞过:
跳至工具栏