利用IMU数据来计算位移

2023-05-16

目标:

利用IMU测得的加速度信息来计算位移,很简单假设是匀加速运动或是匀速运动都可以,主要是看问题的背景来具体去确定运动模型,这里我就取个简单的匀加速运动模型。

X= v_{0} \cdot t+ \frac{1}{2} \cdot a \cdot t^{2}


学习过程:

1、了解IMU的相关原理知识

2、阅读产品自带的SDK包

3、自己添加并修改相关代码


学习内容:

这里主要介绍我是如何添改的代码。因为想要直接获取位移需要时间和加速度,这里的出速度我设为0,其加速度的获取可以阅读产品自带的功能包中的源码,我在编写过程中主要是在时间的获取上出现了一点问题,需要获得IMU开启时的时间戳以及当前帧的时间戳。

在运行产品自带的源码时,可以看见每一帧都对应着一个 seq 和 stamp ,所以只要把 seq 为1的那一帧对应的时间戳提取出来作为起始时间即可,如图所示,同样的方法去提取当前帧的时间戳。


学习产出:

#include <ahrs_driver.h>
#include <Eigen/Eigen>
using namespace std;
void my_handle_imu_data(const sensor_msgs::Imu::ConstPtr& imu_data)
{
    cout<<"accelaration X is :"<<imu_data->linear_acceleration.x<<endl;
    cout<<"accelaration Y is :"<<imu_data->linear_acceleration.y<<endl;

    static int start_time;
    int now_time;
    if(imu_data->header.seq == 50)
    {
        start_time = int(imu_data->header.stamp.toSec());
        cout<<"when the seq is "<<imu_data->header.seq<<" "<<" the stamp is "<<start_time<<endl;
    }

    cout<<"the start time is :"<<start_time<<endl;
    now_time = int(imu_data->header.stamp.toSec());
    if(start_time == now_time)
    {
        cout<<"the shift on X is :"<< 0 <<endl;
        cout<<"the shift on Y is :"<< 0 <<endl;
    }
    else if(now_time > start_time)
    {
        double X_Shift,Y_Shift;
        int Dealt_Time;
        Dealt_Time = now_time - start_time;
        X_Shift = 0.5 * imu_data->linear_acceleration.x * Dealt_Time * Dealt_Time;
        Y_Shift = 0.5 * imu_data->linear_acceleration.y * Dealt_Time * Dealt_Time;
        cout<<"the shift on X is :"<<X_Shift<<endl;
        cout<<"the shift on Y is :"<<Y_Shift<<endl;
        cout<<"now time is :"<<now_time<<endl;
        cout<<"start_time is :"<<start_time<<endl;
        cout<<imu_data->header.seq<<endl;
        //cout<<imu_data->header.stamp<<endl;
        cout<<"*********************************************"<<endl;
    }
}

int main(int argc, char *argv[])
{
    ros::init(argc,argv,"cal_shift");
    ros::NodeHandle nh;
    ros::Subscriber sub_imu_data_ = nh.subscribe<sensor_msgs::Imu>("/mobile_base/sensors/imu_data",10,my_handle_imu_data);
    ros::spin();
    return 0;
}

代码很短,原理也很简单,主要是需要注意一下 start_time 变量前的 static 关键字,它可以保证该变量在程序结束时,再释放变量。同学可以试一下删除 static 之后变量的值是什么。

然后就是ros相关的知识,想要学习的话可以在这里学习:保姆级教程

【奥特学园】ROS机器人入门课程《ROS理论与实践》零基础教程_哔哩哔哩_bilibili

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用IMU数据来计算位移 的相关文章

  • 鱼眼+红外+IMU+VSLAM+SLAM

    一 目的 1 想知道 xff1a 二 参考 1 一分钟详解鱼眼镜头标定基本原理及实现 https mp weixin qq com s VyxoTaYtYPB Bfh3JCXl1A 三 注意 四 操作
  • VIO标定工具kalibr和imu_utils的使用

    0 参考资料 Kalibr进行IMU 43 相机的标定 xff1a 这个步骤写的非常好 xff0c 应该是目前看到的最符合的步骤了 使用ROS功能包标定相机内参 Kalibr标定camera IMU详细步骤 xff1a 这篇博客里给出了它的
  • STM32—驱动GY85-IMU模块

    GY85是一个惯性测量模块 xff0c 内部集成了三轴加速度计 三轴陀螺仪 电子罗盘 气压传感器等芯片 xff0c 用于测量和报告设备速度 方向 重力 xff0c 模块可以将加速度计 陀螺仪 电子罗盘等传感器的数据进行综合 xff0c 在上
  • IMU的轨迹解算和航迹显示

    基于ros操作系统 xff0c 调用IMU数据包 xff0c 利用数据解算小车运动的轨迹 xff0c 并在rviz中实现轨迹的可视化 其中IMU四元数对于位移速度和加速度的转换 轨迹解算和换机显示的代码 xff1a IMU航迹推算 incl
  • Mavros读取PixHawk硬件的IMU数据

    Ubuntu18 04 读取PixHawk硬件的IMU数据 实现方式 使用mavros话题读取到Pixhawk飞控的IMU数据 实现步骤 安装ros 检查是否安装cmake xff08 未安装根据提示安装 xff09 cmake span
  • 在PX4下更换pixhawk的IMU

    写在前面 出于一些原因 xff0c 这篇文章不给出具体的源码 xff0c 因此博主试着将这篇写成了一篇科普性质的文章 xff0c 如果你认真读的话 xff0c 应该会有收获的 为什么要更换pixhawk的传感器 xff1f 大多数的玩家拿到
  • ROS2中IMU话题的发布及可视化

    环境 xff1a Ubuntu 20 04 xff0c ROS2 Foxy 传感器 xff1a 维特智能BWT901CL 代码是从维特智能的示例代码修改的 xff0c 实现基本的加速度 角速度和角度读取 xff0c 发布IMU消息 这个传感
  • 多IMU车载GNSS/INS数据集及介绍

    文章目录 前言非常棒的GINS数据集采集轨迹采集时间MEMS IMU详细信息IMU测量值方程及相关误差建模参考噪声参数 安装参数文件格式描述 前言 本文作者感谢武汉大学多源智能导航实验室和牛小骥教授提供了本文所需的GNSS INS数据集 本
  • loam中imu消除重力加速度的数学推导

    最近在看loam的源码发现里面有一段关于imu消除重力加速度的源码 xff0c 刚开始看不明白后来终于搞清楚了 xff0c 欢迎大家批评指正 要理解这个问题首先得明白欧拉角到旋转矩阵的变换 先上图 此图描述的是先绕X xff0c 再绕Y x
  • Xsens Mti-g-710 IMU driver在Ubuntu18.04 ROS melodic中的安装使用

    Ubuntu18 04下安装的ROS melodic 如何使用Xsens Mti g 710 IMU driver xff1f 这里给出一个详细步骤说明 这里的IMU是USB接口 1安装 首先插入IMU的USB口 命令行运行 gt lsus
  • TI CC265x的IIC通讯读取IMU BMI08x数据

    SmartLink CC265x是TI公司出的无线MCU平台器件 最近玩了个小项目用TI的CC265x平板IIC接口通讯 xff0c 获取博世BMI08x陀螺仪 加速度计传感器的数据 本篇博客亦是对博客 树莓派IIC通讯获取BMI08x I
  • 最小的IMU模组——DETA10系列

    性能全面升级 飞迪航空 xff08 FDISYSTEMS xff09 DETA10系列产品目前出货已达十万量级 xff0c 广泛应用于机器人 可穿戴设备 人工智能教育套件 自动驾驶小车 智慧农业 扫地机器人 稳定平台 无人系统等相关领域 D
  • 利用 imu_utils 标定 imu

    目录 前言 一 安装 imu utils 二 编译出现的错误 三 操作步骤 四 结果 前言 记录利用 imu utils 标定 imu xff0c 最近在使用imu做导航 xff0c 要对imu进行标定 xff0c 使用标定得到的加速度的噪
  • IMU 测量模型和运动学模型

    一 概念 高斯白噪声 测量噪声是AD转换器件引起的外部噪声 xff0c 波动激烈的测量白噪声 随机游走 这里指零偏Bias 随机游走噪声 xff0c 是传感器内部机械 温度等各种物理因素产生的传感器内部误差的综合参数 xff0c 是变化缓慢
  • vins-fusion代码解读[五] imu在vins里的理解

    SLAM新手 xff0c 欢迎讨论 IMU作用 vins中 xff0c IMU只读取IMU六轴的信息 xff0c 3轴线加速度 xff08 加速度计 xff09 和3轴角速度 xff08 陀螺仪 xff09 通过对陀螺仪的一次积分 xff0
  • 一文了解IMU原理、误差模型、标定、惯性传感器选型以及IMU产品调研(含IMU、AHRS、VRU和INS区别)

    在此记录一下测试IMU过程中的其它文章 xff0c 便于以后查看 xff1a IMU的误差标定以及姿态解算ROS下通过USB端口读取摄像头数据 包括笔记本自带摄像头 激光 摄像头 IMU等传感器数据同步方法 message filters
  • IMU背包对动物行为影响测试

    动物行为是一种可观察和可测量的指标 轻量化和低成本的传感器技术的先进发展为研究人员提供了以最小干预来跨越空间和时间跟踪动物的机会 特别是对于家禽业来说 已经从传统的笼养系统转变为无笼养系统 许多技术可用于检测大群鸡的行为 活动和位置 为了有
  • IMU的ROS调试开发工具包:imu_tools

    目录 imu tool包 问题 参数配置便利性问题 实例 调试microstrain 3dm gx5 25 imu 问题 发布的imu姿态与实际imu姿态不一致问题 imu tool包 http wiki ros org imu tools
  • 四元素与旋转矩阵

    如何描述三维空间中刚体的旋转 是个有趣的问题 具体地说 就是刚体上的任意一个点P x y z 围绕过原点的轴 i j k 旋转 求旋转后的点P x y z 旋转矩阵 旋转矩阵乘以点P的齐次坐标 得到旋转后的点P 因此旋转矩阵可以描述旋转 x
  • IMU速度估计

    你知道我在哪里可以找到根据 IMU acc 陀螺仪 磁力计 数据进行速度估计的代码或示例吗 我根据 IMU 静止的数据计算了偏差 我想用某种滤波器 卡尔曼 互补 来实现速度估计 但我找不到任何滤波器 我还有相机速度估计 也许它可以作为某种融

随机推荐

  • Could not retrieve

    输入where nvm 找到nvm安装文件夹 在nvm文件夹下找到settings txt 添加以下代码 xff1a xff08 若没有则新建settings txt文件 xff09 node mirror npm taobao org m
  • Jetson Xavier gpio编程 (8)

    GPIO lines are attached to gpiochips Look in sys class gpio and you should see gpiochip240 248 and 288 I haven t yet det
  • curl 函数

    1 curl close 关闭一个cURL会话 语法 xff1a curl close span class hljs variable ch span span class hljs variable ch span 由 curl ini
  • CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):

    出现了这样的情况的话如 xff1a CMake Error at opt ros kinetic share catkin cmake catkinConfig cmake 83 find package Could not find a
  • Rails Digest认证实现和原理

    优势 Http Digest是一种Http 不仅限于Web页面 认证框架 xff0c 相比通常使用的基本认证 xff0c Digest认证的优点是相对安全 基于网络标准和简单 xff0c 它不需要编写登录表单页面 xff0c 对登录信息进行
  • 【目标检测】修改YOLO标注索引,批量修改txt文件指定内容

    假设需要将原索引 0 xff0c 1 xff0c 2 xff0c 3 都修改为 0 xff1a import os path 61 39 train 39 total txt 61 os listdir path deleteList 61
  • 《C语言中分配了动态内存后一定要释放吗?》

    问 xff1a 比如main函数里有一句 malloc 后面没有free 1 那么当main结束后 xff0c 动态分配的内存不会随之释放吗 xff1f 2 如果程序结束能自动释放 xff0c 那么还加上free xff08 xff09 x
  • 串口通讯的延时问题

    串口编程涉及很多问题 xff0c 对于实时采集系统 xff0c 串口编程必须服从系统定时器采集节拍 xff0c 这样通过事件方式接收串口然后延时就会带来很多问题 串口数据通常不是一次到来 xff0c 对于一个较为长的数据 xff0c 可能分
  • linux下从源代码编译安装软件的一般步骤

    1 下载并解压文件 如果下的压缩文件的后缀是 tar gz 解压用 tar xzvf xxx tar gz tar b2 解压用 tar xjvf xxx tar b2 tar 解压用 tar xvf xxx tar 2 配置安装路径 在
  • 单精度浮点数(float)与双精度浮点数(double)的区别

    单精度浮点数 xff08 float xff09 与双精度浮点数 xff08 double xff09 的区别如下 xff1a xff08 1 xff09 在内存中占有的字节数不同 单精度浮点数在机内占4个字节 双精度浮点数在机内占8个字节
  • /dev/ttyUSB0 permission denied 解决办法:永久有可操作权限

    一般使用USB口 无论USB转什么口 xff0c 串口之类的 xff0c 启动时容易出现 dev ttyUSB0 permission denied 因为一般情况下不是root用户 xff0c 对端口没有权限 xff0e 遇到这种情况 xf
  • 三种继承的方法:public 继承/private继承/protected继承详解及区别

    公有继承 public 私有继承 private 保护继承 protected 是常用的三种继承方式 1 公有继承 public 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时 xff0c 它们都保持原有的状态 xff0c 而基
  • [C/C++] const 详解(修饰变量、输入参数、返回值、成员函数)

    看到const关键字 xff0c 程序员首先想到的可能是const 常量 const 更大的魅力是它可以修饰函数的参数 返回值 xff0c 甚至函数的定义体 const 是constant 的缩写 xff0c 恒定不变 的意思 被const
  • 怎么理解矩阵的秩

    首先来想一个问题 xff0c 最初的那个人为什么为什么要叫他为 秩 xff0c 为什么不叫 猪 牛 马 xff1f 举个例子就很容易理解 xff0c 大家排队买票 如果大家互相不认识 xff0c 那就会一个排一个 xff0c 非常有秩序 然
  • javascript中的sort()方法

    现在在学习javascript中 xff0c 发现sort 函数是有点奇怪的东西 xff08 可能是本人水平的问题 xff01 xff09 xff0c 于是就在这里记录一下自己找到的东西吧 sort 这个方法的参数很奇怪 xff0c 必须是
  • 【ROS读书笔记】--- 7.参数(parameters)

    时间见证一切 xff01 一 简述二 通过命令行操作参数 查看参数列表 查询参数 设置参数 删除参数 创建和加载参数文件 三 在C 43 43 代码中操作参数 设置参数 读取参数 四 在启动文件中操作参数 设置参数 设置私有参数 从yaml
  • 高位字节与低位字节简单介绍

    一般一个16位 xff08 双字节 xff09 的数据 xff0c 比如 FF1A xff08 16进制 xff09 那么高位字节就是FF xff0c 低位是1A 如果是32位的数据 xff0c 比如 3F68415B 高位字 xff08
  • STL常用容器详细解析

    STL容器的实现原理 STL共有六大组件 1 容器 2 算法 3 迭代器 4 仿函数 6 适配器 STL容器的实现原理 STL来管理数据十分方便 省去了我们自己构建数据结构的时间 其实 STL的实现也是基于我们常见的数据结构 序列式容器 x
  • 相机内参的标定

    最近刚刚开始学习相机的标定 xff0c 也是在师兄的帮助下完成的 过程还是值得记录的 xff0c 于是决定写在自己的第一篇CSDN上 xff0c 便于之后的复习 xff0c 同时也希望能够和大家进行交流 xff0c 相互学习 xff0c 相
  • 利用IMU数据来计算位移

    目标 xff1a 利用IMU测得的加速度信息来计算位移 xff0c 很简单假设是匀加速运动或是匀速运动都可以 xff0c 主要是看问题的背景来具体去确定运动模型 xff0c 这里我就取个简单的匀加速运动模型 学习过程 xff1a 1 了解I