PX4——rcs源码分析

2023-05-16

注:本文转载自——  博主:虾米一代      博客:《pixhawk原生码rcS分析

 

代码执行流程

1.       编译时将cmake/configs/nuttx_px4fmu-v2_default.cmake文件中配置的模块全部编译并烧写到固件中去。

2.       地面站的配置会在flash中生成/fs/mtd_params文件,该文件包含了飞行器的各类信息(机架,校准信息,飞行模式等)。

3.       启动pixhawk,执行/Firmware/ROMFS/px4fmu_common/init.d/rcS,该文件会读入之前生成的参数文件,进而选择执行哪一个脚本文           件。(如选择DJI450机架会执行/Firmware/ROMFS/px4fmu_common/init.d/rc.mc_apps                                                                                       和/Firmware/ROMFS/px4fmu_common/init.d/4011_dji_f450),它们的主要作用为启动飞控所需的各类软件。

4.       不同模块通过uORB通信。

上图形象说明启动流程

以下为代码做了部分注释

rcS

 

[cpp] view plain copy

  1. #!nsh  
  2. #  
  3. # PX4FMU startup script.  
  4. #  
  5. #  NOTE: COMMENT LINES ARE REMOVED BEFORE STORED IN ROMFS.  
  6. #  
  7.   
  8. #  
  9. # Start CDC/ACM serial driver  
  10. #  
  11. sercon  
  12.   
  13. #  
  14. # Default to auto-start mode.           //一些默认设置  
  15. #  
  16. set MODE autostart  
  17.   
  18. set FRC /fs/microsd/etc/rc.txt  
  19. set FCONFIG /fs/microsd/etc/config.txt  
  20. set TUNE_ERR ML<<CP4CP4CP4CP4CP4  
  21. set LOG_FILE /fs/microsd/bootlog.txt  
  22.   
  23. #  
  24. # Try to mount the microSD card.           //挂载SD卡  
  25. #  
  26. # REBOOTWORK this needs to start after the flight control loop  
  27. if mount -t vfat /dev/mmcsd0 /fs/microsd  
  28. then  
  29.     echo "[i] microSD mounted: /fs/microsd"  
  30.     # Start playing the startup tune  
  31.     tone_alarm start  
  32. else  
  33.     tone_alarm MBAGP  
  34.     if mkfatfs /dev/mmcsd0  
  35.     then  
  36.         if mount -t vfat /dev/mmcsd0 /fs/microsd  
  37.         then  
  38.             echo "[i] microSD card formatted"  
  39.         else  
  40.             echo "[i] format failed"  
  41.             tone_alarm MNBG  
  42.             set LOG_FILE /dev/null  
  43.         fi  
  44.     else  
  45.         set LOG_FILE /dev/null  
  46.     fi  
  47. fi  
  48.   
  49. #  
  50. # Look for an init script on the microSD card.  
  51. # Disable autostart if the script found.  
  52. #  
  53. if [ -f $FRC ]                      //如果找到初始化脚本,则不自动启动  
  54. then  
  55.     echo "[i] Executing script: $FRC"  
  56.     sh $FRC  
  57.     set MODE custom  
  58. fi  
  59. unset FRC  
  60.   
  61. if [ $MODE == autostart ]               //自动启动过程  
  62. then  
  63.   
  64.     #  
  65.     # Start the ORB (first app to start)        //启动uORB  
  66.     #  
  67.     uorb start                            
  68.   
  69.     #  
  70.     # Load parameters                   //下载上位机传到sd卡上的参数(机型什么的)  
  71.     #  
  72.     set PARAM_FILE /fs/microsd/params  
  73.     if mtd start       //启动mtd  
  74.     then  
  75.         set PARAM_FILE /fs/mtd_params  
  76.     fi  
  77.   
  78.     param select $PARAM_FILE  
  79.     if param load      //下载参数  
  80.     then  
  81.         echo "[param] Loaded: $PARAM_FILE"  
  82.     else  
  83.         echo "[param] FAILED loading $PARAM_FILE"  
  84.         if param reset  
  85.         then  
  86.         fi  
  87.     fi  
  88.   
  89.     #  
  90.     # Start system state indicator       //启动系统状态指示  
  91.     #  
  92.     if rgbled start    //启动rgbled  
  93.     then  
  94.     else  
  95.         if blinkm start      //启动blinkm(闪光)  
  96.         then  
  97.             blinkm systemstate  
  98.         fi  
  99.     fi  
  100.   
  101.     # Currently unused, but might be useful down the road  
  102.     #if pca8574 start  
  103.     #then  
  104.     #fi  
  105.   
  106.     #  
  107.     # Set default values       //设置默认值  
  108.     #  
  109.     set HIL no  
  110.     set VEHICLE_TYPE none  
  111.     set MIXER none  
  112.     set MIXER_AUX none  
  113.     set OUTPUT_MODE none  
  114.     set PWM_OUT none  
  115.     set PWM_RATE none  
  116.     set PWM_DISARMED none  
  117.     set PWM_MIN none  
  118.     set PWM_MAX none  
  119.     set PWM_AUX_OUT none  
  120.     set PWM_AUX_RATE none  
  121.     set PWM_ACHDIS none  
  122.     set PWM_AUX_DISARMED none  
  123.     set PWM_AUX_MIN none  
  124.     set PWM_AUX_MAX none  
  125.     set FAILSAFE_AUX none  
  126.     set MK_MODE none  
  127.     set FMU_MODE pwm  
  128.     set AUX_MODE pwm  
  129.     set MAVLINK_F default  
  130.     set EXIT_ON_END no  
  131.     set MAV_TYPE none  
  132.     set LOAD_DAPPS yes  
  133.     set GPS yes  
  134.     set GPS_FAKE no  
  135.     set FAILSAFE none  
  136.   
  137.     #  
  138.     # Set AUTOCNF flag to use it in AUTOSTART scripts   //设置AUTOCNF标志  
  139.     #  
  140.     if param compare SYS_AUTOCONFIG 1  
  141.     then  
  142.         # Wipe out params except RC*  
  143.         param reset_nostart RC*  
  144.         set AUTOCNF yes  
  145.     else  
  146.         set AUTOCNF no  
  147.     fi  
  148.   
  149.     #  
  150.     # Set USE_IO flag        //设置USE_IO标志  
  151.     #  
  152.     if param compare SYS_USE_IO 1  
  153.     then  
  154.         if ver hwcmp PX4FMU_V4        //比较px4版本  
  155.         then  
  156.             set USE_IO no  
  157.         else  
  158.             set USE_IO yes  
  159.         fi  
  160.     else  
  161.         set USE_IO no  
  162.     fi  
  163.   
  164.     #  
  165.     # Set parameters and env variables for selected AUTOSTART  
  166.     #  
  167.     if param compare SYS_AUTOSTART 0  
  168.     then  
  169.         echo "[i] No autostart"  
  170.     else  
  171.         sh /etc/init.d/rc.autostart       //执行rc.autostart  
  172.     fi  
  173.     unset MODE  
  174.   
  175.     #  
  176.     # Wipe incompatible settings for boards not having two outputs  
  177.     if ver hwcmp PX4FMU_V4  
  178.     then  
  179.         set MIXER_AUX none  
  180.     fi  
  181.   
  182.     #  
  183.     # Override parameters from user configuration file//根据用户配置文件重写参数  
  184.     #  
  185.     if [ -f $FCONFIG ]  
  186.     then  
  187.         echo "[i] Custom config: $FCONFIG"  
  188.         sh $FCONFIG  
  189.     fi  
  190.     unset FCONFIG  
  191.   
  192.     #  
  193.     # If autoconfig parameter was set, reset it and save parameters    
  194.     #  
  195.     if [ $AUTOCNF == yes ] //如果AUTOCNF == yes,那么复位并保存参数  
  196.     then  
  197.         param set SYS_AUTOCONFIG 0  
  198.         param save  
  199.     fi  
  200.     unset AUTOCNF  
  201.   
  202.     set IO_PRESENT no  
  203.   
  204.     if [ $USE_IO == yes ]   //px4的版本为v2,所以条件满足  
  205.     then  
  206.         #  
  207.         # Check if PX4IO present and update firmware if needed//比较PX4IO,判断是否升级  
  208.         #  
  209.         if [ -f /etc/extras/px4io-v2.bin ] //选择PX4IO-v2固件  
  210.         then  
  211.             set IO_FILE /etc/extras/px4io-v2.bin  
  212.         else  
  213.             set IO_FILE /etc/extras/px4io-v1.bin  
  214.         fi  
  215.   
  216.         if px4io checkcrc ${IO_FILE}//crc检验是否是最新版本  
  217.         then  
  218.             echo "PX4IO CRC OK" >> $LOG_FILE  
  219.   
  220.             set IO_PRESENT yes  
  221.         else  
  222.             echo "PX4IO Trying to update" >> $LOG_FILE  
  223.   
  224.             tone_alarm MLL32CP8MB  
  225.   
  226.             if px4io start//启动px4io  
  227.             then  
  228.                 # try to safe px4 io so motor outputs dont go crazy  
  229.                 if px4io safety_on//判断px4io是否安全  
  230.                 then  
  231.                     # success! no-op  
  232.                 else  
  233.                     # px4io did not respond to the safety command  
  234.                     px4io stop  
  235.                 fi  
  236.             fi  
  237.   
  238.             if px4io forceupdate 14662 ${IO_FILE}//是否强制升级  
  239.             then  
  240.                 usleep 500000  
  241.                 if px4io checkcrc $IO_FILE  
  242.                 then  
  243.                     echo "PX4IO CRC OK after updating" >> $LOG_FILE  
  244.                     tone_alarm MLL8CDE  
  245.   
  246.                     set IO_PRESENT yes  
  247.                 else  
  248.                     echo "ERROR: PX4IO update failed" >> $LOG_FILE  
  249.                     tone_alarm $TUNE_ERR  
  250.                 fi  
  251.             else  
  252.                 echo "ERROR: PX4IO update failed" >> $LOG_FILE  
  253.                 tone_alarm $TUNE_ERR  
  254.             fi  
  255.         fi  
  256.         unset IO_FILE  
  257.   
  258.         if [ $IO_PRESENT == no ] //没有找到px4io  
  259.         then  
  260.             echo "[i] ERROR: PX4IO not found"  
  261.             echo "ERROR: PX4IO not found" >> $LOG_FILE  
  262.             tone_alarm $TUNE_ERR  
  263.         fi  
  264.     fi  
  265.   
  266.     #  
  267.     # Set default output if not set//如果不设置,则为默认设置none  
  268.     #  
  269.     if [ $OUTPUT_MODE == none ]  
  270.     then  
  271.         if [ $USE_IO == yes ] //px4的版本为v2,所以条件满足  
  272.         then  
  273.             set OUTPUT_MODE io  
  274.         else  
  275.             set OUTPUT_MODE fmu  
  276.         fi  
  277.     fi  
  278.   
  279.     if [ $OUTPUT_MODE == io -a $IO_PRESENT != yes ]  
  280.     then  
  281.         # Need IO for output but it not present, disable output//需要IO口输出,但是它不存在  
  282.         set OUTPUT_MODE none  
  283.         echo "[i] ERROR: PX4IO not found, disabling output"  
  284.   
  285.         # Avoid using ttyS0 for MAVLink on FMUv1  
  286.         if ver hwcmp PX4FMU_V1//比较px4的版本  
  287.         then  
  288.             set FMU_MODE serial  //设置FMU_MODE为serial模式  
  289.         fi  
  290.     fi  
  291.   
  292.     if [ $OUTPUT_MODE == ardrone ]  
  293.     then  
  294.         set FMU_MODE gpio_serial  
  295.     fi  
  296.   
  297.     if [ $HIL == yes ] //比较HIL参数设置  
  298.     then  
  299.         set OUTPUT_MODE hil  
  300.         set GPS no  
  301.         if ver hwcmp PX4FMU_V1  
  302.         then  
  303.             set FMU_MODE serial  
  304.         fi  
  305.     fi  
  306.     unset HIL  
  307.   
  308.     # waypoint storage      //存储路径  
  309.     # REBOOTWORK this needs to start in parallel  
  310.     if dataman start  
  311.     then  
  312.     fi  
  313.   
  314.     #  
  315.     # Sensors System (start before Commander so Preflight checks are properly run)  
  316.     #//起飞前传感器检查  
  317.     sh /etc/init.d/rc.sensors//执行rc.sensors(标准的PX4FMU v1, v2, v3传感器启动脚本)  
  318.       
  319.     if [ $GPS == yes ] //检查GPS和GPS_FRAK  
  320.     then  
  321.         if [ $GPS_FAKE == yes ]  
  322.         then  
  323.             echo "[i] Faking GPS"  
  324.             gps start -f  
  325.         else  
  326.             gps start  
  327.         fi  
  328.     fi  
  329.     unset GPS  
  330.     unset GPS_FAKE  
  331.   
  332.     # Needs to be this early for in-air-restarts  
  333.     commander start  //启动commander,类似于任务管理器  
  334.   
  335.     #  
  336.     # Start primary output//以下为一系列判断,再启动如何输出  
  337.     #  
  338.     set TTYS1_BUSY no  
  339.   
  340.     #  
  341.     # Check if UAVCAN is enabled, default to it for ESCs//检查UAVCAN是否使能  
  342.     #  
  343.     if param greater UAVCAN_ENABLE 2 //如果UAVCAN_ENABLE大于2  
  344.     then  
  345.         set OUTPUT_MODE uavcan_esc  
  346.     fi  
  347.   
  348.     # If OUTPUT_MODE == none then something is wrong with setup and we shouldn't try to enable output  
  349.     //如果OUTPUT_MODE == none,那么有问题,不能尝试使能输出  
  350.     if [ $OUTPUT_MODE != none ]  
  351.     then  
  352.         if [ $OUTPUT_MODE == uavcan_esc ]  
  353.         then  
  354.             if param compare UAVCAN_ENABLE 0  
  355.             then  
  356.                 echo "[i] OVERRIDING UAVCAN_ENABLE = 1"  
  357.                 param set UAVCAN_ENABLE 1  
  358.             fi  
  359.         fi  
  360.   
  361.         if [ $OUTPUT_MODE == io -o $OUTPUT_MODE == uavcan_esc ]  
  362.         then  
  363.             if px4io start  
  364.             then  
  365.                 sh /etc/init.d/rc.io//执行rc.io  
  366.             else  
  367.                 echo "ERROR: PX4IO start failed" >> $LOG_FILE  
  368.                 tone_alarm $TUNE_ERR  
  369.             fi  
  370.         fi  
  371.   
  372.         if [ $OUTPUT_MODE == fmu -o $OUTPUT_MODE == ardrone ]  
  373.         then  
  374.             if fmu mode_$FMU_MODE  
  375.             then  
  376.                 echo "[i] FMU mode_$FMU_MODE started"  
  377.             else  
  378.                 echo "[i] ERROR: FMU mode_$FMU_MODE start failed"  
  379.                 echo "ERROR: FMU start failed" >> $LOG_FILE  
  380.                 tone_alarm $TUNE_ERR  
  381.             fi  
  382.   
  383.             if ver hwcmp PX4FMU_V1  
  384.             then  
  385.                 if [ $FMU_MODE == pwm -o $FMU_MODE == gpio ]  
  386.                 then  
  387.                     set TTYS1_BUSY yes  
  388.                 fi  
  389.                 if [ $FMU_MODE == pwm_gpio -o $OUTPUT_MODE == ardrone ]  
  390.                 then  
  391.                     set TTYS1_BUSY yes  
  392.                 fi  
  393.             fi  
  394.         fi  
  395.   
  396.         if [ $OUTPUT_MODE == mkblctrl ]  
  397.         then  
  398.             set MKBLCTRL_ARG ""  
  399.             if [ $MKBLCTRL_MODE == x ]  
  400.             then  
  401.                 set MKBLCTRL_ARG "-mkmode x"  
  402.             fi  
  403.             if [ $MKBLCTRL_MODE == + ]  
  404.             then  
  405.                 set MKBLCTRL_ARG "-mkmode +"  
  406.             fi  
  407.   
  408.             if mkblctrl $MKBLCTRL_ARG  
  409.             then  
  410.                 echo "[i] MK started"  
  411.             else  
  412.                 echo "[i] ERROR: MK start failed"  
  413.                 echo "ERROR: MK start failed" >> $LOG_FILE  
  414.                 tone_alarm $TUNE_ERR  
  415.             fi  
  416.             unset MKBLCTRL_ARG  
  417.         fi  
  418.         unset MK_MODE  
  419.   
  420.         if [ $OUTPUT_MODE == hil ]  
  421.         then  
  422.             if pwm_out_sim mode_port2_pwm8  
  423.             then  
  424.                 echo "[i] PWM SIM output started"  
  425.             else  
  426.                 echo "[i] ERROR: PWM SIM output start failed"  
  427.                 echo "ERROR: PWM SIM output start failed" >> $LOG_FILE  
  428.                 tone_alarm $TUNE_ERR  
  429.             fi  
  430.         fi  
  431.   
  432.         #  
  433.         # Start IO or FMU for RC PPM input if needed//如果需要,则启动IO和FMU接收PPM  
  434.         #  
  435.         if [ $IO_PRESENT == yes ]  
  436.         then  
  437.             if [ $OUTPUT_MODE != io ]  
  438.             then  
  439.                 if px4io start  
  440.                 then  
  441.                     echo "[i] PX4IO started"  
  442.                     sh /etc/init.d/rc.io  
  443.                 else  
  444.                     echo "[i] ERROR: PX4IO start failed"  
  445.                     echo "ERROR: PX4IO start failed" >> $LOG_FILE  
  446.                     tone_alarm $TUNE_ERR  
  447.                 fi  
  448.             fi  
  449.         else  
  450.             if [ $OUTPUT_MODE != fmu -a $OUTPUT_MODE != ardrone ]  
  451.             then  
  452.                 if fmu mode_$FMU_MODE  
  453.                 then  
  454.                     echo "[i] FMU mode_$FMU_MODE started"  
  455.                 else  
  456.                     echo "[i] ERROR: FMU mode_$FMU_MODE start failed"  
  457.                     echo "ERROR: FMU mode_$FMU_MODE start failed" >> $LOG_FILE  
  458.                     tone_alarm $TUNE_ERR  
  459.                 fi  
  460.   
  461.                 if ver hwcmp PX4FMU_V1  
  462.                 then  
  463.                     if [ $FMU_MODE == pwm -o $FMU_MODE == gpio ]  
  464.                     then  
  465.                         set TTYS1_BUSY yes  
  466.                     fi  
  467.                     if [ $FMU_MODE == pwm_gpio -o $OUTPUT_MODE == ardrone ]  
  468.                     then  
  469.                         set TTYS1_BUSY yes  
  470.                     fi  
  471.                 fi  
  472.             fi  
  473.         fi  
  474.     fi  
  475. //以下为mavlink的设置  
  476.     if [ $MAVLINK_F == default ]  
  477.     then  
  478.         # Normal mode, use baudrate 57600 (default) and data rate 1000 bytes/s  
  479.         if [ $TTYS1_BUSY == yes ]  
  480.         then  
  481.             # Start MAVLink on ttyS0, because FMU ttyS1 pins configured as something else  
  482.             set MAVLINK_F "-r 1200 -d /dev/ttyS0"  
  483.   
  484.             # Exit from nsh to free port for mavlink  
  485.             set EXIT_ON_END yes  
  486.         else  
  487.             set MAVLINK_F "-r 1200"  
  488.             # Avoid using ttyS1 for MAVLink on FMUv4  
  489.             if ver hwcmp PX4FMU_V4  
  490.             then  
  491.                 set MAVLINK_F "-r 1200 -d /dev/ttyS1"  
  492.                 # Start MAVLink on Wifi (ESP8266 port)  
  493.                 mavlink start -r 20000 -m config -b 921600 -d /dev/ttyS0  
  494.             fi  
  495.         fi  
  496.     fi  
  497.   
  498.     mavlink start $MAVLINK_F  
  499.     unset MAVLINK_F  
  500.   
  501.     #  
  502.     # MAVLink onboard / TELEM2  
  503.     #  
  504.     if ver hwcmp PX4FMU_V1  
  505.     then  
  506.     else  
  507.         # XXX We need a better way for runtime eval of shell variables,  
  508.         # but this works for now  
  509.         if param compare SYS_COMPANION 921600  
  510.         then  
  511.             mavlink start -d /dev/ttyS2 -b 921600 -m onboard -r 80000 -x  
  512.         fi  
  513.         if param compare SYS_COMPANION 57600  
  514.         then  
  515.             mavlink start -d /dev/ttyS2 -b 57600 -m onboard -r 5000 -x  
  516.         fi  
  517.         if param compare SYS_COMPANION 157600  
  518.         then  
  519.             mavlink start -d /dev/ttyS2 -b 57600 -m osd -r 1000  
  520.         fi  
  521.         if param compare SYS_COMPANION 257600  
  522.         then  
  523.             mavlink start -d /dev/ttyS2 -b 57600 -m magic -r 5000 -x  
  524.         fi  
  525.         if param compare SYS_COMPANION 357600  
  526.         then  
  527.             mavlink start -d /dev/ttyS2 -b 57600 -r 1000  
  528.         fi  
  529.         # Sensors on the PWM interface bank  
  530.         # clear pins 5 and 6  
  531.         if param compare SENS_EN_LL40LS 1  
  532.         then  
  533.             set AUX_MODE pwm4  
  534.         fi  
  535.         if param greater TRIG_MODE 0  
  536.         then  
  537.             # Get FMU driver out of the way  
  538.             set MIXER_AUX none  
  539.             set AUX_MODE none  
  540.             camera_trigger start  
  541.         fi  
  542.     fi  
  543.   
  544.     # Transitional support: Disable safety on all Pixracer boards  
  545.     if ver hwcmp PX4FMU_V4  
  546.     then  
  547.         param set CBRK_IO_SAFETY 22027  
  548.     fi  
  549.   
  550.     #  
  551.     # UAVCAN  
  552.     #  
  553.     sh /etc/init.d/rc.uavcan//执行rc.uavcan,也就是启动rc.uavcan  
  554.   
  555.     #  
  556.     # Logging  
  557.     #  
  558.     sh /etc/init.d/rc.logging//执行rc.logging,也就是启动rc.logging  
  559.   
  560.     #  
  561.     # Start up ARDrone Motor interface  
  562.     #  
  563.     if [ $OUTPUT_MODE == ardrone ]  
  564.     then  
  565.         ardrone_interface start -d /dev/ttyS1  
  566.     fi  
  567.   
  568.     #  
  569.     # Fixed wing setup//固定翼的设置  
  570.     #  
  571.     if [ $VEHICLE_TYPE == fw ]  
  572.     then  
  573.         echo "[i] FIXED WING"  
  574.   
  575.         if [ $MIXER == none ]  
  576.         then  
  577.             # Set default mixer for fixed wing if not defined  
  578.             set MIXER AERT  
  579.         fi  
  580.   
  581.         if [ $MAV_TYPE == none ]  
  582.         then  
  583.             # Use MAV_TYPE = 1 (fixed wing) if not defined  
  584.             set MAV_TYPE 1  
  585.         fi  
  586.   
  587.         param set MAV_TYPE $MAV_TYPE  
  588.   
  589.         # Load mixer and configure outputs  
  590.         sh /etc/init.d/rc.interface//执行rc.interface,配置控制接口  
  591.   
  592.         # Start standard fixedwing apps  
  593.         if [ $LOAD_DAPPS == yes ]  
  594.         then  
  595.             sh /etc/init.d/rc.fw_apps//执行rc.fw_apps,开启姿态和位置估算  
  596.         fi  
  597.     fi  
  598.   
  599.     #  
  600.     # Multicopters setup//多旋翼的设置  
  601.     #  
  602.     if [ $VEHICLE_TYPE == mc ]  
  603.     then  
  604.         echo "[i] MULTICOPTER"  
  605.   
  606.         if [ $MIXER == none ]  
  607.         then  
  608.             echo "Mixer undefined"  
  609.         fi  
  610.   
  611.         if [ $MAV_TYPE == none ]//根据用户的选择,设置MAV_TYPE  
  612.         then  
  613.             # Use mixer to detect vehicle type  
  614.             if [ $MIXER == quad_x -o $MIXER == quad_+ ]  
  615.             then  
  616.                 set MAV_TYPE 2  
  617.             fi  
  618.             if [ $MIXER == quad_w -o $MIXER == sk450_deadcat ]  
  619.             then  
  620.                 set MAV_TYPE 2  
  621.             fi  
  622.             if [ $MIXER == quad_h ]  
  623.             then  
  624.                 set MAV_TYPE 2  
  625.             fi  
  626.             if [ $MIXER == tri_y_yaw- -o $MIXER == tri_y_yaw+ ]  
  627.             then  
  628.                 set MAV_TYPE 15  
  629.             fi  
  630.             if [ $MIXER == hexa_x -o $MIXER == hexa_+ ]  
  631.             then  
  632.                 set MAV_TYPE 13  
  633.             fi  
  634.             if [ $MIXER == hexa_cox ]  
  635.             then  
  636.                 set MAV_TYPE 13  
  637.             fi  
  638.             if [ $MIXER == octo_x -o $MIXER == octo_+ ]  
  639.             then  
  640.                 set MAV_TYPE 14  
  641.             fi  
  642.             if [ $MIXER == octo_cox -o $MIXER == octo_cox_w ]  
  643.             then  
  644.                 set MAV_TYPE 14  
  645.             fi  
  646.         fi  
  647.   
  648.         # Still no MAV_TYPE found//mav的类型没找到  
  649.         if [ $MAV_TYPE == none ]  
  650.         then  
  651.             echo "Unknown MAV_TYPE"  
  652.             param set MAV_TYPE 2  
  653.         else  
  654.             param set MAV_TYPE $MAV_TYPE  
  655.         fi  
  656.   
  657.         # Load mixer and configure outputs  
  658.         sh /etc/init.d/rc.interface//执行rc.interface,配置控制接口  
  659.   
  660.         # Start standard multicopter apps  
  661.         if [ $LOAD_DAPPS == yes ]  
  662.         then  
  663.             sh /etc/init.d/rc.mc_apps// 执行rc.mc_apps,启动姿态位置的估计和控制  
  664.         fi  
  665.     fi  
  666.   
  667.     #  
  668.     # VTOL setup//工具类型设置  
  669.     #  
  670.     if [ $VEHICLE_TYPE == vtol ]  
  671.     then  
  672.         echo "[init] Vehicle type: VTOL"  
  673.   
  674.         if [ $MIXER == none ]  
  675.         then  
  676.             echo "Default mixer for vtol not defined"  
  677.         fi  
  678.   
  679.         if [ $MAV_TYPE == none ]  
  680.         then  
  681.             # Use mixer to detect vehicle type  
  682.             if [ $MIXER == caipirinha_vtol ]  
  683.             then  
  684.                 set MAV_TYPE 19  
  685.             fi  
  686.             if [ $MIXER == firefly6 ]  
  687.             then  
  688.                 set MAV_TYPE 21  
  689.             fi  
  690.             if [ $MIXER == quad_x_pusher_vtol ]  
  691.             then  
  692.                 set MAV_TYPE 22  
  693.             fi  
  694.         fi  
  695.   
  696.         # Still no MAV_TYPE found  
  697.         if [ $MAV_TYPE == none ]  
  698.         then  
  699.             echo "Unknown MAV_TYPE"  
  700.             param set MAV_TYPE 19  
  701.         else  
  702.             param set MAV_TYPE $MAV_TYPE  
  703.         fi  
  704.   
  705.         # Load mixer and configure outputs  
  706.         sh /etc/init.d/rc.interface//执行rc.interface,下载mixer并配置输出  
  707.   
  708.         # Start standard vtol apps  
  709.         if [ $LOAD_DAPPS == yes ]  
  710.         then  
  711.             sh /etc/init.d/rc.vtol_apps//执行rc.vtol_apps,  
  712.                                         //启动attitude_estimator_q start、  
  713.                                         //position_estimator_inav start、  
  714.                                         //vtol_att_control start、  
  715.                                         //mc_att_control start、  
  716.                                         //mc_pos_control start、  
  717.                                         //fw_att_control start、  
  718.                                         //fw_pos_control_l1 start  
  719.         fi  
  720.     fi  
  721.   
  722.     #  
  723.     # Rover setup//漫游设置  
  724.     #  
  725.     if [ $VEHICLE_TYPE == rover ]  
  726.     then  
  727.         # 10 is MAV_TYPE_GROUND_ROVER  
  728.         set MAV_TYPE 10  
  729.   
  730.         # Load mixer and configure outputs  
  731.         sh /etc/init.d/rc.interface//执行rc.interface,下载mixer并配置输出  
  732.   
  733.         # Start standard rover apps  
  734.         if [ $LOAD_DAPPS == yes ]  
  735.         then  
  736.             sh /etc/init.d/rc.axialracing_ax10_apps//ekf_att_pos_estimator start  
  737.         fi  
  738.   
  739.         param set MAV_TYPE 10  
  740.     fi  
  741.   
  742.     unset MIXER  
  743.     unset MAV_TYPE  
  744.     unset OUTPUT_MODE  
  745.   
  746.     #  
  747.     # Start the navigator//启动导航  
  748.     #  
  749.     navigator start  
  750.   
  751.     #  
  752.     # Generic setup (autostart ID not found) //常规设置  
  753.     #  
  754.     if [ $VEHICLE_TYPE == none ]  
  755.     then  
  756.         echo "[i] No autostart ID found"  
  757.   
  758.     fi  
  759.   
  760.     # Start any custom addons   //启动自定义插件  
  761.     set FEXTRAS /fs/microsd/etc/extras.txt  
  762.     if [ -f $FEXTRAS ]  
  763.     then  
  764.         echo "[i] Addons script: $FEXTRAS"  
  765.         sh $FEXTRAS  
  766.     fi  
  767.     unset FEXTRAS  
  768.   
  769.     # Run no SD alarm         //运行没有sd卡的警告  
  770.     if [ $LOG_FILE == /dev/null ]  
  771.     then  
  772.         echo "[i] No microSD card found"  
  773.         # Play SOS  
  774.         tone_alarm error  
  775.     fi  
  776.   
  777. # End of autostart  
  778. fi  
  779.   
  780. # There is no further script processing, so we can free some RAM  
  781. # XXX potentially unset all script variables.  
  782. unset TUNE_ERR  
  783.   
  784. # Boot is complete, inform MAVLink app(s) that the system is now fully up and running  
  785. mavlink boot_complete  
  786.   
  787. # Sensors on the PWM interface bank       
  788. if param compare SENS_EN_LL40LS 1  
  789. then  
  790.     if pwm_input start //启动pwm输入设置  
  791.     then  
  792.         if ll40ls start pwm  
  793.         then  
  794.         fi  
  795.     fi  
  796. fi  
  797.   
  798. if ver hwcmp PX4FMU_V4  
  799. then  
  800.     frsky_telemetry start -d /dev/ttyS6  
  801. fi  
  802.   
  803. if ver hwcmp PX4FMU_V2  
  804. then  
  805.     # Check for flow sensor - as it is a background task, launch it last  
  806.     px4flow start & //如果检测到光流,则启动  
  807. fi  
  808.   
  809. # Start USB shell if no microSD present, MAVLink else //如果没找到sd卡,则启动usb shell,   
  810. if [ $LOG_FILE == /dev/null ]                         //找到了则启动mavlink  
  811. then  
  812.     # Try to get an USB console  
  813.     nshterm /dev/ttyACM0 &  
  814. else  
  815.     mavlink start -r 800000 -d /dev/ttyACM0 -m config -x  
  816. fi  
  817.   
  818. if [ $EXIT_ON_END == yes ]  
  819. then  
  820.     echo "Exit from nsh"  
  821.     exit  
  822. fi  
  823. unset EXIT_ON_END  

 

 

rc.sensors

[cpp] view plain copy

  1. #!nsh  
  2. #  
  3. # Standard startup script for PX4FMU v1, v2, v3 onboard sensor drivers.  
  4. #  
  5.   
  6. if ver hwcmp PX4FMU_V1  //比较px4版本  
  7. then  
  8.     if ms5611 start  
  9.     then  
  10.     fi  
  11. else  
  12.     if ms5611 -s start  
  13.     then  
  14.     fi  
  15.   
  16.     # Blacksheep telemetry  
  17.     if bst start  
  18.     then  
  19.     fi  
  20. fi  
  21.   
  22. if adc start  
  23. then  
  24. fi  
  25.   
  26. if ver hwcmp PX4FMU_V2//比较px4版本  
  27. then  
  28.     # External I2C bus  
  29.     if hmc5883 -C -T -X start   //启动hmc5883  
  30.     then  
  31.     fi  
  32.   
  33.     # Internal I2C bus  
  34.     if hmc5883 -C -T -I -R 4 start  
  35.     then  
  36.     fi  
  37.   
  38.     # external MPU6K is rotated 180 degrees yaw  
  39.     if mpu6000 -X -R 4 start  
  40.     then  
  41.         set BOARD_FMUV3 true  
  42.     else  
  43.         set BOARD_FMUV3 false  
  44.     fi  
  45.   
  46.     if [ $BOARD_FMUV3 == true ]  
  47.     then  
  48.         # external L3GD20H is rotated 180 degrees yaw  
  49.         if l3gd20 -X -R 4 start  
  50.         then  
  51.         fi  
  52.   
  53.         # external LSM303D is rotated 270 degrees yaw  
  54.         if lsm303d -X -R 6 start  
  55.         then  
  56.         fi  
  57.   
  58.         # internal MPU6000 is rotated 180 deg roll, 270 deg yaw  
  59.         if mpu6000 -R 14 start  
  60.         then  
  61.         fi  
  62.   
  63.         if hmc5883 -C -T -S -R 8 start  
  64.         then  
  65.         fi  
  66.   
  67.     else  
  68.         # FMUv2  
  69.         if mpu6000 start  
  70.         then  
  71.         fi  
  72.   
  73.         if l3gd20 start  
  74.         then  
  75.         fi  
  76.   
  77.         if lsm303d start  
  78.         then  
  79.         fi  
  80.     fi  
  81. else  
  82.     if ver hwcmp PX4FMU_V4  
  83.     then  
  84.         # External I2C bus  
  85.         if hmc5883 -C -T -X start  
  86.         then  
  87.         fi  
  88.   
  89.         # Internal SPI bus is rotated 90 deg yaw  
  90.         if hmc5883 -C -T -S -R 2 start  
  91.         then  
  92.         fi  
  93.   
  94.         # Internal SPI bus ICM-20608-G is rotated 90 deg yaw  
  95.         if mpu6000 -R 2 -T 20608 start  
  96.         then  
  97.         fi  
  98.   
  99.         # Internal SPI bus mpu9250 is rotated 90 deg yaw  
  100.         if mpu9250 -R 2 start  
  101.         then  
  102.         fi  
  103.     else  
  104.         # FMUv1  
  105.         if mpu6000 start  
  106.         then  
  107.         fi  
  108.   
  109.         if l3gd20 start  
  110.         then  
  111.         fi  
  112.   
  113.         # MAG selection  
  114.         if param compare SENS_EXT_MAG 2  
  115.         then  
  116.             if hmc5883 -C -I start  
  117.             then  
  118.             fi  
  119.         else  
  120.             # Use only external as primary  
  121.             if param compare SENS_EXT_MAG 1  
  122.             then  
  123.                 if hmc5883 -C -X start  
  124.                 then  
  125.                 fi  
  126.             else  
  127.             # auto-detect the primary, prefer external  
  128.                 if hmc5883 start  
  129.                 then  
  130.                 fi  
  131.             fi  
  132.         fi  
  133.     fi  
  134. fi  
  135.   
  136. if meas_airspeed start  
  137. then  
  138. else  
  139.     if ets_airspeed start  
  140.     then  
  141.     else  
  142.         if ets_airspeed start -b 1  
  143.         then  
  144.         fi  
  145.     fi  
  146. fi  
  147.   
  148. if sf10a start  
  149. then  
  150. fi  
  151.   
  152. # Wait 20 ms for sensors (because we need to wait for the HRT and work queue callbacks to fire)  
  153. usleep 20000  
  154. if sensors start  
  155. then  
  156. fi  

rc.mc_apps

 

[cpp] view plain copy

  1. #!nsh  
  2. #  
  3. # Standard apps for multirotors:  
  4. # att & pos estimator, att & pos control.  
  5. #  
  6.   
  7. # The system is defaulting to INAV_ENABLED = 1  
  8. # but users can alternatively try the EKF-based  
  9. # filter by setting INAV_ENABLED = 0  
  10. //选择姿态位置估计和控制使用的算法,默认INAV_ENABLED = 1,那么  
  11. 姿态估计 Attitude_estimator_q  
  12. 位置估计 position_estimator_inav  
  13. 姿态控制 mc_att_control  
  14. 位置控制 mc_pos_control  
  15. if param compare INAV_ENABLED 1  
  16. then  
  17.     attitude_estimator_q start  
  18.     position_estimator_inav start  
  19. else  
  20.     if param compare LPE_ENABLED 1  
  21.     then  
  22.         attitude_estimator_q start  
  23.         local_position_estimator start  
  24.     else  
  25.         ekf2 start  
  26.     fi  
  27. fi  
  28.   
  29. if mc_att_control start  
  30. then  
  31. else  
  32.     # try the multiplatform version  
  33.     mc_att_control_m start  
  34. fi  
  35.   
  36. if mc_pos_control start  
  37. then  
  38. else  
  39.     # try the multiplatform version  
  40.     mc_pos_control_m start  
  41. fi  
  42.   
  43. #  
  44. # Start Land Detector  
  45. #  
  46. land_detector start multicopter  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4——rcs源码分析 的相关文章

随机推荐

  • Lidar与imu外参标定

    目录 网上资料 方案1 方案2 Lidar与IMU的相对旋转 实现 总结 附录 xff1a 最近由于工作需要 xff0c 花了几天时间了解激光与imu的标定方法 xff1b 因为项目需要 xff0c 且这里是个人认识的一个整理 xff0c
  • ROS的tf包中坐标变换的方法

    1 setRotation函数的参数 在坐标变换的时候常有这样的写法 xff1a tfTutorialsAdding a frame C 43 43 transform setOrigin tf Vector3 0 0 2 0 0 0 tr
  • 转载-自定义ros消息 vector

    原创 xff1a https blog csdn net m zhangjingdong article details 79617966 1 我在ros程序包中新建一个msg文件夹 xff0c 用于存储msg消息相关定义 xff0c 之后
  • 学神的“诞生”-2014清华大学本科生特等奖学金答辩观后感

    清华的特奖与交大的竢实扬华 偶然间在学堂在线上留意到有这样的一场现场答辩 xff0c 很想知道最高学府的最高荣誉花落谁家 xff0c 得此殊荣的又是些怎样的 学神 xff0c 几点感受记录之 1 经历 gt gt 证书 清华的学生更注重大学
  • qt中 美化 问题列表

    1 QTabWidget 中tab xff0c tab bar xff0c pane属性分布 2 使用qss美化时 xff0c tab标签上和pane中都能美化成功 xff0c 但tab最右侧的tab bar却始终没有成功 设置控件的背景
  • AttributeError: module 'cv2.cv2' has no attribute 'createLBPHFaceRecognizer'

    AttributeError module cv2 cv2 has no attribute createLBPHFaceRecognizer 在某一次做人脸识别的小demo的过程中遇到了这个问题 下面直接上产生问题的源代码 span cl
  • CAN总线ACK响应问题

    CAN总线的应答位 xff08 ACK xff09 用来表示节点已经收到有效的帧 任何节点如果准确无误地接收到帧 xff0c 则要向总线上发送显性位 xff0c 该显性位将掩盖发送节点输出的隐性位 xff0c 使总线上表现为显性 如果发送节
  • 嵌入式书籍推荐

    嵌入式书籍推荐 Linux基础 1 Linux与Unix Shell 编程指南 C语言基础 1 C Primer Plus xff0c 5th Edition 美 Stephen Prata着 2 The C Programming Lan
  • 调试中关于__FILE__, __LINE__ 及 __FUNCTION__ 用法

    在C语言中 FILE xff1a 打印相应的文件名 LINE xff1a 打印语句在源代码中相应的行 FUNCTION xff1a 打印语句在源代码中相应的函数名
  • 看技术书籍坚持不下来的,看这里,记录增量学习法

    今天 xff0c 在阅读 软技能 代码之外的生存指南 这本书的过程中 xff0c 学习到了番茄工作法 定额工作法 xff0c 受此启发 xff0c 突然脑海里冒出了一个方法论 xff0c 这是我独创的一个学习方法论 xff0c 我把它称作
  • ubuntu16.04安装realsense2环境与SDK(D435)

    关于realsense2环境的安装以及SDK的使用现在的文档还不是很多 xff0c 就分享下我的过程 xff0c 希望对大家有帮助 我安装是从源码构建的 xff0c 以下是我参考的资料链接 第一个链接是官网 xff0c 我是以它为主 xff
  • C++服务器研发精进

    一袭青衫闯帝都 xff0c 回首已然四春秋 壮志未酬心未老 xff0c 抚膺身衰发已疏 转眼间已经工作四年有余 xff0c 回想刚毕业的懵懂无知 xff0c 仿佛就在昨日 xff0c 成长乎 xff1f 徒增岁月矣 理想中的职业生涯应该是目
  • [kernel 启动流程] (第二章)第一阶段之——设置SVC、关闭中断

    1 kernel启动流程第一阶段简单说明 arch arm kernel head S kernel入口地址对应stext ENTRY stext 1 第一阶段要做的事情 xff0c 也就是stext的实现内容 设置为SVC模式 xff0c
  • opencv 2.4.9编译踩坑笔记

    为了跑GSLAM xff0c 一直遇到opencv版本的问题 xff0c 本机之前是4 1 0 xff0c 作者回答用的版本是opencv2 4 9 xff0c 没办法 xff0c 再装一个 最终我的CMAKE指令 xff1a cmake
  • 如何使用APM固件飞控来使能外部位置控制

    在三维激光雷达平台上我们飞控采用pixhawk2的飞控 官方给我说这个支持APM和PX4的固件 xff0c 但是对APM固件的支持性比较好 xff0c 因此就选用了APM的飞控 在一开始装好飞机后 xff0c 第一次飞还好好的 xff0c
  • CentOS 8中安装docker时报错的解决

    CentOS 8中安装docker时报错的解决 Problem package podman span class token operator span 3 span class token punctuation span 2 span
  • 四旋翼飞行器(QuadCopter--Parrot mini drone)—— 基于模型设计(Model Based Design)

    版权声明 xff1a 本文为博主原创博文 xff0c 未经允许不得转载 xff0c 若要转载 xff0c 请说明出处并给出博文链接 最近一段时间 xff0c 朋友圈被MATLAB禁止哈工大 哈工程等科研院校使用刷屏了 xff0c 顿时各种声
  • VFH & VFH+ & VFH*—— Path Planning

    版权声明 xff1a 本文为博主原创博文 xff0c 未经允许不得转载 xff0c 若要转载 xff0c 请说明出处并给出博文链接 最近在学习VFH算法 xff0c 感觉蛮神奇 xff0c 特意从维基百科扒来了资料 xff0c 供学习研究
  • VFH 2D —— Path Planning

    版权声明 xff1a 本文为博主原创博文 xff0c 未经允许不得转载 xff0c 若要转载 xff0c 请说明出处并给出博文链接 进行路径规划的前提是 xff0c 无人机或机器人自身已经对当前环境有一个清晰的认知 xff08 环境感知 x
  • PX4——rcs源码分析

    注 xff1a 本文转载自 博主 xff1a 虾米一代 博客 xff1a pixhawk原生码rcS分析 代码执行流程 1 编译时将cmake configs nuttx px4fmu v2 default cmake文件中配置的模块全部编