目录
前言
记录使用IMU-N100的过程,之前主要是直接使用了它的解算数据。总感觉缺点什么于是就打算自己解算一下它的数据。首先是数据的通信,我们需要先确定有数据的输出才能进行下一步的工作。所以第一步要做的就是利用串口通信来把IMU采集到的数据输出到咱们的屏幕上来,好了话不多说接下来开始步入正题!
一、查看接入的usb设备
打开终端,输入如下命令来查看挂载的usb设备,因为ubuntu下一切皆文件,所以这个/dev文件夹下会把外部连接的usb设备映射为一个文件。我的是USB0。如下图
ls -l /dev/ttyUSB*
二、安装serial包
我的ubuntu版本是ubuntu 18.04所以是ros-melodic-serial,如果是ubuntu 16.04或是其他版本一定要查询对应的ros版本,否则不会安装成功。
sudo apt-get install ros-melodic-serial
安装成功后在终端输入
roscd serial/
会进入到安装目录中去我的安装在了这个目录下:
三、测试imu是否有数据输出到屏幕
1、创建功能包
cd ~
mkdir -p imu_data_test/src
cd imu_data_test
catkin_make
cd src
catkin_create_pkg imu_test std_msgs roscpp serial
cd imu_test/src
touch imu_pub.cpp
2、编写CMakeLists.txt文件
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(imu_pub src/imu_pub.cpp)
target_link_libraries(imu_pub ${catkin_LIBRARIES})
3、编写imu_pub.cpp文件
这里我把imu的原始数据存入到ros_buffer(自己定义的变量,在代码中可以看见)用来存储通过串口接受到的数据,在后面我们会写一个imu_sub.cpp文件来订阅这个imu_pub.cpp发布的话题并作出相应的处理(这里我们只是一个简单的打印数据)。
#include<ros/ros.h>
#include<serial/serial.h>
#include<std_msgs/String.h>
#include<std_msgs/UInt8MultiArray.h>
#include<std_msgs/MultiArrayDimension.h>
#define MAXSIZE 1024
serial::Serial ser;
int main(int argc, char *argv[])
{
ros::init(argc,argv,"imu_publish");
ros::NodeHandle nh;
ros::Publisher pub_imu=nh.advertise<std_msgs::UInt8MultiArray>("imu_raw_data",1000);
try
{
ser.setPort("/dev/ttyUSB0");
ser.setBaudrate(921600);
serial::Timeout to=serial::Timeout::simpleTimeout(1000);
ser.setTimeout(to);
ser.open();
}
catch(serial::IOException& e)
{
ROS_ERROR_STREAM("Unable to open port!");
return -1;
}
if(ser.isOpen())
{
ROS_INFO_STREAM("Serial Port Initialized!");
}
else
{
return -1;
}
ros::Rate loop_rate(100);
while (ros::ok())
{
size_t num=ser.available();
std_msgs::UInt8MultiArray ros_buffer;
if(num!=0)
{
ser.read(ros_buffer.data,num);
//这部分注释可以打开,就直接把原始数据以十六进制的方式打印输出到屏幕上
//但是为了之后的方便这里我把这个写成了一个发布者,之后会有订阅者来订阅这个发布者
//发布的话题,并作出相应的处理。
// for(int i=0;i<ros_buffer.data.size();i++)
// {
// std::cout<<std::hex<<(ros_buffer.data[i]&0xff)<<" ";
// }
// std::cout<<std::endl;
}
pub_imu.publish(ros_buffer);
loop_rate.sleep();
}
return 0;
}
4、测试结果
1)将注释打开,测试结果
这里都是十六进制数
2)将部分代码注释,测试结果
因为只是一个发布者,所以没有相关信息的输出
如果想看输出的结果,可以通过ros中的话题订阅来查看,打开终端并输入:
rostopic list
可以看到有我们发布的话题 /imu_raw_data。
之后再在终端中输入如下命令
rostopic echo /imu_raw_data
同样可以得到一个测试结果,不过是以十进制的方式表示的,如下图所示
总结
这部分主要就是进行了一个串口通信,主要就掌握一下serial的使用和部分函数的调用以及ros中的发布者的使用,如何在没有订阅者的情况下打印输出信息。再下一篇文章中我会介绍如何使用ros中的订阅者来订阅 /raw_imu_data 话题并作出相应的处理。