小P学长
小P学长

Matlab 无人机三维轨迹动画:从 CSV 体检到 VideoWriter 验收

从 time/x/y/z 数据合同开始,先检查时间顺序、采样间隔、速度和突跳,再使用 Matlab 完成三维轨迹、姿态旋转、逐帧动画与视频导出,并给出可独立执行的验收清单。

1. 动画之前,先写数据合同

最少使用 time,x,y,z 四列。time 必须是严格递增数值;xyz 必须在同一直角坐标系中使用同一长度单位。如有 roll/pitch/yaw,还要写明角度或弧度、旋转顺序、机体轴和主/被动旋转。不能把经纬度直接当米计算距离;应先用明确大地基准转换为局部 ENU/NED 等直角坐标。

2. 先检查时间与轨迹

T = readtable('trajectory.csv');
t = double(T.time); p = [double(T.x),double(T.y),double(T.z)];
assert(all(isfinite([t,p]),'all'),'CSV 含非有限数值');
dt = diff(t); assert(all(dt>0),'时间必须严格递增');
ds = sqrt(sum(diff(p,1,1).^2,2));
speed = ds ./ dt;
distance = sum(ds);

MathWorks 的 readtable 会把 CSV 等列式文件读为 table,但自动类型检测不会替你验证单位、坐标系或时间语义。分段速度必须除以各自真实的 dt,不能在不等间隔数据上默认每帧等时。

3. 突跳只是候选,不是自动删点

med = median(ds);
madValue = median(abs(ds-med));
threshold = max(3*med, med+6*madValue);
jumpRows = find(ds > threshold & ds > 0) + 1;

中位数/MAD 阈值对少量极端值相对稳健,但仍只能告诉你“哪些时刻需要回看原始数据”。高速机动、坐标系切换或传感器重定位都可能生成合理或不合理的大分段,需要结合原始日志判断。

4. 重采样要保留首尾端点

targetDt = median(dt);
tq = (t(1):targetDt:t(end))';
if tq(end) < t(end), tq(end+1,1) = t(end); end
pq = interp1(t,p,tq,'linear');

线性重采样只是为稳定的动画时间轴提供一个简单基线,不代表无人机真实动力学路径。平滑前必须保留原始轨迹作对照,并检查是否造成越界或障碍物穿越。

5. 三维轨迹与逐帧更新

figure('Color','w'); ax=axes; hold(ax,'on'); grid(ax,'on');
axis(ax,'equal'); view(ax,3); xlabel('x'); ylabel('y'); zlabel('z');
trail = animatedline(ax,'LineWidth',2);
for k = 1:numel(tq)
    addpoints(trail,pq(k,1),pq(k,2),pq(k,3));
    drawnow;
end

animatedline/addpoints 适合逐步增加点,drawnow 刷新图形。必须使用 axis equal 和明确单位,否则图形轴比例会让轨迹曲率和无人机外形失真。对大数据,显示帧可以降采样,但计算报告应基于完整数据。

6. 姿态旋转要用已声明约定

本文示例用主动 body-to-world 旋转 R=Rz(yaw)Ry(pitch)Rx(roll)。先用单轴 90° 的人工可判断样例验证机头方向,再导入真实姿态。不同软件可能使用 NED/ENU、内旋/外旋、world-to-body 或四元数的不同分量顺序,只要结果“看起来在转”不足以证明约定正确。

7. VideoWriter 必须在目标环境验证

v = VideoWriter('uav_trajectory.avi','Motion JPEG AVI');
v.FrameRate = 20; open(v);
% 循环内:writeVideo(v,getframe(gcf));
close(v);

MathWorks 说明 VideoWriter 用 profile 决定容器和编码。MPEG-4 的支持依赖操作系统,所以基线使用 Motion JPEG AVI;交付前还要检查 VideoWriter.getProfiles、重新打开输出文件并核对帧数。帧率是视频时基,不是 Matlab 循环实际跑速。

8. 可交付的八项验收

  1. 无非数值、空值和重复/倒退时间。
  2. 坐标系、原点、轴方向和单位写入报告。
  3. 采样间隔中位数和 CV 已打印。
  4. 突跳候选逐个回溯,修复有记录。
  5. 三维路程和速度量级符合原始任务。
  6. 重采样首尾时间与位置不变。
  7. 姿态约定用单轴样例验证,轨迹图使用等比例坐标。
  8. 视频在目标机器可重新打开,帧数、帧率与时长可核对。

9. 免费方法与可选实验包

本文已公开数据合同、最小代码与验收方法。只需要理解方法时不必购买;需要完整函数、合成样例、参数表、NumPy 交叉测试和交付检查表时,再核对原创包的清单。

10. 官方文档

本文根据官方公开文档独立整理,不包含旧商品文件、第三方付费教程、论文全文或真实位置数据。