读取csv文件中的IMU数据并以sensor_msgs/Imu格式发送
读取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] ⎣⎡gxgygz⎦⎤=Mx⋅My⋅⎣⎡00dtdy⎦⎤+Mx⋅⎣⎡0dtdp0⎦⎤+⎣⎡dtdr00⎦⎤
=[1000cosrsinr0−sinrcosr]⋅[cosp0−sinp010sinp0cosp]⋅[00dydt]+[1000cosrsinr0−sinrcosr]⋅[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] =⎣⎡1000cosr−sinr0sinrcosr⎦⎤⋅⎣⎡cosp0sinp010−sinp0cosp⎦⎤⋅⎣⎡00dtdy⎦⎤+⎣⎡1000cosr−sinr0sinrcosr⎦⎤⋅⎣⎡0dtdp0⎦⎤+⎣⎡dtdr00⎦⎤
=[10−sinp0cosrcosp⋅sinr0−sinrcosp⋅cosr]⋅[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] =⎣⎡1000cosr−sinr−sinpcosp⋅sinrcosp⋅cosr⎦⎤⋅⎣⎡dtdrdtdpdtdy⎦⎤
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] ⎣⎡axayaz⎦⎤=Mx⋅My⋅Mz⋅⎣⎡dvndveg+dvu/dt⎦⎤
=[1000cosrsinr0−sinrcosr]⋅[cosp0−sinp010sinp0cosp]⋅[cosysiny0−sinycosy0001]⋅[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] =⎣⎡1000cosr−sinr0sinrcosr⎦⎤⋅⎣⎡cosp0sinp010−sinp0cosp⎦⎤⋅⎣⎡cosy−siny0sinycosy0001⎦⎤⋅⎣⎡dvndveg+dvu/dt⎦⎤
=[cosp⋅cosycosp⋅siny−sinpcosy⋅sinp⋅sinr−cosr⋅sinycosr⋅cosy+sinp⋅sinr⋅sinycosp⋅sinrsinr⋅siny+cosr⋅cosy⋅sinpcosr⋅sinp⋅siny−cosy⋅sinrcosp⋅cosr]⋅[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⋅sinpcosp⋅sinycosr⋅cosy+sinp⋅sinr⋅sinycosr⋅sinp⋅siny−cosy⋅sinr−sinpcosp⋅sinrcosp⋅cosr⎦⎤⋅⎣⎡dvndveg+dvu/dt⎦⎤
=[−sinpcosp⋅sinrcosp⋅cosr]⋅[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格式发送相关推荐
- python获取股指_用Python读取csv文件中的沪深300指数历史交易数据
保存路径:D:\python\用Python读取csv文件中的沪深300指数历史交易数据 程序名称:readcsvhs300.py: 数据名称:沪深300指数历史交易数据.csv: 开发环境:Win7 ...
- Python基础——csv文件中某列数据替换为数字
csv文件中某列数据替换为数字 来源--机器学习读取数据 方法一:正则表达式,replace() import pandas as pd data = pd.read_csv("data2. ...
- 如何读取csv文件中第n行数据python-python数据处理之如何选取csv文件中某几行的数据...
前言 有些人看到这个问题觉得不是问题,是嘛,不就是df.col[]函数嘛,其实忽略了一个重点,那就是我们要省去把csv文件全部读取这个过程,因为如果在面临亿万级别的大规模数据,得到的结果就是boom, ...
- C++ 读取CSV文件中的数据到Mat
目标 最近正在做热图像的实验数据处理,热像仪上位机导出热图像视频数据是,每一帧为一个csv文件,每行像素值由逗号分隔,行与行之间是换行符,数据格式是纯文本,科学计数法.需要将全部数据存至一个mat中, ...
- python 读取excel文件 效率 时间 格式_python读取Excel文件中的时间数据
在使用python读取Excel文件中的时间格式,碰到的时间格式转换问题: 读取这样的表格: 输出这样的数据结果: 然而这样的结果却不是我们想要的,我们需要的是这样的结果: 1.安装python官方库 ...
- python读取CSV文件中温度值绘制3D折线图
import pyecharts.options as opts from pyecharts.charts import Line3D import random import csv filena ...
- python读取html文件中的表格数据_Python 读取各类文件格式的文本信息 | doc,excel,html,mht...
原标题:Python 读取各类文件格式的文本信息 | doc,excel,html,mht 众所周知,python最强大的地方在于,python社区汇总拥有丰富的第三方库,开源的特性,使得有越来越多的 ...
- C++ 读取wav文件中的PCM数据
前言 wav文件通常会使用PCM格式数据存储音频,这种格式的数据读取出来直接就可以播放,要在wav文件中读取数据,我们首先要获取头部信息,wav的文件结构里面分为多个chunk,我们要做的就是识别这些 ...
- 利用python读取csv文件中url并下载
这是天池竞赛中数据集下载的csv文件,在这里当然也可以用wget在linux中进行下载,但这样感觉不太cool. 写了个python程序,文件夹栏 import pandas as pd import ...
- c语言实现读取csv文件,并对数据进行分析。
总代码: ```c在这里插入代码片 #include <stdio.h> #include <stdlib.h> #include <string.h> struc ...
最新文章
- Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to
- 使用CSS3各个属性实现小人的动画
- BZOJ 1087状态压缩DP
- 解决ftp的pasv模式下iptables设置问题
- c语言int转字符串_C语言零基础入门-指针-05
- layui前端页面table表格怎么格式化转换时间_个人经历:我的前端学习历程
- 商业智能BI有哪些数据价值
- 【转】每一种创伤,都是一种成熟
- css背景和边框标签总结
- linux进程僵尸问题的原因,Linux僵尸进程产生原因及避免方法
- 三菱FX2N系列PLC的模拟量扩展模块简介
- uni-app 实现简单登录注册demo
- html5小游戏塔防,HTML5塔防(一)
- SAS PROC SQL
- uni-app分享小程序卡片给微信好友
- 新型光电复合缆特点及其应用
- matlab设计高通系统,用matlab设计高通滤波器雪比切夫、fir两种方法 课程设计HPF.doc...
- 华为OD机试真题 C++ 实现【预订酒店】【2022.11 Q4 新题】
- MySQL insert 插入优化技巧,MySQL 优化学习第8天
- 《鱿鱼游戏》全球大火,奈飞却难借IP变现成为“大赢家”
热门文章
- 【填坑】Ubuntu安装vsftpd
- English trip -- VC(情景课)2 C Where's my pencli?
- Unity Shader 噪声消融特效 - 剑灵死亡特效
- 准备 macvlan 环境 - 每天5分钟玩转 Docker 容器技术(54)
- hdu 1874 畅通project续
- Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式...
- php curl CURLOPT_TIMEOUT_MS 小于1秒 解决方案
- python3.7.1安装
- cmd 下关闭不需要的进程
- Transformer为啥在NER上表现不好