PX4——rcs源碼分析

注:本文轉載自——  博主:蝦米一代      博客:《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  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章