ROS中发布IMU传感器消息
下面使用SYD Dynamics的9轴AHRS(Attitude and heading reference system),来发布sensor_msgs/Imu类型的消息。

将传感器用USB转串口接到Ubuntu系统上,可以用如下命令查看串口信息:
ls -l /dev/tty*
查询出串口名为“/dev/ttyUSB0”。根据官方给的传感器程序源文件和boost::asio库来实现串口发送request指令,并读取传感器返回的四元数信息。之后将其发送到/IMU_data的话题上:
// Step 1: Include Library Headers:
#include "EasyObjectDictionary.h"
#include "EasyProfile.h" #include <ros/ros.h>
#include <sensor_msgs/Imu.h> #include <boost/asio.hpp> // 包含boost库函数
#include <boost/bind.hpp>
using namespace boost::asio;
int main(int argc, char** argv)
{
// Step 2: Initialization:
EasyProfile_C_Interface_Init(); ros::init(argc, argv, "imu");
ros::NodeHandle n; ros::Publisher IMU_pub = n.advertise<sensor_msgs::Imu>("IMU_data", ); io_service io;
serial_port sp(io, "/dev/ttyUSB0"); // 定义传输的串口
sp.set_option(serial_port::baud_rate()); // 波特率
sp.set_option( serial_port::flow_control( serial_port::flow_control::none ) ); // 流量控制
sp.set_option( serial_port::parity( serial_port::parity::none ) ); // 奇偶校验
sp.set_option( serial_port::stop_bits( serial_port::stop_bits::one ) ); // 停止位
sp.set_option( serial_port::character_size( ) ); // 数据位 ros::Rate loop_rate();
while(ros::ok())
{
// Step 3 and Step 4 are optional, only if you want to use the request-response communication pattern
// Step 3: Request quaternion Data from TransdcuerM
uint16 toId = ; // Node ID
char* txData;
int txSize;
if(EP_SUCC_ == EasyProfile_C_Interface_TX_Request(toId, EP_CMD_Q_S1_E_, &txData, &txSize))
{
write(sp, buffer(txData, txSize)); // Step 4: Send the request via Serial Port.
} char rxData[];
boost::system::error_code err; sp.read_some(buffer(rxData, ),err); // Read from serial port buffer
if (err)
{
ROS_INFO("Serial port read_some Error!");
return -;
} Ep_Header header; // Then let the EasyProfile do the rest such as data assembling and checksum verification.
if( EP_SUCC_ == EasyProfile_C_Interface_RX((char*)rxData, , &header))
{
// Quanternion received
unsigned int timeStamp = ep_Q_s1_e.timeStamp;
float q1 = ep_Q_s1_e.q[]; // Note 1, ep_Q_s1_e is defined in the EasyProfile library as a global variable
float q2 = ep_Q_s1_e.q[]; // Note 2, for the units and meaning of each value, refer to EasyObjectDictionary.h
float q3 = ep_Q_s1_e.q[];
float q4 = ep_Q_s1_e.q[];
ROS_INFO("Q: %f %f %f %f\n", q1, q2, q3, q4); sensor_msgs::Imu imu_data;
imu_data.header.stamp = ros::Time::now();
imu_data.header.frame_id = "base_link";
imu_data.orientation.x = q3;
imu_data.orientation.y = -q2;
imu_data.orientation.z = -q1;
imu_data.orientation.w = q4; IMU_pub.publish(imu_data);
} io.run();
ros::spinOnce();
loop_rate.sleep();
} return ;
}
在CMakeLists中添加:
add_compile_options(-std=c99) aux_source_directory(./src DIR_SRCS)
add_executable(imu ${DIR_SRCS} )
target_link_libraries(imu ${catkin_LIBRARIES})
使用catkin_make编译后,source ./devel/setup.bash,然后运行rosrun imu imu。这时可能会出现无法打开串口的错误,给串口添加权限后再次运行:
sudo chmod /dev/ttyUSB0
无问题后可以输入下面的指令查看话题,转动IMU可以看到orientation的四个分量一直在变化:
rostopic echo /IMU_data

为了更形象的显示IMU姿态,可以下载rviz_imu_plugin插件并安装。The rviz_imu_plugin package is used to display sensor_msgs/Imu messages in rviz. Once you download and compile the package, it should be visible as a plugin. It displays the orientation of the IMU using a box as well as and coordinate axes. The acceleration can be visualized using a vector.
Make sure you have git installed:
sudo apt-get install git-core
Download the stack from our repository into your catkin workspace
git clone -b indigo https://github.com/ccny-ros-pkg/imu_tools.git
Compile the stack:
cd ~/catkin_ws
catkin_make
装好后打开rviz,可以看到rviz_imu_plugin与rviz中默认自带的rviz_plugin_tutorials并不一样:

在rviz_imu_plugin下添加imu,修改Fixed Frame为base_link,IMU下面的Topic选为/IMU_data,转动IMU rviz中的虚拟立方体和坐标轴会跟着转动(可以更改box三个方向尺寸的比例):

参考:
Serial Cross-platform, Serial Port library written in C++
ROS中发布IMU传感器消息的更多相关文章
- ROS中发布激光扫描消息
激光雷达工作时会先在当前位置发出激光并接收反射光束,解析得到距离信息,而后激光发射器会转过一个角度分辨率对应的角度再次重复这个过程.限于物理及机械方面的限制,激光雷达通常会有一部分“盲区”.使用激光雷 ...
- ROS中利用V-rep进行地图构建仿真
V-rep中显示激光扫描点 在VREP自带的场景中找到practicalPathPlanningDemo.ttt文件,删除场景中多余的物体只保留静态的地图.然后在Model browser→comp ...
- 对比几种在ROS中常用的几种SLAM算法
在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是 ...
- 将ROS中的/sensor_msgs/NavSatFix数据导入google earth显示轨迹
将ros中的gps_msg数据导入google earth显示轨迹 [TOC] 1. 获取GPS数据 将ros中发布的gps topic输出到文本中 rostopic echo -p /gpsData ...
- [转]ROS 传感器消息及RVIZ可视化Laserscan和PointCloud
https://blog.csdn.net/yangziluomu/article/details/79576508 https://answers.ros.org/question/60239/ho ...
- ROS中的日志(log)消息
学会使用日志(log)系统,做ROS大型项目的主治医生 通过显示进程的运行状态是好的习惯,但需要确定这样做不会影响到软件的运行效率和输出的清晰度.ROS 日志 (log) 系统的功能就是让进程生成一些 ...
- ROS开发--在订阅话题的回调函数中发布话题
处理激光数据时,需要将处理后的激光数据再发布,需要保持一致的频率,所以必须在回调函数中发布激光数据信息. 代码参考:https://blog.csdn.net/heyijia0327/article/ ...
- ROS中测试机器人里程计信息
在移动机器人建图和导航过程中,提供相对准确的里程计信息非常关键,是后续很多工作的基础,因此需要对其进行测试保证没有严重的错误或偏差.实际中最可能发生错误的地方在于机器人运动学公式有误,或者正负号不对, ...
- ROS主题发布订阅
节点是一个可执行程序,它连接到了ROS的网络系统中.我们将会创建一个发布者,也就是说话者节点,它将会持续的广播一个信息. 改变目录到之前所建立的那个包下: cd ~/catkin_ws/src/beg ...
随机推荐
- Java(C#)基础差异-数组
1.填充数组 Java 数组填充替换方法Arrays.fill() 举例如下: import java.util.Arrays; public class FillDemo { public stat ...
- tf.argmax
tf.argmax(input, axis=None, name=None, dimension=None) Returns the index with the largest value acro ...
- [转]Infobright是一个与MySQL集成的开源数据仓库
[文章作者:张宴 本文版本:v1.1 最后修改:2010.05.18 转载请注明原文链接:http://blog.zyan.cc/infobright/] Infobright是一个与MySQL集成的 ...
- Error:(13, 60) java: 程序包com.sun.tools.internal.xjc.reader.xmlschema.bindinfo不存在
我在import maven项目时,pom.xml报错Missing artifact com.sun:tools:jar:1.5.0,经过盘查发现是pom引入的struts2相关jar包导致报错. ...
- Swift3.0:NSURLConnection的使用
一.介绍 应用中也不必不可少的会使用网络通信,增强客户端和服务器的交互,可以使用NSURLConnection实现http通信. NSURLConnection提供了异步请求和同步请求两种请求方式.同 ...
- CoffeeScript?TypeScript?还是JavaScript
请注意本文只是我的偏见,我努力地理解借助CoffeeScript或TypeScript之类的编译器写JavaScript代码的理由.静态编译.强类型语言和框架,我有着这些流行的.丰富的背景.我的上一份 ...
- 【Java】Java-XML解析利器-SAX-高性能-易用
Java-XML解析利器-SAX-高性能-易用 java xml 大_百度搜索 (3)java处理比较大的xml文件 - SegmentFault How to read UTF-8 XML file ...
- vim上次和下次光标位置
ctrl + I 下次光标位置 ctrl + o上次光标位置.
- C++ REST SDK i
Welcome! The C++ REST SDK is a Microsoft project for cloud-based client-server communication in nati ...
- ASP入门(十四)-FileSystemObject 对象
File Access 组件中常见的对象有 FileSystemObject.TextStream.File.Folder.Drive等,其中每一个对象都有不同的属性和方法,我们将会在用到的时候进行详 ...