本帖最后由 ariesys 于 2019-7-12 18:21 编辑
一、参考网址 官网: 博客:
二、概念 PX4中mixer的结构如上图所示,mixer的作用是连接上层应用模块(例如姿态控制器解算的输出量)与底层硬件的执行机构输出(对应电机、舵机的PWM值)。mixer模块相当于隔离了上层应用模块与底层的硬件接口,在编写上层应用模块时不用担心控制量是输出给哪个电机,同时更改不同的mixer配置文件可以适应不同的机型而无需更改上层应用模块的代码。 下面简单解释一下Mixer的映射关系,以常规X型四旋翼为例,主要解释辅助通道如何设置,主通道的mixer解析在参考博客《PX4中混控器Mixer的分析》中有详细解析。图2是官网给出的输出通道配置。辅助通道的输出与设置的遥控器RC AUX1/2/3对应,也就是复制了遥控器某一通道的值,在遥控器界面可以设置RC AUX1/2/3对应的遥控器通道。 通过地面站设置飞行器类型后,可以看到SYS_AUTOSTART参数变成了相应的数字,常规X型四旋翼编号是4001,与图2中对应。不同的机型有不同的编号。 在Firmware/ROMFS/px4fmu_common/init.d中可以看到名为4001_quad_x文件,同时在启动脚本文件rcS中会启动对应的脚本文件,即4001_quad_x文件。 if param compare SYS_AUTOSTART 0 then ekf2 start else sh /etc/init.d/rc.autostart fi 在4001_quad_x文件中, sh /etc/init.d/rc.mc_defaults #启动了多旋翼脚本文件 set MIXER quad_x #主通道输出配置文件名为quad_x set PWM_OUT 1234 #设置主通道输出数为4 在rc.mc_defaults文件中, set MIXER_AUX pass #辅助通道输出配置文件名为pass set PWM_AUX_RATE 50 #输出频率为50 set PWM_AUX_OUT 1234 #设置输出通道数目为4 在Firmware/ROMFS/px4fmu_common/mixers文件夹中可以找到对应的mix文件 在pass.aux.mix文件中,映射了辅助输出通道与控制组的关系。 # AUX1 channel (selectRC channel with RC_MAP_AUX1 param) M: 1 O: 10000 10000 0 -10000 10000 S: 3 5 10000 10000 0 -10000 10000 # AUX2 channel (select RC channelwith RC_MAP_AUX2 param) M: 1 O: 10000 10000 0 -10000 10000 S: 3 6 10000 10000 0 -10000 10000 # AUX3 channel (select RC channelwith RC_MAP_AUX3 param) M: 1 O: 10000 10000 0 -10000 10000 S: 3 7 10000 10000 0 -10000 10000 # FLAPS channel (select RC channelwith RC_MAP_FLAPS param) M: 1 O: 10000 10000 0 -10000 10000 S: 3 4 10000 10000 0 -10000 10000 对应的语法,官网上《Mixing and Actuators》有详细解释,这里给出简单的解释 M: <control count> O: <-ve scale> <+vescale> <offset> <lower limit> <upper limit> S: <group> <index><-ve scale> <+ve scale> <offset> <lower limit><upper limit> 一组M: + O:代表一组通道,S:语法定义了该通道与控制组的关系,例如在AUX1上S: 3 5 ****就是把AUX1通道映射到了控制组3的5号变量上,根据官网给出的控制组3定义如下,把AUX1映射给了RC aux1变量。 Control Group #3 (Manual Passthrough) 0: RC roll 1: RC pitch 2: RC yaw 3: RC throttle 4: RC mode switch 5: RC aux1 6: RC aux2 7: RC aux3
以上就把底层的输出通道与控制组映射起来了,下面看如何在上层模块部分赋值控制组中的变量,在Firmware/msg/文件夹中actuator_control.msg消息中, # TOPICS actuator_controlsactuator_controls_0 actuator_controls_1 actuator_controls_2 actuator_controls_3 # TOPICSactuator_controls_virtual_fw actuator_controls_virtual_mc 该该消息可用来发布actuator_controls、actuator_controls_0等消息,其中actuator_controls_0对应0号控制组,依次类推actuator_controls_3对应control group3。全局搜索actuator_controls_3,在Firmware/src/modules/sensors/rc.update.cpp文件中, /*copy from mapped manual control to control group 3 */ structactuator_controls_s actuator_group_3 = {}; actuator_group_3.timestamp= rc_input.timestamp_last_signal; actuator_group_3.control[0]= manual.y; actuator_group_3.control[1]= manual.x; actuator_group_3.control[2]= manual.r; actuator_group_3.control[3]= manual.z; actuator_group_3.control[4]= manual.flaps; actuator_group_3.control[5]= manual.aux1; actuator_group_3.control[6]= manual.aux2; actuator_group_3.control[7]= manual.aux3; /* publishactuator_controls_3 topic */ orb_publish_auto(ORB_ID(actuator_controls_3),&_actuator_group_3_pub, &actuator_group_3, &instance,ORB_PRIO_DEFAULT); 将manual.aux1赋值给了actuator_group_3.control[5]与pass.aux.mix设置的相对应,即根据actuator组号发布对应的控制组变量赋值。 同样,在mc_att_control_main.cpp中,将姿态控制的输出赋值到_actuators_0数组。 /* publishactuator controls */ _actuators.control[0]= (PX4_ISFINITE(_att_control(0))) ? _att_control(0) : 0.0f; _actuators.control[1]= (PX4_ISFINITE(_att_control(1))) ? _att_control(1) : 0.0f; _actuators.control[2]= (PX4_ISFINITE(_att_control(2))) ? _att_control(2) : 0.0f; _actuators.control[3]= (PX4_ISFINITE(_thrust_sp)) ? _thrust_sp : 0.0f; orb_publish(_actuators_id,_actuators_0_pub, &_actuators); 官网定义的ControlGroup0如下: Control Group #0 (FlightControl) 0: roll (-1..1) 1: pitch (-1..1) 2: yaw (-1..1) 3: throttle (0..1 normalrange, -1..1 for variable pitch / thrust reversers) 4: flaps (-1..1) 5: spoilers (-1..1) 6: airbrakes (-1..1) 7: landing gear (-1..1) 以上解释了图1中的mixer结构关系,下面改写代码通过设置AUX通道的值来完成控制舵机、PWM继电器等操作。
三、实验效果 实验目的:利用AUX输出通道控制PWM继电器模块。 实验设备: 硬件连接图如下: 实验步骤: 1、改写mix文件:根据官网《Gimbal Control Setup》及《System Startup ->Startinga custom mixer》介绍,可以不用修改Firmware中的pass.aux.mix文件来重新设置aux的输出,通过在pixhawk的sd卡的根目录上建立一个etc的文件夹,在etc文件夹中创建mixers文件夹和config.txt文件,在mixers中创建名为mount.aux.mix文件。 mount.aux.mix文件内容如下,这里我们用控制组2的4、5、6通道映射AUX: # AUX1 M: 1 O: 10000 10000 0 -10000 10000 S: 2 4 10000 10000 0 -10000 10000 # AUX2 M: 1 O: 10000 10000 0 -10000 10000 S: 2 5 10000 10000 0 -10000 10000 # AUX3 M: 1 O: 10000 10000 0 -10000 10000 S: 2 6 10000 10000 0 -10000 10000 config.txt文件中写入: set MIXER_AUX mount set PWM_AUX_OUT 1234 set PWM_AUX_DISARMED 1500 set PWM_AUX_MIN 1000 set PWM_AUX_MAX 2000 set PWM_AUX_RATE 50 插回sd卡即可。 2、改写代码: 在mc_att_control_main.cpp仿照actuator0新建一组actuator2的相关变量。 1)在class MulticopterAttitudeControl类中添加变量: orb_advert_t _actuators_2_pub; orb_id_t_actuators_id2; bool _actuators_2_circuit_breaker_enabled; structactuator_controls_s _actuators2; 2)在MulticopterAttitudeControl::MulticopterAttitudeControl() 构造函数中初始化: _actuators_2_pub(nullptr), _actuators_id2(nullptr), _actuators_2_circuit_breaker_enabled(false), _actuators2{}, 3)在MulticopterAttitudeControl::vehicle_status_poll()中赋值id号,控制组号: _actuators_id2= ORB_ID(actuator_controls_2); 4)在MulticopterAttitudeControl::task_main()中赋值、发布消息: _actuators2.control[4]= -1.0f;//对应1000us最低值 _actuators2.control[5]= 0.0f;//对应1500us _actuators2.control[6]= 1.0f;//对应2000us最高值 _actuators2.timestamp= hrt_absolute_time(); _actuators2.timestamp_sample= _ctrl_state.timestamp;
if(!_actuators_2_circuit_breaker_enabled) { if(_actuators_2_pub != nullptr) { orb_publish(_actuators_id2,_actuators_2_pub, &_actuators2); } else if(_actuators_id2) { _actuators_2_pub= orb_advertise(_actuators_id2, &_actuators2); } } 编译、烧写代码。 实验效果: 上电后,按下安全开关,通过QGC可以看到servo1/2/3_raw分别赋值1000/1500/2000。 插上舵机测试一下: 插上推拉式电磁铁测试: 插上充电型电磁铁测试: 当然官网上也介绍了如何通过MAVLINK控制AUX输出,筒子们可以任意选择。
|