使用MATLAB Coder将工具箱中的系统对象转换为C代码
现在你一个脚本文件,这个文件是个完整的程序,有输入也有输出,运行这个脚本文件会得到你想要的结果。在这个文件里你使用了某个工具箱中的系统对象,这个系统对象很关键,是这个脚本文件的核心函数,现在需要将这个系统对象转换为C代码。那么应该怎么做呢?
一、编写入口函数,将算法的计算部分分解为MATLAB函数
要生成 C 代码,入口点必须是一个函数。我们不必为整个 MATLAB 应用程序生成C代码。如果有计算密集型的特定部分,从这些部分生成代码以加速算法。以下是一个matlab程序。
load 'rpy_9axis' sensorData Fs%将文件变量加载到工作区中
accelerometerReadings = sensorData.Acceleration;
gyroscopeReadings = sensorData.AngularVelocity;
magnetometerReadings = sensorData.MagneticField;
decim = 2; %指定抽取因子为 2 以降低算法的计算成本。
fuse = ahrsfilter('SampleRate',Fs,'DecimationFactor',decim);%创建一个ahrsfilter对象
%SampleRate设置为传感器数据的采样率。
q = fuse(accelerometerReadings,gyroscopeReadings,magnetometerReadings);
%将加速度计读数、陀螺仪读数和磁力计读数传递给ahrsfilter对象fuse,
以输出传感器身体方向随时间变化的估计值。默认情况下,方向输出为四元数向量。
time = (0:decim:size(accelerometerReadings,1)-1)/Fs;
plot(time,eulerd(q,'ZYX','point'))
title('Orientation Estimate')
legend('z-axis', 'y-axis', 'x-axis')
ylabel('Rotation (degrees)')
在这个脚本文件中,我使用了Sensor Fusion and Tracking Toolbox 中ahrsfilter系统对象。该系统对象的功能为将加速度传感器信号、陀螺仪传感器信号和电子罗盘信号融合解算出无人机的姿态。输入为三个传感器的测量值,输出为四元数(即无人机的姿态)现在我想把ahrsfilter系统对象部分变为C代码,那么我首先需要编写一个入口函数,如下:
function quat= sensor_fusio(acc,gyro,mag)%
%SENSOR_FUSIO 此处显示有关此函数的摘要
% 此处显示详细说明
Fs=200;
decim=2;
fuse = ahrsfilter('SampleRate',Fs,'DecimationFactor',decim);
quat=fuse(acc,gyro,mag);
end
然后我们把这个函数替换到原来的程序中,看看这个程序是否正常运行,以判定入口函数的正确性。
load 'rpy_9axis' sensorData %将文件变量加载到工作区中
accelerometerReadings = sensorData.Acceleration;
gyroscopeReadings = sensorData.AngularVelocity;
magnetometerReadings = sensorData.MagneticField;
q = sensor_fusio(accelerometerReadings,gyroscopeReadings,magnetometerReadings);
%将加速度计读数、陀螺仪读数和磁力计读数传递给ahrsfilter对象fuse,以输出传感器身体方向随时间变化的估计值。默认情况下,方向输出为四元数向量。
time = (0:decim:size(accelerometerReadings,1)-1)/Fs;
plot(time,eulerd(q,'ZYX','point'))
title('Orientation Estimate')
legend('z-axis', 'y-axis', 'x-axis')
ylabel('Rotation (degrees)')
OK,这样之后我发现程序依然是好使的,那么说明我的入口函数没问题。接着往后操作。
二、检查入口函数是否适合代码生成
打开你创建的入口函数,在函数名后输入%#codegen,MATLAB 编辑器中的代码分析器会不断检查您的代码。它报告问题并建议修改以最大限度地提高性能和可维护性。不断按照提示修改直到提示标识变绿。
之后右击函数文件,找到check code generation readiness,该命令会检查你的代码是不是最终完善至可以准备代码生成状态。
如下代码已检查完毕,可以准备代码生成。
三、使用MATLAB Coder App 生成C代码
此步骤参照matlab帮助文档和B站30分钟入门MATLAB Coder@jw12187可轻松完成。