WHEELTEC IMU-N100惯导模块之串口通信(一)

目录

前言

一、查看接入的usb设备

二、安装serial包

三、测试imu是否有数据输出到屏幕

1、创建功能包

2、编写CMakeLists.txt文件

3、编写imu_pub.cpp文件

 4、测试结果

1)将注释打开,测试结果

2)将部分代码注释,测试结果

总结


前言

记录使用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 话题并作出相应的处理。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值