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 ...
随机推荐
- OpenResty全功能Web应用服务器,打包了标准的 nginx 核心
OpenResty打包了标准的 nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过揉和众多设计良好的 nginx 模块,OpenResty 有效地把 nginx 服务器转变为一个 ...
- Gradle 简介
一.简介 Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前和之后都有对应更快的编译工具出现,但是 Gradle 的优势就在于它是亲儿子,Gradle 确实比较慢,这和 ...
- Lp空间
在数学中,Lp空间是由p次可积函数组成的空间:对应的ℓp空间是由p次可和序列组成的空间.它们有时叫做勒贝格空间,以昂利·勒贝格命名(Dunford & Schwartz 1958,III.3) ...
- [转]memcached+magent实现memcached集群
From : http://www.cnblogs.com/happyday56/p/3461113.html 首先说明下memcached存在如下问题 本身没有内置分布式功能,无法实现使用多台Mem ...
- Intelli系列代理部分报错:You have JVM property https.proxyHost set..
You have JVM property https.proxyHost set to '...'. This may lead to incorrect behaviour. Proxy shou ...
- 2、Python特征
Python特征 Python编程语言中的定位 脚本语言 高阶动态编程语言 简单易学 Python是一种代表简单主义思想的语言.Python的这种伪代码本质是它最大的优点之一.它使你能够专注于解决问题 ...
- Libnids(Library Network Intrusion Detection System) .
Libnids(Library Network Intrusion Detection System)是一个网络入侵检测开发的专业编程接口.它实现了基于网络的入侵检测系统的基本框架,并提供了一些基本的 ...
- ORM数据库框架 SQLite 常用数据库框架比较 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 用eclipse 玩转cocos 2dx开发
开始研究cocos2dx,mark一下这个的配置步骤 1 下载eclipse 2 下载android sdk,配置sdk路径,添加环境变量 3 安装adt 4 下载android ndk,配 ...
- Java复习2-对象与类
回顾基础知识过程中遇到的感觉需要记录一下的知识点. 封装 我们设计的class应当尽可能的高内聚,体现为封装的程度.一个class的属性应该只能自己修改,其他class都只是与本class沟通,而不应 ...