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多线程之Callable接口与Runnable的实现以及选择
通过实现Runnable接口的实现 package Thread; import java.util.concurrent.ExecutorService;import java.util.concu ...
- remote: GitLab: You are not allowed to push code to protected branches on this project.
"C:\Program Files\Git\bin\git.exe" push --recurse-submodules=check --progress "origin ...
- 第十章 dubbo线程模型
一 netty的线程模型 在netty中存在两种线程:boss线程和worker线程. 1 boss线程 作用: accept客户端的连接: 将接收到的连接注册到一个worker线程上 个数: 通常情 ...
- ajax hash缓存
hash 模拟url路由 function hashdone(){ var hash; hash=(!window.location.hash)?"#one&qu ...
- JS实现异步编程的4种方法
一.回调函数 这是异步编程最基本的方法. 假定有两个函数f1和f2,后者等待前者的执行结果. f1(); f2(); //如果f1是一个很耗时的任务,可以考虑改写f1,把f2写成f1的回调函数. fu ...
- Base64原理与实现
Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式. 如果剩下的字符不足3个字节,则用0填充 ...
- lstm(一) 演化之路
递归神经网络引入了时序的反馈机制,在语音.音乐等时序信号的分析上有重要的意义. Hochreiter(应该是Schmidhuber的弟子)在1991年分析了bptt带来的梯度爆炸和消失问题,给学习算法 ...
- JAVA-开发IDE版本
Eclipse发布的完整列表包括: Neon, June 22, 2016 Mars, June 24, 2015 Luna, June 25, 2014 Kepler, June 26, 2013 ...
- 转: linux进程地址图解
http://www.cnblogs.com/clover-toeic/p/3754433.html
- ASP入门(八)-Request对象
Request是ASP的耳朵,它可以获得客户端传递来的消息. BinaryRead方法和TotalBytes属性 用于以二进制方式读取客户端的请求,比如处理通过客户端上传文件时,通常使用这个方法来读取 ...