这是一个将姿态传感器数据发布到ROS话题上教程,姿态传感器数据通信格式为UART,数据包括航向角的四元素、角加速度、线加速度
MINI SRC姿态传感器(UART)
1. 传感器数据协议
起始帧 | 本帧字节数 | 帧功能 | 航向角/加速度 | 解算速度/磁力计 | 帧校验 | 帧结束 |
---|---|---|---|---|---|---|
0XA5 0x5A | 0x10 | 0xA1 | 0xXX 0xXX | 0xXX 0xXX | 0xXX | 0xAA |
0xA5 0x5A | 0x16 | 0xA2 | 0xXX 0xXX | 0xXX 0xXX | 0xXX | 0xAA |
- 0xXX 先为数据高位,紧接着是低位
- 数据包括航向角、角加速度、线加速度
- 航向角的单位为0.1度,即乘以0.1后为数据的角度度数;角加速度、线加速度为ADC测量值,分别对应量程换算(角加速度(2000/65536)、线加速度(4.2*9.81/65536))
2. 编写发布话题数据包
2.1安装额外ROS依赖包(见一)
sudo apt-get install ros-kinetic-rosserial
2.2ubuntu创建ROS包
uart_read为包名称,后面为依赖项,由于姿态传感器非常适合sensor_msgs/Imu数据结构所以使用
roscreate-pkg uart_read roscpp
2.3编写CMakeLists.txt
安装生成的CMakeLists.txt修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29cmake_minimum_required(VERSION 2.8.3)
project(uart_read)
add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
serial
std_msgs
sensor_msgs
tf
geometry_msgs
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES uart_read
CATKIN_DEPENDS serial std_msgs sensor_msgs geometry_msgs tf roscpp
# DEPENDS system_lib
)
# include
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node src/uart_read.cpp)
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
2.4修改package.xml
1 | <!-- 删除 version=2.0因为版本问题 --> |
2.5编写文件src/uart_read.cpp(原生成.cpp文件修改名称得到)
1 |
|
2.6编写launch文件
总共使用四个姿态传感器因此使用四个USB口,注意name和value名称不要冲突1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<launch>
<node pkg="uart_read" type="uart_read_node" name="uart_read_node0" required="true">
<param name="port" value="/dev/ttyUSB0"/>
<param name="NodeHandle_name" value="imu0"/>
<param name="pub_name" value="data"/>
</node>
<node pkg="uart_read" type="uart_read_node" name="uart_read_node1" required="true">
<param name="port" value="/dev/ttyUSB1"/>
<param name="NodeHandle_name" value="imu1"/>
<param name="pub_name" value="data1"/>
</node>
<node pkg="uart_read" type="uart_read_node" name="uart_read_node2" required="true">
<param name="port" value="/dev/ttyUSB2"/>
<param name="NodeHandle_name" value="imu2"/>
<param name="pub_name" value="data1"/>
</node>
<node pkg="uart_read" type="uart_read_node" name="uart_read_node3" required="true">
<param name="port" value="/dev/ttyUSB3"/>
<param name="NodeHandle_name" value="imu3"/>
<param name="pub_name" value="data1"/>
</node>
</launch>