读取csv文件中的IMU数据并以sensor_msgs/Imu格式发送 20210724

项目需要将所给的csv表格中IMU数据读取并转化为sensor_msgs/Imu格式,以便于后续使用数据跑定位算法。

csv表格:

读取csv文件

code:
ifstream inFile("(csv文件绝对路径)", ios::in);    //
vector<string> stamp,Yaw,Pitch,Roll,Ve,Vn,Vu;if (!inFile)
{cout << "打开CSV文件失败!" << endl;exit(1);
}
string line;
while (getline(inFile, line)){string field;istringstream sin(line);getline(sin, field, ',');stamp.push_back(field.c_str()); getline(sin, field, ',');Yaw.push_back(field.c_str()); getline(sin, field, ',');Pitch.push_back(field.c_str()); getline(sin, field, ',');Roll.push_back(field.c_str()); getline(sin, field, ',');Ve.push_back(field.c_str()); getline(sin, field, ',');Vn.push_back(field.c_str()); getline(sin, field); Vu.push_back(field.c_str());
}

IMU数据转换

由于csv中所给的数据并不是标准IMU格式,而是通过解算得到的处理过后的数据,所以需要通过逆变换反推出IMU的标准数据,得到gyro,accel,四元数等数据。

四元数
公式

qB=[cos⁡(ψ/2)00sin⁡(ψ/2)][cos⁡(θ/2)0sin⁡(θ/2)0][cos⁡(ϕ/2)sin⁡(ϕ/2)00]=[cos⁡(ϕ/2)cos⁡(θ/2)cos⁡(ψ/2)+sin⁡(ϕ/2)sin⁡(θ/2)sin⁡(ψ/2)sin⁡(ϕ/2)cos⁡(θ/2)cos⁡(ψ/2)−cos⁡(ϕ/2)sin⁡(θ/2)sin⁡(ψ/2)cos⁡(ϕ/2)sin⁡(θ/2)cos⁡(ψ/2)+sin⁡(ϕ/2)cos⁡(θ/2)sin⁡(ψ/2)cos⁡(ϕ/2)cos⁡(θ/2)sin⁡(ψ/2)−sin⁡(ϕ/2)sin⁡(θ/2)cos⁡(ψ/2)]\begin{aligned} \mathbf{q}_{\mathrm{B}} &=\left[\begin{array}{c} \cos (\psi / 2) \\ 0 \\ 0 \\ \sin (\psi / 2) \end{array}\right]\left[\begin{array}{c} \cos (\theta / 2) \\ 0 \\ \sin (\theta / 2) \\ 0 \end{array}\right]\left[\begin{array}{c} \cos (\phi / 2) \\ \sin (\phi / 2) \\ 0 \\ 0 \end{array}\right] \\ &=\left[\begin{array}{l} \cos (\phi / 2) \cos (\theta / 2) \cos (\psi / 2)+\sin (\phi / 2) \sin (\theta / 2) \sin (\psi / 2) \\ \sin (\phi / 2) \cos (\theta / 2) \cos (\psi / 2)-\cos (\phi / 2) \sin (\theta / 2) \sin (\psi / 2) \\ \cos (\phi / 2) \sin (\theta / 2) \cos (\psi / 2)+\sin (\phi / 2) \cos (\theta / 2) \sin (\psi / 2) \\ \cos (\phi / 2) \cos (\theta / 2) \sin (\psi / 2)-\sin (\phi / 2) \sin (\theta / 2) \cos (\psi / 2) \end{array}\right] \end{aligned} qB​​=⎣⎢⎢⎡​cos(ψ/2)00sin(ψ/2)​⎦⎥⎥⎤​⎣⎢⎢⎡​cos(θ/2)0sin(θ/2)0​⎦⎥⎥⎤​⎣⎢⎢⎡​cos(ϕ/2)sin(ϕ/2)00​⎦⎥⎥⎤​=⎣⎢⎢⎡​cos(ϕ/2)cos(θ/2)cos(ψ/2)+sin(ϕ/2)sin(θ/2)sin(ψ/2)sin(ϕ/2)cos(θ/2)cos(ψ/2)−cos(ϕ/2)sin(θ/2)sin(ψ/2)cos(ϕ/2)sin(θ/2)cos(ψ/2)+sin(ϕ/2)cos(θ/2)sin(ψ/2)cos(ϕ/2)cos(θ/2)sin(ψ/2)−sin(ϕ/2)sin(θ/2)cos(ψ/2)​⎦⎥⎥⎤​​

code:
q0 = sin(roll/360.0f*M_PI) * cos(pitch/360.0f*M_PI) * cos(yaw/360.0f*M_PI) - cos(roll/360.0f*M_PI) *            sin(pitch/360.0f*M_PI) * sin(yaw/360.0f*M_PI);
q1 = cos(roll/360.0f*M_PI) * sin(pitch/360.0f*M_PI) * cos(yaw/360.0f*M_PI) + sin(roll/360.0f*M_PI) *          cos(pitch/360.0f*M_PI) * sin(yaw/360.0f*M_PI);
q2 = cos(roll/360.0f*M_PI) * cos(pitch/360.0f*M_PI) * sin(yaw/360.0f*M_PI) - sin(roll/360.0f*M_PI) *           sin(pitch/360.0f*M_PI) * cos(yaw/360.0f*M_PI);
q3 = cos(roll/360.0f*M_PI) * cos(pitch/360.0f*M_PI) * cos(yaw/360.0f*M_PI) + sin(roll/360.0f*M_PI) *          sin(pitch/360.0f*M_PI) * sin(yaw/360.0f*M_PI);
GYRO
公式

[gxgygz]=Mx⋅My⋅[00dydt]+Mx⋅[0dpdt0]+[drdt00]\left[\begin{array}{l} g_{x} \\ g_{y} \\ g_{z} \end{array}\right]=\mathrm{M}_{x} \cdot \mathrm{M}_{y} \cdot\left[\begin{array}{c} 0 \\ 0 \\ \frac{d y}{d t} \end{array}\right]+\mathrm{M}_{x} \cdot\left[\begin{array}{c} 0 \\ \frac{d p}{d t} \\ 0 \end{array}\right]+\left[\begin{array}{c} \frac{d r}{d t} \\ 0 \\ 0 \end{array}\right] ⎣⎡​gx​gy​gz​​⎦⎤​=Mx​⋅My​⋅⎣⎡​00dtdy​​⎦⎤​+Mx​⋅⎣⎡​0dtdp​0​⎦⎤​+⎣⎡​dtdr​00​⎦⎤​

=[1000cos⁡rsin⁡r0−sin⁡rcos⁡r]⋅[cos⁡p0−sin⁡p010sin⁡p0cos⁡p]⋅[00dydt]+[1000cos⁡rsin⁡r0−sin⁡rcos⁡r]⋅[0dpdt0]+[drdt00]=\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos r & \sin r \\ 0 & -\sin r & \cos r \end{array}\right] \cdot\left[\begin{array}{ccc} \cos p & 0 & -\sin p \\ 0 & 1 & 0 \\ \sin p & 0 & \cos p \end{array}\right] \cdot\left[\begin{array}{c} 0 \\ 0 \\ \frac{d y}{d t} \end{array}\right]+\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos r & \sin r \\ 0 & -\sin r & \cos r \end{array}\right] \cdot\left[\begin{array}{c} 0 \\ \frac{d p}{d t} \\ 0 \end{array}\right]+\left[\begin{array}{c} \frac{d r}{d t} \\ 0 \\ 0 \end{array}\right] =⎣⎡​100​0cosr−sinr​0sinrcosr​⎦⎤​⋅⎣⎡​cosp0sinp​010​−sinp0cosp​⎦⎤​⋅⎣⎡​00dtdy​​⎦⎤​+⎣⎡​100​0cosr−sinr​0sinrcosr​⎦⎤​⋅⎣⎡​0dtdp​0​⎦⎤​+⎣⎡​dtdr​00​⎦⎤​

=[10−sin⁡p0cos⁡rcos⁡p⋅sin⁡r0−sin⁡rcos⁡p⋅cos⁡r]⋅[drdtdpdtdydt]=\left[\begin{array}{ccc} 1 & 0 & -\sin p \\ 0 & \cos r & \cos p \cdot \sin r \\ 0 & -\sin r & \cos p \cdot \cos r \end{array}\right] \cdot\left[\begin{array}{l} \frac{d r}{d t} \\ \frac{d p}{d t} \\ \frac{d y}{d t} \end{array}\right] =⎣⎡​100​0cosr−sinr​−sinpcosp⋅sinrcosp⋅cosr​⎦⎤​⋅⎣⎡​dtdr​dtdp​dtdy​​⎦⎤​

code
Eigen::Vector3f deltaAngle;
Eigen::Vector3f gyro;
Eigen::Matrix3f tfmatrix;
yaw   = atof(Yaw[i].c_str());
pitch = atof(Pitch[i].c_str());
roll  = atof(Roll[i].c_str());
tfmatrix<<1,0,-sin(pitch/180.0f*M_PI),0,cos(roll/180.0f*M_PI),cos(pitch/180.0f*M_PI)*sin(roll/180.0f*M_PI),0,-sin(roll/180.0f*M_PI),cos(pitch/180.0f*M_PI)*cos(roll/180.0f*M_PI);
deltaAngle<<(roll-last_roll)/0.01f,(pitch-last_pitch)/0.01f,(yaw-last_yaw)/0.01f;
gyro=tfmatrix*deltaAngle;
Accel
公式:

[axayaz]=Mx⋅My⋅Mz⋅[dvndveg+dvu/dt]\left[\begin{array}{l} a_{x} \\ a_{y} \\ a_{z} \end{array}\right]=\mathrm{M}_{x} \cdot \mathrm{M}_{y} \cdot \mathrm{M}_{z} \cdot\left[\begin{array}{l} d vn \\ d ve \\ g+dvu/dt \end{array}\right] ⎣⎡​ax​ay​az​​⎦⎤​=Mx​⋅My​⋅Mz​⋅⎣⎡​dvndveg+dvu/dt​⎦⎤​

=[1000cos⁡rsin⁡r0−sin⁡rcos⁡r]⋅[cos⁡p0−sin⁡p010sin⁡p0cos⁡p]⋅[cos⁡ysin⁡y0−sin⁡ycos⁡y0001]⋅[dvndveg+dvu/dt]=\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos r & \sin r \\ 0 & -\sin r & \cos r \end{array}\right] \cdot\left[\begin{array}{ccc} \cos p & 0 & -\sin p \\ 0 & 1 & 0 \\ \sin p & 0 & \cos p \end{array}\right] \cdot\left[\begin{array}{ccc} \cos y & \sin y & 0 \\ -\sin y & \cos y & 0 \\ 0 & 0 & 1 \end{array}\right] \cdot\left[\begin{array}{l} d vn \\ d ve \\ g+dvu/dt \end{array}\right] =⎣⎡​100​0cosr−sinr​0sinrcosr​⎦⎤​⋅⎣⎡​cosp0sinp​010​−sinp0cosp​⎦⎤​⋅⎣⎡​cosy−siny0​sinycosy0​001​⎦⎤​⋅⎣⎡​dvndveg+dvu/dt​⎦⎤​

=[cos⁡p⋅cos⁡ycos⁡p⋅sin⁡y−sin⁡pcos⁡y⋅sin⁡p⋅sin⁡r−cos⁡r⋅sin⁡ycos⁡r⋅cos⁡y+sin⁡p⋅sin⁡r⋅sin⁡ycos⁡p⋅sin⁡rsin⁡r⋅sin⁡y+cos⁡r⋅cos⁡y⋅sin⁡pcos⁡r⋅sin⁡p⋅sin⁡y−cos⁡y⋅sin⁡rcos⁡p⋅cos⁡r]⋅[dvndveg+dvu/dt]=\left[\begin{array}{ccc} \cos p \cdot \cos y & \cos p \cdot \sin y & -\sin p \\ \cos y \cdot \sin p \cdot \sin r-\cos r \cdot \sin y & \cos r \cdot \cos y+\sin p \cdot \sin r \cdot \sin y & \cos p \cdot \sin r \\ \sin r \cdot \sin y+\cos r \cdot \cos y \cdot \sin p & \cos r \cdot \sin p \cdot \sin y-\cos y \cdot \sin r & \cos p \cdot \cos r \end{array}\right] \cdot\left[\begin{array}{l} dvn \\ dve \\ g+dvu/dt \end{array}\right] =⎣⎡​cosp⋅cosycosy⋅sinp⋅sinr−cosr⋅sinysinr⋅siny+cosr⋅cosy⋅sinp​cosp⋅sinycosr⋅cosy+sinp⋅sinr⋅sinycosr⋅sinp⋅siny−cosy⋅sinr​−sinpcosp⋅sinrcosp⋅cosr​⎦⎤​⋅⎣⎡​dvndveg+dvu/dt​⎦⎤​

=[−sin⁡pcos⁡p⋅sin⁡rcos⁡p⋅cos⁡r]⋅[dvndveg+dvu/dt]=\left[\begin{array}{c} -\sin p \\ \cos p \cdot \sin r \\ \cos p \cdot \cos r \end{array}\right] \cdot\left[\begin{array}{l} d vn \\ d ve \\ g+dvu/dt \end{array}\right] =⎣⎡​−sinpcosp⋅sinrcosp⋅cosr​⎦⎤​⋅⎣⎡​dvndveg+dvu/dt​⎦⎤​

code:
Eigen::Vector3f deltaV;
Eigen::Vector3f accel;
Eigen::Matrix3f tfmatrix2;
vx = atof(Vn[i].c_str());
vy = atof(Ve[i].c_str());
vz = atof(Vu[i].c_str());tfmatrix2<<cos(pitch/180.0f*M_PI)*cos(yaw/180.0f*M_PI),cos(pitch/180.0f*M_PI)*sin(yaw/180.0f*M_PI),-sin(pitch/180.0f*M_PI),cos(yaw/180.0f*M_PI)*sin(pitch/180.0f*M_PI)*sin(roll/180.0f*M_PI)-                                           cos(roll/180.0f*M_PI)*sin(yaw/180.0f*M_PI),cos(roll/180.0f*M_PI)*cos(yaw/180.0f*M_PI)+sin(pitch/180.0f*M_PI)*sin(roll/180.0f*M_PI)*sin(yaw/180.0f*M_PI),cos(pitch/180.0f*M_PI)*sin(roll/180.0f*M_PI),sin(roll/180.0f*M_PI)*sin(yaw/180.0f*M_PI)+cos(roll/180.0f*M_PI)*cos(yaw/180.0f*M_PI)*sin(pitch/180.0f*M_PI),cos(roll/180.0f*M_PI)*sin(pitch/180.0f*M_PI)*sin(yaw/180.0f*M_PI)-cos(yaw/180.0f*M_PI)*sin(roll/180.0f*M_PI),cos(pitch/180.0f*M_PI)*cos(roll/180.0f*M_PI);
deltaV<<(vx-last_vx)/0.01f,(vy-last_vy)/0.01f,(vz-last_vz)/0.01f+9.8f;
accel=tfmatrix2*deltaV;

节点发布

ros::init(argc, argv, "imu2rosbag");
ros::NodeHandle nh;
ros::Publisher IMU_pub = nh.advertise<sensor_msgs::Imu>("IMU_data", 20);
ros::Rate loop_rate(10);
sensor_msgs::Imu imu_data;
imu_data.header.frame_id = "base_link";
imu_data.header.stamp = ros::Time(atoi(stamp[i].c_str()));imu_data.orientation.x = q0;
imu_data.orientation.y = q1;
imu_data.orientation.z = q2;
imu_data.orientation.w = q3;imu_data.linear_acceleration.x = accel(0);
imu_data.linear_acceleration.y = accel(1);
imu_data.linear_acceleration.z = accel(2);imu_data.angular_velocity.x = gyro(0);
imu_data.angular_velocity.y = gyro(1);
imu_data.angular_velocity.z = gyro(2);

ref: https://blog.csdn.net/weixin_39719127/article/details/110299079 (姿态解算)

​ https://blog.csdn.net/chenlin41204050/article/details/78429437 (C++读CSV文件)

读取csv文件中的IMU数据并以sensor_msgs/Imu格式发送相关推荐

  1. python获取股指_用Python读取csv文件中的沪深300指数历史交易数据

    保存路径:D:\python\用Python读取csv文件中的沪深300指数历史交易数据 程序名称:readcsvhs300.py: 数据名称:沪深300指数历史交易数据.csv: 开发环境:Win7 ...

  2. Python基础——csv文件中某列数据替换为数字

    csv文件中某列数据替换为数字 来源--机器学习读取数据 方法一:正则表达式,replace() import pandas as pd data = pd.read_csv("data2. ...

  3. 如何读取csv文件中第n行数据python-python数据处理之如何选取csv文件中某几行的数据...

    前言 有些人看到这个问题觉得不是问题,是嘛,不就是df.col[]函数嘛,其实忽略了一个重点,那就是我们要省去把csv文件全部读取这个过程,因为如果在面临亿万级别的大规模数据,得到的结果就是boom, ...

  4. C++ 读取CSV文件中的数据到Mat

    目标 最近正在做热图像的实验数据处理,热像仪上位机导出热图像视频数据是,每一帧为一个csv文件,每行像素值由逗号分隔,行与行之间是换行符,数据格式是纯文本,科学计数法.需要将全部数据存至一个mat中, ...

  5. python 读取excel文件 效率 时间 格式_python读取Excel文件中的时间数据

    在使用python读取Excel文件中的时间格式,碰到的时间格式转换问题: 读取这样的表格: 输出这样的数据结果: 然而这样的结果却不是我们想要的,我们需要的是这样的结果: 1.安装python官方库 ...

  6. python读取CSV文件中温度值绘制3D折线图

    import pyecharts.options as opts from pyecharts.charts import Line3D import random import csv filena ...

  7. python读取html文件中的表格数据_Python 读取各类文件格式的文本信息 | doc,excel,html,mht...

    原标题:Python 读取各类文件格式的文本信息 | doc,excel,html,mht 众所周知,python最强大的地方在于,python社区汇总拥有丰富的第三方库,开源的特性,使得有越来越多的 ...

  8. C++ 读取wav文件中的PCM数据

    前言 wav文件通常会使用PCM格式数据存储音频,这种格式的数据读取出来直接就可以播放,要在wav文件中读取数据,我们首先要获取头部信息,wav的文件结构里面分为多个chunk,我们要做的就是识别这些 ...

  9. 利用python读取csv文件中url并下载

    这是天池竞赛中数据集下载的csv文件,在这里当然也可以用wget在linux中进行下载,但这样感觉不太cool. 写了个python程序,文件夹栏 import pandas as pd import ...

  10. c语言实现读取csv文件,并对数据进行分析。

    总代码: ```c在这里插入代码片 #include <stdio.h> #include <stdlib.h> #include <string.h> struc ...

最新文章

  1. Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to
  2. 使用CSS3各个属性实现小人的动画
  3. BZOJ 1087状态压缩DP
  4. 解决ftp的pasv模式下iptables设置问题
  5. c语言int转字符串_C语言零基础入门-指针-05
  6. layui前端页面table表格怎么格式化转换时间_个人经历:我的前端学习历程
  7. 商业智能BI有哪些数据价值
  8. 【转】每一种创伤,都是一种成熟
  9. css背景和边框标签总结
  10. linux进程僵尸问题的原因,Linux僵尸进程产生原因及避免方法
  11. 三菱FX2N系列PLC的模拟量扩展模块简介
  12. uni-app 实现简单登录注册demo
  13. html5小游戏塔防,HTML5塔防(一)
  14. SAS PROC SQL
  15. uni-app分享小程序卡片给微信好友
  16. 新型光电复合缆特点及其应用
  17. matlab设计高通系统,用matlab设计高通滤波器雪比切夫、fir两种方法 课程设计HPF.doc...
  18. 华为OD机试真题 C++ 实现【预订酒店】【2022.11 Q4 新题】
  19. MySQL insert 插入优化技巧,MySQL 优化学习第8天
  20. 《鱿鱼游戏》全球大火,奈飞却难借IP变现成为“大赢家”

热门文章

  1. 【填坑】Ubuntu安装vsftpd
  2. English trip -- VC(情景课)2 C Where's my pencli?
  3. Unity Shader 噪声消融特效 - 剑灵死亡特效
  4. 准备 macvlan 环境 - 每天5分钟玩转 Docker 容器技术(54)
  5. hdu 1874 畅通project续
  6. Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式...
  7. php curl CURLOPT_TIMEOUT_MS 小于1秒 解决方案
  8. python3.7.1安装
  9. cmd 下关闭不需要的进程
  10. Transformer为啥在NER上表现不好