电脑:Windows/Linux/MacOS皆可,此处使用Windows
软件:安装 pyulog,教程 https://github.com/PX4/pyulog
飞控:Pixhawk2.4.8,固件版本 PX4FMU_V2


一、获取与转换日志

  1. 将PX4存储卡插入读卡器,接入电脑,很容易找到日志文件,以 .ulg 结尾。比如我的叫 log001.ulg,复制一份到自己的电脑上;
  2. 安装好 pyulog,进入 .ulg 文件所在文件夹下;
  3. 输入命令 ulog2csv log001.ulg,则在当前文件夹下生产一系列导出文件,如下图:

二、日志含义

log001.ulg 导出了一系列 .csv 文件,个人比较关心原始加速度计与陀螺仪数据、期望姿态与期望角速度、估计姿态与估计角速度、输入油门值与输出PWM波占空比几个数据,经查找如下:

物理量所在文件变量单位
原始加速度log001_sensor_combined_0.csvaccelerometer_m_s2 m / s 2 {\rm m/s^2} m/s2
原始角速度log001_sensor_combined_0.csvgyro_rad r a d / s \rm{rad/s} rad/s
期望姿态(四元数)log001_vehicle_attitude_setpoint_0.csvq_d单位1
期望姿态(欧拉角)log001_vehicle_attitude_setpoint_0.csvroll_body, pitch_body, yaw_body r a d {\rm rad} rad
期望角速度log001_vehicle_rates_setpoint_0.csvroll, pitch, yaw r a d / s \rm{rad/s} rad/s
估计姿态(四元数)log001_vehicle_attitude_0.csvq单位1
估计角速度log001_vehicle_attitude_0.csvrollspeed, pitchspeed, yawspeed r a d / s {\rm rad/s} rad/s
遥控器输入值log001_input_rc_0.csvvalues遥控器原始值
输入PWM波占空比(比较值)log001_actuator_outputs_0.csvoutput计数器比较值
输入PWM波占空比(归一化)log001_actuator_outputs_0_0.csvcontrol-1~1

注:PX4的 timestamp 每 1ms 加 1


三、MATLAB数据读取与显示


原始数据链接:链接:https://pan.baidu.com/s/1lHGjgfOT_EJO-C3LEMDZ-A 提取码:51rb

%% 文件实现读取PX4日志(.scv)数据并绘图
%% 读取数据
imu_data = importdata('log001_sensor_combined_0.csv');
atti_d_data = importdata('log001_vehicle_attitude_setpoint_0.csv');
atti_data = importdata('log001_vehicle_attitude_0.csv');
rate_d_data = importdata('log001_vehicle_rates_setpoint_0.csv');
rc_data = importdata('log001_input_rc_0.csv');
pwm_data = importdata('log001_actuator_outputs_0.csv');
pwm1_data = importdata('log001_actuator_controls_0_0.csv');

%% 数据选择 
% 原始IMU数据 imu
t_imu = imu_data.data(:,1)*1e-6;
gyro = imu_data.data(:,2:4);   % gyrox, gyroy, gyroz
acc = imu_data.data(:,7:9);     % accx, accy, accz

% 期望姿态 atti_d
t_atti_d = atti_d_data.data(:,1)*1e-6;
atti_d = atti_d_data.data(:,2:4);    % 期望角速度(欧拉角)

atti_dq = atti_d_data.data(:,6:9);   % 期望角速度(四元数)
q0 = atti_dq(:,1);q1=atti_dq(:,2);q2=atti_dq(:,3);q3=atti_dq(:,4);
roll_d = atan((2*(q0.*q1+q2.*q3)) ./ (1 - 2*(q1.^2+q2.^2)));
pitch_d = asin(2*(q0.*q2 - q1.*q3));
yaw_d = atan(2*(q0.*q3 + q1.*q2) ./ (1-2*(q2.^2+q3.^2)));

% 估计姿态 atti
t_atti = atti_data.data(:,1)*1e-6;
atti_q = atti_data.data(:,5:8);
q0 = atti_q(:,1);q1=atti_q(:,2);q2=atti_q(:,3);q3=atti_q(:,4);
roll = atan((2*(q0.*q1+q2.*q3)) ./ (1 - 2*(q1.^2+q2.^2)));
pitch = asin(2*(q0.*q2 - q1.*q3));
yaw = atan(2*(q0.*q3 + q1.*q2) ./ (1-2*(q2.^2+q3.^2)));

% 期望角速度 rate_d
t_rate_d = rate_d_data.data(:,1)*1e-6;
rate_d = rate_d_data.data(:,2:4);

% 估计角速度 rate
t_rate = atti_data.data(:,1)*1e-6;
rate = atti_data.data(:,2:4);

% 输入rc
t_rc = rc_data.data(:,1)*1e-6;
rc = rc_data.data(:,8:11);

% 输出PWM
t_pwm = pwm_data.data(:,1)*1e-6;        % 原始值
pwm = pwm_data.data(:,3:6);

t_pwm1 = pwm1_data.data(:,1)*1e-6;      % 归一化
pwm1 = pwm1_data.data(:, 3:6);  

%% 绘图
plot(t_atti_d, roll_d, '-',t_atti, roll, '-');legend('期望滚转角', '估计滚转角');xlabel('时间t (s)');ylabel('rad');
plot(t_atti_d, pitch_d, '-',t_atti, pitch, '-');legend('期望俯仰角', '估计俯仰角');xlabel('时间t (s)');ylabel('rad');
plot(t_atti_d, yaw_d, '-',t_atti, yaw, '-');legend('期望偏航角', '估计偏航角');xlabel('时间t (s)');ylabel('rad');

plot(t_rate_d, rate_d(:,1), t_rate, rate(:,1));legend('期望x角速度', '估计x角速度');xlabel('时间t (s)');ylabel('rad/s');
plot(t_rate_d, rate_d(:,2), t_rate, rate(:,2));legend('期望y角速度', '估计y角速度');xlabel('时间t (s)');ylabel('rad/s');
plot(t_rate_d, rate_d(:,3), t_rate, rate(:,3));legend('期望z角速度', '估计z角速度');xlabel('时间t (s)');ylabel('rad/s');

plot(t_rc, rc); legend('CH1', 'CH2', 'CH3', 'CH4');         % 遥控器输入
plot(t_pwm, pwm); legend('Output1', 'Output2', 'Output3', 'Output4');   % 电机输出(原始值)
plot(t_pwm1, pwm1);legend('Output1', 'Output2', 'Output3', 'Output4');   % 电机输出(归一化)

其中,第一张图片如下,其他略。

在这里插入图片描述


PX4日志分析官网教程:http://docs.px4.io/master/zh/log/flight_log_analysis.html

Logo

更多推荐