|
发表于 2022-5-11 16:16:00
3783 浏览 1 回复
[入门教程]
PX4 混控部分分析
本帖最后由 chasing 于 2022-5-11 16:19 编辑
PX4的混控部分大体思路和ardupilot是一致的, 更多的PX4采用的是脚本读取的形式完成其中的读取,转换以及最后的应用.
首先从机型选择后,对应为toml文件, 如下图所示:
采用对应的px_generate_mixers.py来自动生成对应的文件, 该脚本提取toml中的参数, 进行生成, 脚本如下图所示
对应python代码中的主函数是通过解析附带的输入参数完成识别, 具体可以参看同级路径下的CMakeLists.txt完成
- if __name__ == '__main__':
- import argparse
- import glob
- import os
- # Parse arguments
- parser = argparse.ArgumentParser(
- description='Convert geometry .toml files to mixer headers')
- parser.add_argument('-d', dest='dir',
- help='directory with geometry files')
- parser.add_argument('-f', dest='files',
- help="files to convert (use only without -d)",
- nargs="+")
- parser.add_argument('-o', dest='outputfile',
- help='output header file')
- parser.add_argument('--verbose', help='Print details on standard output',
- action='store_true')
- parser.add_argument('--normalize', help='Use normalized mixers (compatibility mode)',
- action='store_true')
- parser.add_argument('--sixdof', help='Use 6dof mixers',
- action='store_true')
- args = parser.parse_args()
复制代码 生成文件为mixer_multirotor_normalized.generated.h, 部分截图保存如下
随后, 在使用阶段, 全局搜索关键词 from_text, 可以看到如下内容
继续顺藤摸瓜, 创建MultirotorMixer的对象
上图中 _rotors(_config_index[]), 则对应生成的系数矩阵.
在程序的循环使用中, (只测试了对应的jmavsim仿真程序) , airmode = 0
最后附上mix_airmode_rp的函数内容
- void MultirotorMixer::mix_airmode_rp(float roll, float pitch, float yaw, float thrust, float *outputs)
- {
- // Airmode for roll and pitch, but not yaw
- // Mix without yaw
- for (unsigned i = 0; i < _rotor_count; i++) {
- outputs = roll * _rotors.roll_scale +
- pitch * _rotors.pitch_scale +
- thrust * _rotors.thrust_scale;
- // Thrust will be used to unsaturate if needed
- _tmp_array = _rotors.thrust_scale;
- }
- minimize_saturation(_tmp_array, outputs, _saturation_status);
- // Mix yaw independently
- mix_yaw(yaw, outputs);
- }
复制代码 Remark: 最终的PWM输出口是在px4.io中完成.
|
扫一扫浏览分享
|
|
|
|
|
|
|