初学C++,尝试实现惯性导航+零速修正+卡尔曼滤波
第一步,读取csv中的传感器数据
此处用到C++文件的输入输出控制知识
首先定义声明一个ifstream对象,与文件名关联。ps:关联后相当于找到了文件的地址,可以通过此对象对文件操作
需要包含头文件#include
ifstream _csvInput("csvdata/xxxx.csv")
或者
ifstream _csvInput;
_csvInput.open(csvdata/xxxx.csv)
然后就可以像cin一样操作_csvInput。例如
char ch;
_csvInput >> ch;
char buf[80];
_csvInput >> buf;
_csvInput.getline(buf, 80);
string line;
getline(_csvInput, line);
这里,我读的是传感器数据,csv文件每行,首个为number,其次是三个acc数据,三个gyro数据,三个mag数据
因此使用getline先读到一行数据
定义一行数据为字符串
string _Oneline;
读该文件一行数据
getline(_csvInput, _Oneline);
此时读到的数据存在_Oneline中,此行数据包括了上述四类数据(number,acc[3],gyro[3],mag[3])
此时再声明一个输入的串流对象,和刚刚的ifstream类似,由此可以对_Oneline进行操作
istringstream _Readstr(_Oneline);
再定义一行中,各个数据由_partOfstr表示
string _partOfstr;
读取由 ',' 隔开的各个数据 ,再转化为float型(一行有10个','分开的数据)
for(int i = 0; i < 10; i++)
{
getline(_Readstr, _partOfstr, ',');
data[i] = atof(_partOfstr.c_str());
}
得到的data[]即是最后的结果。
最后程序
main.cpp
#include "global.h"
#include "ReadData.h"
#include "imu.h"
using namespace std;
int main()
{
IMUdata imudata;
//指定文件路径
const char* path = "csvdata/straightLine_CalInertialAndMag.csv";
//初始化CSVreader类对象
CSVreader reader(path);
//读数据,第一行为列名,不做处理
reader.readline();
while(!reader.readline())
{
//得到原始数据
imudata = setIMU(reader.data);
cout << imudata.acc[0] << endl;
break;
}
//暂停等待用户信号,不然控制台程序会一闪而过
system("pause");
}
ReadData.cpp
#include "ReadData.h"
//构造函数,初始化文件路径
CSVreader::CSVreader(const char *path)
{
_csvInput.open(path);
}
//读取csv文件数据
int CSVreader::readline()
{
//定义一行数据为字符串
string _Oneline;
//读取一行数据
getline(_csvInput, _Oneline);
//cout << "原始字符串:" << _Oneline << endl;
//如果读取到首行数据,返回失败
if (_Oneline[0] == 'P')
return EXIT_FAILURE;
//定义字符串流对象
istringstream _Readstr(_Oneline);
//定义一行数据中的各个字串
string _partOfstr;
//将一行数据按','分割
for(int i = 0; i < 10; i++)
{
getline(_Readstr, _partOfstr, ',');
data[i] = atof(_partOfstr.c_str());
}
//判断是否读完数据
if ((data[0]||data[1]||data[3]) == 0)
return EXIT_FAILURE;
return EXIT_SUCCESS;
}
ReadData.h
#pragma once
#include
#include
#include
#include
#include
#include "global.h"
using namespace std;
//定义CSV读类
class CSVreader
{
public:
CSVreader(const char *);
int readline();
float data[10];
private:
ifstream _csvInput;
};
imu.cpp
#include "imu.h"
//将文件读到的数据传到IMUdata结构体
IMUdata setIMU(float data[])
{
IMUdata imudata;
for (int i = 0; i < 3; i++)
{
imudata.acc[i] = data[i + 1];
imudata.gyro[i] = data[i + 4];
imudata.mag[i] = data[i + 7];
}
return imudata;
}
imu.h
#pragma once
struct Time {
int hour;
int minute;
int sec;
int ms;
};
struct IMUdata {
float acc[3];
float gyro[3];
float mag[3];
int number;
};
IMUdata setIMU( float data[]);