使用WTGAHRS2(JY-GPSIMU)在ROS中读取数据并发布话题

IMU简介

在这里插入图片描述

 十轴惯性导航传感器WTGAHRS2传感器集成高精度的陀螺仪、加速度计、地磁场传感器、GPS 模块,采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法,能够快速求解出模块当前的实时运动姿态。
 采用先进的数字滤波技术,能有效降低测量噪声,提高测量精度。传感器内部集成了姿态解算器,配合动态卡尔曼滤波算法,能够在动态环境下准确输出模块的当前姿态,姿态测量精度静态 0.05 度,动态 0.1 度,稳定性极高,性能甚至优于某些专业的倾角仪!
内部自带电压稳定电路,工作电压 3.3v~5v,引脚电平兼容 3.3V/5V 的嵌入式系
统,连接方便。支持串口 TTL/232,方便用户选择最佳的连接方式。串口速率 2400bps~921600bps
可调。GPS 信息、姿态传感器信息同步输出。最高 200Hz 数据输出速率。输入内容可以任意选择,输出速率 0.1~200HZ 可调节。
资料下载:https://pan.baidu.com/s/1kUxka08OW2x1Ej-7jvEgWw
验证码:0eug
官网:http://wit-motion.cn/guandaodaohang/26.html

驱动程序

在ROS中的驱动是以驱动文件的形式存在的,需要我们自己编写驱动程序。在这里我们参考https://blog.csdn.net/qqliuzhitong/article/details/114384297文章编写自己的驱动程序。

IMU串口通信协议

IMU使用的是JY901芯片,在官方说明文档里可以找到串口通信协议
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序

关于自定义话题及ros话题发布接受机制请参考:https://blog.csdn.net/qq_43569735/article/details/108065179
串口程序+话题发布

//Created by ljm
#include <ros/ros.h>
#include <serial/serial.h>
#include <iostream>
#include "agv_imu/imu_data.h"
int main(int argc, char** argv)
{
    ros::init(argc, argv, "agv_imu");
    ros::NodeHandle n;
    //创建imu数据话题发布
    ros::Publisher pub_imu_data;
    pub_imu_data = n.advertise<agv_imu::imu_data>("AGV/imu",50);

    //创建一个serial对象
    serial::Serial sp;
    //创建timeout
    serial::Timeout to = serial::Timeout::simpleTimeout(100);
    //设置要打开的串口名称
    sp.setPort("/dev/ttyUSB0");
    //设置串口通信的波特率
    sp.setBaudrate(9600);
    //串口设置timeout
    sp.setTimeout(to);

    double ax,ay,az;
    double wx,wy,wz;
    double angle_roll,angle_pitch,angle_yaw;
    
    agv_imu::imu_data msg;
    
    try
    {
        //打开串口
        sp.open();
    }
    catch(serial::IOException& e)
    {
        ROS_ERROR_STREAM("Unable to open port.");
        return -1;
    }

    //判断串口是否打开成功
    if(sp.isOpen())
    {
        ROS_INFO_STREAM("/dev/ttyUSB0 is opened.");
    }
    else
    {
        return -1;
    }

    ros::Rate loop_rate(100);
    while(ros::ok())
    {
        //获取缓冲区内的字节数
        size_t n = sp.available();
        if(n!=0)
        {
            uint8_t buffer[1024];
            //读出数据
            n = sp.read(buffer, n);

            for(int i=0; i<n; i++)
            {
                if(buffer[i]==0X55)            //IMU地址
                {
                        if(buffer[i+1]==0x51) //加速度帧
                        {
                            signed short int temp;
                            temp=buffer[i+3];
                            temp=temp<<8;
                            temp=(temp|buffer[i+2]);
                            ax=(temp/32768.0)*16*9.8051;
                            temp=buffer[i+5];         //加速度八位
                            temp=temp<<8;
                            temp=(temp|buffer[i+4]);  //加速度高八位
                            ay=(temp/32768.0)*16*9.8051;
                            temp=buffer[i+7];         //加速度低八位
                            temp=temp<<8;
                            temp=(temp|buffer[i+6]);  //加速度高八位
                            az=(temp/32768.0)*16*9.8051;
                            std::cout<<"ax:"<<ax<<std::endl;
                            std::cout<<"ay:"<<ay<<std::endl;
                            std::cout<<"az:"<<az<<std::endl;
                            i+=11;
                        }
                        if(buffer[i+1]==0x52) //角速度帧
                        {
                            signed short int temp;
                            temp=buffer[i+3];
                            temp=temp<<8;
                            temp=(temp|buffer[i+2]);
                            wx=(temp/32768.0)*2000;
                            temp=buffer[i+5];         //角速度低八位
                            temp=temp<<8;
                            temp=(temp|buffer[i+4]);  //角速度高八位
                            wy=(temp/32768.0)*2000;
                            temp=buffer[i+7];         //角速度低八位
                            temp=temp<<8;
                            temp=(temp|buffer[i+6]);  //角速度高八位
                            wz=(temp/32768.0)*2000;
                            std::cout<<"wx:"<<wx<<std::endl;
                            std::cout<<"wy:"<<wy<<std::endl;
                            std::cout<<"wz:"<<wz<<std::endl;
                            i+=11;
                        }
                     if(buffer[i+1]==0x53) //角度帧
                    {
                        unsigned short int temp;
                        temp=buffer[i+3];         //角度低八位
                        temp=temp<<8;
                        temp=(temp|buffer[i+2]);  //角度高八位
                        angle_roll=(temp/32768.0)*180;
                        temp=buffer[i+5];         //角度低八位
                        temp=temp<<8;
                        temp=(temp|buffer[i+4]);  //角度高八位
                        angle_pitch=(temp/32768.0)*180;
                        temp=buffer[i+7];         //角度低八位
                        temp=temp<<8;
                        temp=(temp|buffer[i+6]);  //角度高八位
                        angle_yaw=(temp/32768.0)*180;
                        std::cout<<"angle_roll:"<<angle_roll<<std::endl;
                        std::cout<<"angle_pitch:"<<angle_pitch<<std::endl;
                        std::cout<<"angle_yaw:"<<angle_yaw<<std::endl;
                        i+=11;
                    }
                     msg.angx=angle_roll;
                     msg.angy=angle_pitch;
                     msg.angz=angle_yaw;
                     msg.ax=ax;
                     msg.ay=ay;
                     msg.az=az;
                     msg.wx=wx;
                     msg.wy=wy;
                     msg.wz=wz;
                     pub_imu_data.publish(msg);
                }
            }
            std::cout << std::endl;
            //sp.write(buffer, n);
        }
        loop_rate.sleep();
    }

    //关闭串口
    sp.close();

    return 0;
}

自定义消息话题:imu_data.msg

float64 ax
float64 ay
float64 az
float64 wx
float64 wy
float64 wz
float64 angx
float64 angy
float64 angz

效果

在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可能感兴趣的项目设计: 6轴加速度计 姿态角度测量 卡尔曼滤波(上位机+测试程序+手机客户端等)(链接:https://www.cirmall.com/circuit/2874/detail?3) 10轴姿态角度测量JY-901模块功能概述: 模块集成高精度的陀螺仪、加速度计、地磁场传感器,采用高性能的微处理器和先进的动力学解算 与卡尔曼动态滤波算法,能够快速求解出模块当前的实时运动姿态。 采用先进的数字滤波技术,能有效降低测量噪声,提高测量精度。 模块内部集成了姿态解算器,配合动态卡尔曼滤波算法,能够在动态环境下准确输出模块的当前姿态,姿态测量精度0.01度,稳定性极高,性能甚至优于某些专业的倾角仪! 模块内部自带电压稳定电路,工作电压3v~6v,引脚电平兼容3.3V/5V的嵌入式系统,连接方便。 支持串口和IIC两种数字接口。方便用户选择最佳的连接方式。串口速率2400bps~921600bps可调,IIC接口支持全速400K速率。 最高200Hz数据输出速率。输入内容可以任意选择,输出速率可调节。 保留4路扩展端口,可以分别配置为模拟输入,数字输入,数字输出,PWM输出等功能。 具备GPS连接能力。可接受符合NMEA-0183标准的串口GPS数据,形成GPS-IMU组合导航单元。 10轴姿态角度测量JY-901模块参数: 1、电压:3V~6V 2、电流:<40mA 3、体积:15.24mm X 15.24mm X 2mm 4、焊盘间距:上下100mil(2.54mm),左右600mil(15.24mm) 5、测量维度:加速度:3维,角速度:3维,磁场:3维,角度:3维,气压:1维,GPS:3维 6、量程:加速度:±16g,角速度:±2000°/s,角度±180°。 7、分辨率:加速度:6.1e-5g,角速度:7.6e-3°/s。 8、稳定性:加速度:0.01g,角速度0.05°/s。 9、姿态测量稳定度:0.01°。 10、数据输出内容:时间、加速度、角速度、角度、磁场、端口状态、气压(JY-91B)、高度(JY-91B)、经纬度(需连接GPS)、地速(需连接GPS)。 10、数据输出频率0.1Hz~200Hz。 11、数据接口:串口(TTL电平,波特率支持2400、4800、9600、19200、38400、57600、115200、230400、460800、921600),I2C(最大支持高速IIC速率400K) 12、扩展口功能:模拟输入(0~VCC)、数字输入、数字输出、PWM输出(周期1us-65535us,分辨率1us) 如截图所示: 附件内容截图: 实物购买链接:https://detail.tmall.com/item.htm?spm=a220o.1000855.1998025129.1.TiJB3m&id=536057209592&pvid=3aa0eb9b-9cda-46bb-a76d-0279ccc1a1ef&abbucket=_AB-M32_B19&acm=03054.1003.1.1285741&abtest=_AB-LR32-PR32&scm=1007.12559.61743.100200300000000&pos=1
ROS使用ORB-SLAM进行定位和建图,需要将相机的图像数据发布ROS,然后订阅这些图像数据,将其传递给ORB-SLAM进行处理。 首先,你需要使用ROS的相机驱动程序来获取相机的图像数据,并将其发布ROS。你可以使用任何ROS支持的相机驱动程序,例如USB相机驱动程序或者网络相机驱动程序。在获取到相机图像数据后,你需要将它们以图像话题的形式发布ROS,例如使用`sensor_msgs/Image`消息类型来发布图像数据。 然后,你需要在ORB-SLAM节点订阅这些图像话题,并使用ORB-SLAM进行处理。在ORB-SLAM节点,你需要订阅相机的图像话题,例如使用`ros::Subscriber`来订阅`sensor_msgs/Image`消息类型的话题。然后,你需要将这些图像数据传递给ORB-SLAM进行处理。ORB-SLAM会使用这些图像数据进行定位和建图。 在ORB-SLAM节点,你还需要发布ORB-SLAM的位姿信息和地图数据,以便其他节点订阅并使用。你可以使用`ros::Publisher`来发布ORB-SLAM的位姿信息和地图数据,例如使用`geometry_msgs/PoseStamped`消息类型来发布ORB-SLAM的位姿信息,使用`nav_msgs/OccupancyGrid`消息类型来发布ORB-SLAM的地图数据。 总之,使用ORB-SLAM进行定位和建图需要以下几个步骤: 1. 使用ROS相机驱动程序获取相机图像数据,并以图像话题的形式发布ROS。 2. 在ORB-SLAM节点订阅相机图像话题,并使用ORB-SLAM进行处理。 3. 在ORB-SLAM节点发布ORB-SLAM的位姿信息和地图数据,以便其他节点订阅并使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值