距离上次记录如何提取数据已经过了很久了,最近又开始做新的工作,因此需要重新录制并处理更多更长的数据,因此特此记录,第二次进行数据处理发现真的容易很多,在此提出cyber_record命令的大佬。
1、录制数据

录制数据就不多做阐述了,进入dreamview然后打开相应模块,点record即可(用命令也可以)
2、数据导出
在录制完毕后,得到相应的.record文件,这种其实很难直接去做实验,因此需要用到cyber_record命令(注意不是apoll自带的cyber_recorder)
步骤如下(Linux):
1)安装

pip3 install cyber_record record_msg

2)利用命令提取数据
 

cyber_record echo -f example.record.00000 -t /apollo/canbus/chassis > 1.txt

这里有更多的提取数据的方法,这里建议详细的看下大佬的文章cyber record包解析工具 - 知乎 (zhihu.com)

3、数据处理
到了这一步,我们就拥有了相应.txt文件,下面就是核心的提取数据了,这里还是以位姿信息为例子,在MATLAB中处理(还有其他的方法,但是我只会MATLAB):

1)位置信息获取

% % 打开文件并读取内容
% fileID = fopen('data.txt', 'r');
% fileContent = fread(fileID, '*char')';
% fclose(fileID);
% 
% % 使用正则表达式提取所有 header 和 position 块中的 x, y, z 值
% pattern = 'header {\s*timestamp_sec: ([\d\.]+)\s*}\s*pose {\s*position {\s*x: ([\d\.]+)\s*y: ([\d\.]+)\s*z: ([\d\.]+)';
% tokens = regexp(fileContent, pattern, 'tokens');
% 
% % 初始化存储位置的数组
% timestamps = [];
% positions = [];
% 
% % 检查并存储所有提取的时间戳和 x, y, z 值
% if ~isempty(tokens)
%     for i = 1:length(tokens)
%         timestamp = str2double(tokens{i}{1});
%         x = str2double(tokens{i}{2});
%         y = str2double(tokens{i}{3});
%         z = str2double(tokens{i}{4});
% 
%         timestamps(end+1, 1) = timestamp; %#ok<AGROW>
%         positions(end+1, :) = [x, y, z]; %#ok<AGROW>
%     end
% else
%     disp('未找到 header 中的 position 的 x, y, z 值');
% end
% 
% % 将数据保存到 .mat 文件
% save('positions.mat', 'timestamps', 'positions');
% 
% % 显示保存的结果
% disp('提取并保存的位置数据:');
% for i = 1:length(timestamps)
%     fprintf('Timestamp: %.9f, Position: x = %.9f, y = %.9f, z = %.9f\n', timestamps(i), positions(i, 1), positions(i, 2), positions(i, 3));
% end

注意这是UTM坐标系下的,需要WGS84的话还需要继续对数据进行一步坐标变换,比较简单,网上很多。

2)四元数获取

% % 打开文件并读取内容
% fileID = fopen('data.txt', 'r');
% fileContent = fread(fileID, '*char')';
% fclose(fileID);
% 
% % 使用正则表达式提取四元数
% pattern = 'orientation {\s*qx: ([\d\.-]+)\s*qy: ([\d\.-]+)\s*qz: ([\d\.-]+)\s*qw: ([\d\.-]+)\s*}';
% tokens = regexp(fileContent, pattern, 'tokens');
% 
% % 初始化存储四元数的数组
% qx = [];
% qy = [];
% qz = [];
% qw = [];
% 
% % 检查并存储所有提取的四元数值
% if ~isempty(tokens)
%     for i = 1:length(tokens)
%         token = tokens{i};
%         qx = [qx; str2double(token{1})];
%         qy = [qy; str2double(token{2})];
%         qz = [qz; str2double(token{3})];
%         qw = [qw; str2double(token{4})];
%     end
% else
%     disp('未找到四元数值');
% end
% 
% % 将数据保存到 .mat 文件
% save('quaternions_data.mat', 'qx', 'qy', 'qz', 'qw');
% 
% % 显示保存的结果
% disp('提取并保存的四元数数据:');
% disp('qx:');
% disp(qx);
% disp('qy:');
% disp(qy);
% disp('qz:');
% disp(qz);
% disp('qw:');
% disp(qw);

3)加速度和角速度获取

% % 打开文件并读取内容
% fileID = fopen('data.txt', 'r');
% fileContent = fread(fileID, '*char')';
% fclose(fileID);
% 
% % 使用正则表达式提取线性加速度
% pattern = 'linear_acceleration {\s*x: ([\d\.-]+)\s*y: ([\d\.-]+)\s*z: ([\d\.-]+)\s*}';
% tokens = regexp(fileContent, pattern, 'tokens');
% 
% % 初始化存储线性加速度的数组
% ax = [];
% ay = [];
% az = [];
% 
% % 检查并存储所有提取的线性加速度值
% if ~isempty(tokens)
%     for i = 1:length(tokens)
%         token = tokens{i};
%         ax = [ax; str2double(token{1})];
%         ay = [ay; str2double(token{2})];
%         az = [az; str2double(token{3})];
%     end
% else
%     disp('未找到线性加速度值');
% end
% 
% % 将数据保存到 .mat 文件
% save('linear_acceleration_data.mat', 'ax', 'ay', 'az');
% 
% % 显示保存的结果
% disp('提取并保存的线性加速度数据:');
% disp('ax:');
% disp(ax);
% disp('ay:');
% disp(ay);
% disp('az:');
% disp(az);
% % 打开文件并读取内容
% fileID = fopen('data.txt', 'r');
% fileContent = fread(fileID, '*char')';
% fclose(fileID);
% 
% % 使用正则表达式提取角速度
% pattern = 'angular_velocity {\s*x: ([\d\.-]+)\s*y: ([\d\.-]+)\s*z: ([\d\.-]+)\s*}';
% tokens = regexp(fileContent, pattern, 'tokens');
% 
% % 初始化存储角速度的数组
% gx = [];
% gy = [];
% gz = [];
% 
% % 检查并存储所有提取的角速度值
% if ~isempty(tokens)
%     for i = 1:length(tokens)
%         token = tokens{i};
%         gx = [gx; str2double(token{1})];
%         gy = [gy; str2double(token{2})];
%         gz = [gz; str2double(token{3})];
%     end
% else
%     disp('未找到角速度值');
% end
% 
% % 将数据保存到 .mat 文件
% save('angular_velocity_data.mat', 'gx', 'gy', 'gz');
% 
% % 显示保存的结果
% disp('提取并保存的角速度数据:');
% disp('gx:');
% disp(gx);
% disp('gy:');
% disp(gy);
% disp('gz:');
% disp(gz);

其他数据提取类似这样的,记录一下以免自己忘了,另外希望能帮助到有需要的人,祝大家还有我工作学业顺利。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐