目录

  • 1 理解好IMU的输出数据
  • 2 AirSim中如何生成IMU数据
  • 3 AirSim中如何读取IMU数据
  • 4. IMU的数据 in AirSim and ROS IMU Message

1 理解好IMU的输出数据

IMU输出的数据中的线速度和线加速度,是在世界坐标系下,即NED北-东-下坐标系。

  1. IMU加速度计测量加速度不包含重力加速度
  2. 如果IMU自由落体运动,不考虑噪声加速度计的读数是0。
  3. 如果IMU静止在地面上,IMU读数是-9.8m/s2
  4. 如果IMU悬浮在空间,IMU读数是-9.8m/s2
    关于IMU加速度读数不包含重力加速度的理解:issues#4303; 以及IMU原理;和IMU传感器。
    来自引用文献{issues#4303]的解释:可以这样认为,IMU的内部运行可以理解为一个盒子,里面有一个质量悬浮在两个弹簧之间,质量的位置对应了IMU的输出。当这个盒子(IMU)坐在一张桌子上,作用力会推/拉在其内部的质量弹簧 :因为质量会引起重力加速度,但是盒子是静止的,这是由于盒子受到桌面的法向/接触力。这就像质量将推/拉弹簧向下(+z方向),而同时由于存在一个向上的作用力引起的加速度 (因为惯性),整个盒子加速度为0,但是IMU读起来都是向上(-Z方向)的。
    对于自由落下的盒子,质量将受到重力朝向中心位置,这里没有推/拉弹簧:现在质量和盒子都被重力同样加速,一个与另一个在受力上没有不同),IMU最终读到的是0加速度,反映它如何不再受地面法向力/接触力的影响。本质上,因为IMU的读数取决于盒子和里面的质量之间的力的差异,所以重力只能根据作用在盒子上的法向/接触力来测量(方向相反,大小相同)。

2 AirSim中如何生成IMU数据

AirSim中,IMU的读数输出对应两个坐标系:

  1. 机体坐标系: 采用FLU坐标系,主要是角速度和角加速度;
  2. 世界坐标系:采用NED坐标系,主要是其他的读数,包括线速度和加速度。

AirSim通过程序来生成IMU数据,原理是获取vehicle状态和环境重力状态来计算,代码为:IMU数据生成程序。


void updateOutput()
{Output output; //IMU生成的数据// 第一步:获得vehicle的真值数据const GroundTruth& ground_truth = getGroundTruth(); //得到无人机真值,包括*.kinematics动力学数据// 第二步:获得角速度output.angular_velocity = ground_truth.kinematics->twist.angular;//将无人机的角速度赋值给output.angular_velocity,FLU坐标系下// 第三步:获得加速度
output.linear_acceleration = ground_truth.kinematics->accelerations.linear - ground_truth.environment->getState().gravity;//生成IMU加速度数据(世界坐标系NED),IMU加速度不含重力加速度// 第四步:获得位姿
output.orientation = ground_truth.kinematics->pose.orientation;// 得到无人机在世界系下的姿态// 第五步:坐标转换??
//acceleration is in world frame so transform to body frame
output.linear_acceleration = VectorMath::transformToBodyFrame(output.linear_acceleration,
ground_truth.kinematics->pose.orientation, true);// 将加速度转换为体坐标系下,这里使用表明Rwb后直接作为IMU数据,而没有Rbi,表明imu系与body系为同一系// 第六步:add noiseaddNoise(output.linear_acceleration, output.angular_velocity);// TODO: Add noise in orientation?// 第七步:增加时间戳output.time_stamp = clock()->nowNanos(); // 真实cpu时间??setOutput(output);

关于坐标变换函数的代码,在AirSim/AirLib/include/common/VectorMath.hpp中展示的代码如下:

 static Vector3T transformToBodyFrame(const Vector3T& v_world, const QuaternionT& q_world, bool assume_unit_quat = true){return rotateVectorReverse(v_world, q_world, assume_unit_quat);}static Vector3T transformToBodyFrame(const Vector3T& v_world, const Pose& body_world, bool assume_unit_quat = true){//translateVector3T translated = v_world - body_world.position;//rotatereturn transformToBodyFrame(translated, body_world.orientation, assume_unit_quat);}static Pose transformToBodyFrame(const Pose& pose_world, const Pose& body_world, bool assume_unit_quat = true){//translateVector3T translated = pose_world.position - body_world.position;//rotate vectorVector3T v_body = transformToBodyFrame(translated, body_world.orientation, assume_unit_quat);//rotate orientationQuaternionT q_body = rotateQuaternionReverse(pose_world.orientation, body_world.orientation, assume_unit_quat);return Pose(v_body, q_body);}

3 AirSim中如何读取IMU数据

源自: Sensor APIs: IMU

可以跳转到hello_drone.py或hello_drone.cpp参考demo代码。
或者查看下面的完整API函数:
读取IMU数据函数原型:

msr::airlib::ImuBase::Output getImuData(const std::string& imu_name = "", const std::string& vehicle_name = "");

读取IMU数据的函数:

        // IMU API: AirSim/AirLib/include/api/VehicleApiBase.hppvirtual const ImuBase::Output& getImuData(const std::string& imu_name) const{auto* imu = static_cast<const ImuBase*>(findSensorByName(imu_name, SensorBase::SensorType::Imu));if (imu == nullptr)throw VehicleControllerException(Utils::stringf("No IMU with name %s exist on vehicle", imu_name.c_str()));return imu->getOutput();}

读取IMU数据调用:

imu_data = client.getImuData(imu_name = "", vehicle_name = "")

相关数据源码:Output

//源码:AirSim/AirLib/include/sensors/imu/ImuBase.hpp
class ImuBase : public SensorBase{...public: //typesstruct Output{ //structure is same as ROS IMU message  与ROS IMU message一致EIGEN_MAKE_ALIGNED_OPERATOR_NEWTTimePoint time_stamp;Quaternionr orientation;Vector3r angular_velocity;Vector3r linear_acceleration;};...

4. IMU的数据 in AirSim and ROS IMU Message

ROS IMU中关于IMU的信息:点击我。

其中,Quaternion四元数的解释:点击我

AirSim (六) ---理解篇: Airsim中的IMU数据信息相关推荐

  1. 怎样在微信中清理数据存储空间?经验技巧!如何在微信中清除缓存数据信息?

    现在微信已经成为我们大家生活中的一款主流聊天软件了,在生活中我们都会使用微信来与朋友家人之间进行聊天互动,在工作中使用微信发布信息与客户同事之间进行交流沟通,在我们大家使用微信的同时,会产生许多的缓存 ...

  2. python将音频转换成声谱图_理解语音识别系统中的语音数据,傅里叶转换,FFT和声谱特征...

    本篇文章介绍如何使用python进行声音数据分析(语音分析). 总述 每天都会产生大量的语音数据.如果他们能够很容易的被数据科学家所获得来开发AI引擎和进行AI分析,也许会产生不一样的洞见.那些早已意 ...

  3. 深入理解 WordPress 数据库中的用户数据 wp_user

    WordPress 使用 wp_users 数据表存储用户的主要数据,该数据表结构类似于wp_posts 和 wp_comments 数据表,存储的是需要经常访问的用户数据,该数据表的结构以及该数据表 ...

  4. 第六十七篇:opencv中KeyPoint与point2f之间相互转换

    作者:liaojiacai 邮箱: ljc_v2x_adas@foxmail.com opencv中对角点检测时需要将vector<KeyPoint>与vector<point2f& ...

  5. 一点就分享系列(理解篇3)—Cv任务“新世代”之Transformer(下篇)提前“cv领域展开”——快速学习“视觉transformer的理解”+“一些吐槽”

    一点就分享系列(理解篇3)Cv任务"新世代"之Transformer(下篇)--"cv领域展开" 提示:本篇内容为下篇,如感兴趣可翻阅上和中篇! 理解篇3 上 ...

  6. OpenSense -运动学与IMU数据

    [以下教程示例适用于opensim4.1] OpenSense - Kinematics with IMU Data OpenSense是用于使用惯性测量单位inertial measurement ...

  7. python从文件中读取数据_Python3 中把txt数据文件读入到矩阵中的方法

    下面为大家分享一篇Python3 中把txt数据文件读入到矩阵中的方法,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 1.实例程序: ''' 数据文件:2.txt内容:(以空格分开每个数据) ...

  8. ROS:bag数据包内容提取——雷达点云数据和imu数据

    通常在利用ros采集传感器数据时,我们会得到一个包含多个传感器数据的bag数据包,下面将会介绍从bag数据包提取雷达点云数据和imu数据的方法. 系统版本:Ubuntu20.04 ROS版本:Noet ...

  9. 深入理解JVM底层原理——运行时数据区

    运行时数据区概述和线程 1.运行时数据区概述 !     内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请 ...

最新文章

  1. 人工脑连接体:类脑人工智能的奇点时刻来临
  2. 生产者、消费者模式实现
  3. 白话Elasticsearch69-ES生产集群部署重要的 Elasticsearch参数设置
  4. (私人收藏)[开发必备]HTML5最全快速查找离线手册(可查询可学习,带实例)...
  5. Android之mvp和mvc对比分析以及实际应用
  6. oracle中packages使用,oracle中packages的使用
  7. 软件定义汽车带来的困境——如何破局?
  8. 每晚有1700万人逛淘宝但什么都不买,马云:我们仍可以靠他们赚钱
  9. Python sys模块参考手册
  10. 深入理解VMware虚拟网络
  11. redis 主从原理
  12. 如何把静态成员导出_dll导入导出及local vftable问题
  13. Json对象与Json字符串互转(四种转换方式)
  14. java 唯一随机数_JAVA随机数
  15. SREng 使用指南(二)启动项目详细解说
  16. 在Chrome浏览器中点击链接,打开IE浏览器,跳转到指定页面并传递参数
  17. vscode terminal下划线显示问题
  18. unity, AnimatorCullingMode踩坑
  19. 使用word进行图片的有序命名
  20. item_search_img - 按图搜索淘宝商品(拍立淘)

热门文章

  1. 怎样升级华为鸿蒙系统,怎么升级到鸿蒙2.0系统呀
  2. Vscode连接远程服务器(一套配置成功)
  3. Linux命令行shell插件
  4. 【QQ红包】手机发抢不到的口令红包
  5. librosa无法解析mp3格式音频的解决方法
  6. 关于软件测试的理解和反思 - 测试工作的三个阶段
  7. 如何看待好多人盼着锤子科技倒闭?
  8. DataScienceML:金融科技领域之迁徙率(Flow Rate)表的简介、案例应用之详细攻略
  9. c语言中位运算之布尔运算
  10. IOS应用内跳转到系统设置