ariesys 发表于 2019-7-12 18:07:51

px41.6.2—控制Aux Out输出

本帖最后由 ariesys 于 2019-7-12 18:21 编辑

一、参考网址官网:1、 Mixing and Actuators:https://dev.px4.io/en/concept/mixing.html#control-group-0-flight-control2、Gimbal Control Setup:https://dev.px4.io/v1.9.0/en/advanced/gimbal_control.html3、System Startup ->Starting a custom mixer:https://dev.px4.io/v1.9.0/en/concept/system_startup.html博客:1、 PX4中混控器Mixer的分析:https://blog.csdn.net/u013181595/article/details/84866978
二、概念            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 -1000010000      S: 3 510000 10000      0 -1000010000      # AUX2 channel (select RC channelwith RC_MAP_AUX2 param)      M: 1      O:      10000 10000      0 -1000010000      S: 3 610000 10000      0 -1000010000      # AUX3 channel (select RC channelwith RC_MAP_AUX3 param)      M: 1      O:      10000 10000      0 -1000010000      S: 3 710000 10000      0 -1000010000      # FLAPS channel (select RC channelwith RC_MAP_FLAPS param)      M: 1      O:      10000 10000      0 -1000010000      S: 3 410000 10000      0 -1000010000      对应的语法,官网上《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= manual.y;   actuator_group_3.control= manual.x;   actuator_group_3.control= manual.r;   actuator_group_3.control= manual.z;   actuator_group_3.control= manual.flaps;   actuator_group_3.control= manual.aux1;   actuator_group_3.control= manual.aux2;   actuator_group_3.control= 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与pass.aux.mix设置的相对应,即根据actuator组号发布对应的控制组变量赋值。       同样,在mc_att_control_main.cpp中,将姿态控制的输出赋值到_actuators_0数组。    /* publishactuator controls */   _actuators.control= (PX4_ISFINITE(_att_control(0))) ? _att_control(0) : 0.0f;   _actuators.control= (PX4_ISFINITE(_att_control(1))) ? _att_control(1) : 0.0f;   _actuators.control= (PX4_ISFINITE(_att_control(2))) ? _att_control(2) : 0.0f;   _actuators.control= (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继电器模块。      实验设备:      介绍一款简单好用的PWM继电器:https://item.taobao.com/item.htm?spm=a1z09.2.0.0.31712e8dMnN1OA&id=568188825891&_u=akosojbd5aa       硬件连接图如下:            实验步骤:       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 -1000010000      S: 2 410000 10000      0 -1000010000      # AUX2      M: 1      O:      10000 10000      0 -1000010000      S: 2 510000 10000      0 -1000010000      # AUX3      M: 1      O:      10000 10000      0 -1000010000      S: 2 610000 10000      0 -1000010000       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= -1.0f;//对应1000us最低值   _actuators2.control= 0.0f;//对应1500us   _actuators2.control= 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输出,筒子们可以任意选择。



ariesys 发表于 2021-1-11 21:04:12

mlsd 发表于 2020-12-25 19:56
您好,您的文章对我帮助很大。但是我还有个问题,如果不用pwm继电器,把舵机直接接在飞控板的aux口上,可以 ...

不好意思,不经常来,可以驱动舵机,最好给AUX单独供个电

maxiou 发表于 2019-7-13 09:54:37

好详细的好文章,实验的全过程。但为啥不用最新的PX4 1.8 1.9 还用1.6.2呢。。想不通

ariesys 发表于 2019-7-13 11:50:24

maxiou 发表于 2019-7-13 09:54
好详细的好文章,实验的全过程。但为啥不用最新的PX4 1.8 1.9 还用1.6.2呢。。想不通
...

{:2_27:}主要是项目用的1.6.2的版本,项目做了一年半了,那时候用的1.6.2的版本改了一些代码在上面,就一直用着这个版本了。。。{:2_27:}

amov_msq 发表于 2019-7-15 09:11:30

好文

yinghtang 发表于 2019-12-27 16:19:34

如果我不想用PWM继电器,只想给个高电平出去控制电磁铁,该怎么改呢?

mlsd 发表于 2020-12-25 19:56:33

您好,您的文章对我帮助很大。但是我还有个问题,如果不用pwm继电器,把舵机直接接在飞控板的aux口上,可以驱动舵机吗?我之前在main口中做了类似尝试,但是舵机毫无反应,当然频率是调到50hz了。期待您的回答,打扰了
页: [1]
查看完整版本: px41.6.2—控制Aux Out输出