目录

一、直升机混控矩阵的介绍:

二、源代码解读


一、直升机混控矩阵的介绍:

直升机混控:

直升机混控将三个控制输入(roll,pitch,thrust)组合为四个输出(斜盘伺服系统和主电机ESC设置)。

直升机混控的第一个输出是主电机的油门设置。 随后的输出是斜盘伺服器。 可以通过添加简单的混合器来控制尾桨。

推力控制输入既用于主电动机设置,也用于斜盘的总螺距。 它使用油门曲线和俯仰曲线,均由五个点组成。

混合器定义以以下内容开头:

H: <number of swash-plate servos, either 3 or 4>
T: <throttle setting at thrust: 0%> <25%> <50%> <75%> <100%>
P: <collective pitch at thrust: 0%> <25%> <50%> <75%> <100%>

T:定义油门曲线的点。

P:定义总距曲线的点。

两条曲线都包含0至10000之间的五个点。 对于简单的线性行为,曲线的五个值应为 0 2500 5000 7500 10000

接下来是斜盘伺服器(3或4)的每行,格式如下:

S: <angle> <arm length> <scale> <offset> <lower limit> <upper limit>

其中 <angle>是舵机安装的角度 ,单位为度,0度在机头的方向上。 从上方看,正角为顺时针方向。

<arm length>是臂长的比例归一化长度10000等于1。 如果所有伺服臂的长度相同,则该值必须为10000。 臂长越大,伺服偏转量越小,臂越短,伺服偏转量越大。

   <scale>是伺服输出缩放比例,按 <scale> / 10000。 缩放后,将 <offset>偏移,该范围应在-10000到+10000之间。 , <lower limit><upper limit>对于完整的伺服范围 应当为-10000和+10000。

可以通过添加 来控制尾桨 简单求和混控 :

M: 1
S: 0 2  10000  10000      0 -10000  10000

这样,尾桨设置将直接映射到偏航命令。 这既适用于伺服控制的尾旋翼,也适用于带有专用电机的尾旋翼。

源码中有机架blade130作为示例机型:

H: 3
T:      0   3000   6000   8000  10000
P:    500   1500   2500   3500   4500
# Swash plate servos:
S:      0  10000  10000      0  -8000   8000
S:    140  13054  10000      0  -8000   8000
S:    220  13054  10000      0  -8000   8000# Tail servo:
M: 1
S: 0 2  10000  10000      0 -10000  10000
  • 节气门曲线以稍微陡峭的坡度开始,在推力为50%时达到6000(0.6)。
  • 它继续以较小的斜率在100%的推力下达到10000(1.0)。
  • 总距曲线是线性的,但不会使用整个范围。
  • 油门为0%时,总螺距设置已为500(0.05)。
  • 在最大油门时,总螺距仅为4500(0.45)。
  • 对这种类型的直升机使用较高的值会使叶片失速。
  • 该直升机的斜盘舵机的角度为0度,140度和220度。
  • 伺服臂长度不相等。
  • 与第一伺服器相比,第二和第三伺服器的臂更长,比率为1.3054。
  • 伺服限制在-8000和8000,因为它们受到机械限制。

二、源代码解读

直升机混控器的文件路径src/lib/mixer/HelicopterMixer/HelicopterMixer.cpp

源码贴在下面,逐步解读

unsigned
HelicopterMixer::mix(float *outputs, unsigned space)
{if (space < _mixer_info.control_count + 1u) {return 0;}/* Find index to use for curves */float thrust_cmd = get_control(0, 3);int idx = (thrust_cmd / 0.25f);/* Make sure idx is in range */if (idx < 0) {idx = 0;} else if (idx > HELI_CURVES_NR_POINTS - 2) {/* We access idx + 1 below, so max legal index is (size - 2) */idx = HELI_CURVES_NR_POINTS - 2;}/* Local throttle curve gradient and offset */float tg = (_mixer_info.throttle_curve[idx + 1] - _mixer_info.throttle_curve[idx]) / 0.25f;float to = (_mixer_info.throttle_curve[idx]) - (tg * idx * 0.25f);float throttle = constrain(2.0f * (tg * thrust_cmd + to) - 1.0f, -1.0f, 1.0f);/* Local pitch curve gradient and offset */float pg = (_mixer_info.pitch_curve[idx + 1] - _mixer_info.pitch_curve[idx]) / 0.25f;float po = (_mixer_info.pitch_curve[idx]) - (pg * idx * 0.25f);float collective_pitch = constrain((pg * thrust_cmd + po), -0.5f, 0.5f);float roll_cmd = get_control(0, 0);float pitch_cmd = get_control(0, 1);outputs[0] = throttle;for (unsigned i = 0; i < _mixer_info.control_count; i++) {outputs[i + 1] = collective_pitch+ cosf(_mixer_info.servos[i].angle) * pitch_cmd * _mixer_info.servos[i].arm_length- sinf(_mixer_info.servos[i].angle) * roll_cmd * _mixer_info.servos[i].arm_length;outputs[i + 1] *= _mixer_info.servos[i].scale;outputs[i + 1] += _mixer_info.servos[i].offset;outputs[i + 1] = constrain(outputs[i + 1], _mixer_info.servos[i].min_output, _mixer_info.servos[i].max_output);}return _mixer_info.control_count + 1;
}

首先获得油门通道值

float thrust_cmd = get_control(0, 3); 这样获得油门是在0到1之间

计算油门曲线在哪个阶段

int idx = (thrust_cmd / 0.25f); 将油门行程分为四段

确认油门在范围内

if (idx < 0) {
        idx = 0;油门不允许为负数

} else if (idx > HELI_CURVES_NR_POINTS - 2) {
        idx = HELI_CURVES_NR_POINTS - 2;
    }
这样限幅完是0~3,下面再加1就是1~4.

接着是油门阶段曲线限制和总距曲线限制  和前面定义的曲线的点是对应的

H: <number of swash-plate servos, either 3 or 4>
T: <throttle setting at thrust: 0%> <25%> <50%> <75%> <100%>
P: <collective pitch at thrust: 0%> <25%> <50%> <75%> <100%>

float tg = (_mixer_info.throttle_curve[idx + 1] - _mixer_info.throttle_curve[idx]) / 0.25f;
    float to = (_mixer_info.throttle_curve[idx]) - (tg * idx * 0.25f);
    float throttle = constrain(2.0f * (tg * thrust_cmd + to) - 1.0f, -1.0f, 1.0f);

/* Local pitch curve gradient and offset */
    float pg = (_mixer_info.pitch_curve[idx + 1] - _mixer_info.pitch_curve[idx]) / 0.25f;
    float po = (_mixer_info.pitch_curve[idx]) - (pg * idx * 0.25f);
    float collective_pitch = constrain((pg * thrust_cmd + po), -0.5f, 0.5f);

然后获取俯仰和横滚的通道输入

float roll_cmd = get_control(0, 0);
float pitch_cmd = get_control(0, 1);

最后将各通道将总距和俯仰以及横滚通道按舵机角度比列混控

outputs[0] = throttle;
    for (unsigned i = 0; i < _mixer_info.control_count; i++) {
        outputs[i + 1] = collective_pitch
                 + cosf(_mixer_info.servos[i].angle) * pitch_cmd * _mixer_info.servos[i].arm_length
                 - sinf(_mixer_info.servos[i].angle) * roll_cmd * _mixer_info.servos[i].arm_length;
        outputs[i + 1] *= _mixer_info.servos[i].scale;
        outputs[i + 1] += _mixer_info.servos[i].offset;
        outputs[i + 1] = constrain(outputs[i + 1], _mixer_info.servos[i].min_output, _mixer_info.servos[i].max_output);
    }

这里outputs[0]是油门的输出所以不用再混控。

px4直升机混控逻辑整理相关推荐

  1. px4机架和混控文件读取

    在px4启动文件RCS中,可以看到对autostart文件的读取 # # Set parameters and env variables for selected AUTOSTART. # if ! ...

  2. 纯手写F3飞控的直升机固件(2.直升机倾斜盘混控了解)

    首先,对于一个直升机无副翼控制系统(FBLSystem),遥控器设定的倾斜盘类型必须为 Normal 或 H-1,也就是说,Pit.Ail.Ele三个通道无混控关系,倾斜盘混控由直升机无副翼控制系统完 ...

  3. 【Pixhawk】PX4源码控制逻辑详解(以UGV小车为例)

    PX4启动流程 主体控制逻辑 commander:飞行模式控制 stickmapper:摇杆映射 position_estimator:从GPS获得的位置估计 navigator:读取航点,产生期望位 ...

  4. 开源自制的6通道航模遥控器(三)-遥控器端增加MIX混控模式

    1.了解什么是混控 要了解混控,需要先对比一般的遥控模式.一般遥控的每个操作控制都是一个通道,比如美国手的遥控器,左边摇杆前后控制油门,左右控制方向舵:右边摇杆前后控制升降舵,左右控制副翼(横滚).混 ...

  5. 富斯FS-T6 APM飞控四种飞行模式设置方法_MIX混控设置

    来源于5iMX论坛的这篇帖子 富斯FS-T6 APM飞控两种飞行模式设置方法点击打开链接 但是我按照作者的设置MIX的方法,怎么都只有三种通道 先上图吧: 1.我的混控设置: OFFSET是偏移量,向 ...

  6. 三角翼航模尾翼混控原理探索

    最近几天突然想自己diy一个航模--三角翼航模.在研究三角翼的姿态控制的时候,涉及到了混控的知识,我在网上找了好久也找不到相关的原理介绍,或者具体的算法.要么就是让你看遥控器的说明书进行相关设置,要么 ...

  7. VAE逻辑整理及VAE在异常检测中的小实验(附代码)

    VAE逻辑整理及VAE在异常检测中的小实验(附代码) Variance和control variate 两种常见的分类器 相应代码 Minst数据集的训练和重构 KDD99数据  本文主要讲解一下整个 ...

  8. .Net下WinForm换肤控件整理

    .Net下WinForm换肤控件整理                                                                                   ...

  9. PX4从放弃到精通(十一):混控及PWM输出

最新文章

  1. 图解Transformer:Attention Is All You Need
  2. 深度学习(三)theano学习笔记(2)基础函数-未完待续
  3. Spring Boot 密码加密的 2 种姿势!
  4. 问题 D: 巧求和(思维)
  5. 云小课 | 华为云KYON之VPC终端节点
  6. HTTP的请求与响应问题(没有了CSDN,暂时把这里当作论坛了)
  7. EF架构~对AutoMapper实体映射的扩展
  8. blender基本翻译+快捷键
  9. part-1 输入偏置电流和输入失调电流
  10. YOLOV5出现.acceptable suffix is [‘.pt‘]的错误||不使用权重报错
  11. Firefly ROC-RK3328-PC 四核64位入门级Mini PC 官方教程矫正经验
  12. 以开发之名|线上家装新美学——梦想之家,由你来定
  13. Axure RP 8 激活码
  14. EU.org免费域名申请教程
  15. [Chaosblade] chaosblade-jvm-exec和chaosblade交互
  16. ARFoundation之路-视频播放
  17. 【半导体器件数值模拟之仓田卫篇】
  18. 软件的MSDN版、OEM版、RTM版有什么不同?
  19. USBViewer(USB移动存储设备使用记录查看器)
  20. 智力题及答案(逻辑推理)

热门文章

  1. 有两个关系S(A, B, C, D)和T(C, D,E, F), 写出与下列查询等价的SQL表达式:
  2. 【PDF】java使用Itext生成pdf文档--详解
  3. 今日微语早报简报 精选12条新闻摘要 每天一分钟 知晓天下事 3月22日
  4. c atol()函数_atol()函数以及C ++中的示例
  5. nodejs生成uid
  6. 软件产品选型测试/POC测试
  7. 三星堆火了,VR科技如何唤醒千年文明?
  8. 上海庆科EMW3162 WiFi模块 串口透传
  9. Java自学1(哭唧唧又重头开始学了)
  10. 黑马程序员 python 基础版 哪个老师_(看黑马程序员Python基础班视频挺好,犹豫该不该报班?)...