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 ...
随机推荐
- HTML5 Geolocation API地理定位整理(二)
Geolocation 实例demo 1.使用watchPosition()监听客户端位置 var watchOne=null; if (navigator.geolocation) { //watc ...
- main函数的参数argc和argv
版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/20413773 该篇 ...
- Html、Asp、Php、Jsp禁止页面缓存
html:<meta http-equiv="pragma" content="no-cache"><meta http-equiv=&quo ...
- 一步一步学SpringDataJpa——JpaRepository查询功能
原文地址: https://blog.csdn.net/ming070423/article/details/22086169 1.JpaRepository支持接口规范方法名查询.意思是如果在接口中 ...
- PHP一句话木马研究
最近在研究PHP一句话后门,查阅了很多大佬的博客,并从中衍生出了一些可用的方法. 现总结如下: 方案一:回调函数 回调函数:Callback (即call then back 被主函数调用运算后会返回 ...
- Libnids(Library Network Intrusion Detection System) .
Libnids(Library Network Intrusion Detection System)是一个网络入侵检测开发的专业编程接口.它实现了基于网络的入侵检测系统的基本框架,并提供了一些基本的 ...
- Qt学习之路(28): 坐标变换
经过前面的章节,我们已经能够画出一些东西来,主要就是使用QPainter的相关函数.今天,我们要看的是QPainter的坐标系统. 同很多坐标系统一样,QPainter的默认坐标的原点(0, 0) ...
- Sqlserver 2008 R2安装的盘符空间不够用的解决办法
例如我把一个sqlserver数据库安装在了D盘,结果发现D盘只剩下20G的可用空间,可是数据却每天的在增长,如何办?于是百度到了以下解决办法 方法很多: 1.可以给primary文件组添加文件.选择 ...
- React从0到1
本篇将一直更新下去,写的多了,可能会拆成小章节,记录完整的学习笔记 github https://github.com/ae6623/ReactL
- [Canvas]越来越近的女孩
本作比前作增加了控制功能,观看动态效果请点此下载代码用Chrome或Firfox浏览器观看. 图例: 代码: <!DOCTYPE html> <html lang="utf ...