rCS啓動腳本分析

轉載地址:http://wellmakers.com/?p=401

還有一篇很重要的文章,講述了整個系統的大致啓動過程:http://blog.chinaunix.net/uid-29786319-id-4393303.html


rCS腳本文件路徑:/modules/PX4Firmware/ROMFS/px4fmu_common/init.d/rcS    或者  /mk/PX4/ROMFS/init.d/rcS   2個腳本看着都有用,但不清楚具體是哪個。。

官網上說還有一個‘rc.APM’腳本是用來啓動一些線程的,路徑:/mk/PX4/ROMFS/init.d/rc.APM

兩者關係:rc.APM 在 rCS 中啓動;還有rcS是啓動系統,而rrc.APM則是啓動了應用(如傳感器、ADC這些)。

#!nsh
#
# PX4FMU startup script.

#
# Default to auto-start mode. An init script on the microSD card
# can change this to prevent automatic startup of the flight script.
#
#設置啓動模式變量MODE:
set MODE autostart
#設置三個文件路徑,後面會引用:
set RC_FILE /fs/microsd/etc/rc.txt
set CONFIG_FILE /fs/microsd/etc/config.txt
set EXTRAS_FILE /fs/microsd/etc/extras.txt

set TUNE_OUT_ERROR ML<<CP4CP4CP4CP4CP4

#
# Try to mount the microSD card.
#
#掛載SD卡
echo "[init] Looking for microSD...Hello Joy"
if mount -t vfat /dev/mmcsd0 /fs/microsd#判斷是否掛載成功
then#掛載成功
set LOG_FILE /fs/microsd/bootlog.txt
echo "[init] microSD card mounted at /fs/microsd"
# Start playing the startup tune#錯誤報警Module啓動
tone_alarm start
else#掛載失敗
set LOG_FILE /dev/null
echo "[init] No microSD card found"
# Play SOS
#tone_alarm error#報error
fi

#
# Look for an init script on the microSD card.
# Disable autostart if the script found.
#
#查詢microSD卡里是否有啓動腳本
if [ -f $RC_FILE ]#shell -f參數檢測是否存在一個$RC_FILE=/fs/microsd/etc/rc.txt文件,前文有設置$RC_FILE的值
then
echo "[init] Executing init script: $RC_FILE"
sh $RC_FILE#啓動sd卡中的啓動腳本
set MODE custom#啓動模式由autostart變爲自定義custom
else
echo "[init] Init script not found: $RC_FILE"
fi
#---------------關於rc.APM的設置,和我們沒關係,沒使用apm固件------------
# if this is an APM build then there will be a rc.APM script
# from an EXTERNAL_SCRIPTS build option
if [ -f /etc/init.d/rc.APM ]
then
if sercon
then
echo "[init] USB interface connected"
fi

echo "[init] Running rc.APM"
# if APM startup is successful then nsh will exit
sh /etc/init.d/rc.APM
fi
#------------------------APM固件的腳本到此結束-----------------------
#如果模式MODE==autostart,剛好是autostart所以進入條件,只有在sd卡里有rc.txt的時候MODE=custom
if [ $MODE == autostart ]
then
echo "[init] AUTOSTART mode"

#
# Start CDC/ACM serial driver
#
#啓動CDC/ACM串口驅動,電腦會發現串口PX4FMU
sercon

#
# Start the ORB (first app to start)
#
#uorb作爲系統最重要的應用間傳遞消息進程(類似消息-話題機制)需要第一個啓動
uorb start

#
# Load parameters
#
#設置一個PARAM_FILE路徑變量,默認在sd卡里面:
set PARAM_FILE /fs/microsd/params
#如果EEPROM啓動成功,把PARAM_FILE路徑設到EEPROM中:
if mtd start
then
set PARAM_FILE /fs/mtd_params
fi
param select $PARAM_FILE
#從$PARAM_FILE路徑把內容加載進來:
if param load
then
echo "[init] Parameters loaded: $PARAM_FILE"
else
echo "[init] ERROR: Parameters loading failed: $PARAM_FILE"
fi

#
# Start system state indicator
#
#外接高亮rgb LED的應用啓動,不重要:
if rgbled start
then
echo "[init] Using external RGB Led"
else
if blinkm start
then
echo "[init] Using blinkm"
blinkm systemstate
fi
fi

#
# Set default values
#
#又設置一些默認變量,後面的腳本會經常改這些變量和判斷
set HIL no#這個一直是no
set VEHICLE_TYPE none#飛行器類型,後面應該是被該成2了
set MIXER none#後面被改成了FMU_mc_quad_x
set USE_IO yes#被參數設置爲no不使用io板
set OUTPUT_MODE none#後面被改了,這裏是none
set PWM_OUTPUTS none#不一一列舉了
set PWM_RATE none
set PWM_DISARMED none
set PWM_MIN none
set PWM_MAX none
set MKBLCTRL_MODE none
set FMU_MODE pwm
set MAV_TYPE none

#
# Set DO_AUTOCONFIG flag to use it in AUTOSTART scripts
#
#如果SYS_AUTOCONFIG參數是1
if param compare SYS_AUTOCONFIG 1
then
set DO_AUTOCONFIG yes
else
set DO_AUTOCONFIG no
fi

#
# Set parameters and env variables for selected AUTOSTART
#
#如果SYS_AUTOSTART是0
if param compare SYS_AUTOSTART 0
then
echo "[init] Don't try to find autostart script"
else
#啓動rc.autostart腳本
sh /etc/init.d/rc.autostart
#在rc.autostart中主要是對SYS_AUOTSTART值進行判斷,因爲我們設置成了4010,所以會繼續跳轉到執行sh 4010_dji_f330腳本,主要是設置了以下幾個變量和PID參數:
param set MC_ATT_P 7.0
param set MC_ATT_I 0.0
param set MC_ATT_D 0.0
param set MC_ATTRATE_P 0.12
param set MC_ATTRATE_I 0.0
param set MC_ATTRATE_D 0.004
param set MC_YAWPOS_P 2.8
param set MC_YAWPOS_I 0.0
param set MC_YAWPOS_D 0.0
param set MC_YAWRATE_P 0.2
param set MC_YAWRATE_I 0.05
param set MC_YAWRATE_D 0.0
param set MPC_TILT_MAX 0.5
param set MPC_THR_MAX 0.8
param set MPC_THR_MIN 0.2
param set MPC_XY_D 0
param set MPC_XY_P 0.5
param set MPC_XY_VEL_D 0
param set MPC_XY_VEL_I 0
param set MPC_XY_VEL_MAX 3
param set MPC_XY_VEL_P 0.2
param set MPC_Z_D 0
param set MPC_Z_P 1
param set MPC_Z_VEL_D 0
param set MPC_Z_VEL_I 0.1
param set MPC_Z_VEL_MAX 2
param set MPC_Z_VEL_P 0.20
set VEHICLE_TYPE mc
set MIXER FMU_quad_x
set PWM_OUTPUTS 1234
set PWM_RATE 400
# DJI ESC range
set PWM_DISARMED 900
set PWM_MIN 1200
set PWM_MAX 1900

fi

#
# Override parameters from user configuration file
#
if [ -f $CONFIG_FILE ]#如果config.txt存在的話
then
echo "[init] Reading config: $CONFIG_FILE"
sh $CONFIG_FILE#執行裏面的腳本
else
echo "[init] Config file not found: $CONFIG_FILE"
fi

#
# If autoconfig parameter was set, reset it and save parameters
#
if [ $DO_AUTOCONFIG == yes ]#是yes
then
param set SYS_AUTOCONFIG 0#把SYS_AUTOCONFIG清零了!
param save
fi

set IO_PRESENT no #這個標誌經常出現,注意下在這裏被初始化no

#-------------------------------我們是no,後面都不看了-------------------------
if [ $USE_IO == yes ]
then
#
# Check if PX4IO present and update firmware if needed
#
if [ -f /etc/extras/px4io-v2_default.bin ]
then
set IO_FILE /etc/extras/px4io-v2_default.bin
else
set IO_FILE /etc/extras/px4io-v1_default.bin
fi

if px4io checkcrc $IO_FILE
then
echo "[init] PX4IO CRC OK"
echo "PX4IO CRC OK" >> $LOG_FILE

set IO_PRESENT yes
else
echo "[init] Trying to update"
echo "PX4IO Trying to update" >> $LOG_FILE

#tone_alarm MLL32CP8MB #by joy

if px4io forceupdate 14662 $IO_FILE
then
usleep 500000
if px4io checkcrc $IO_FILE
then
echo "[init] PX4IO CRC OK, update successful"
echo "PX4IO CRC OK after updating" >> $LOG_FILE
tone_alarm MLL8CDE

set IO_PRESENT yes
else
echo "[init] ERROR: PX4IO update failed"
echo "PX4IO update failed" >> $LOG_FILE
#tone_alarm $TUNE_OUT_ERROR
fi
else
echo "[init] ERROR: PX4IO update failed"
echo "PX4IO update failed" >> $LOG_FILE
tone_alarm $TUNE_OUT_ERROR
fi
fi

if [ $IO_PRESENT == no ]
then
echo "[init] ERROR: PX4IO not found"
tone_alarm $TUNE_OUT_ERROR
fi
fi
#------------------------------前面幾行都不用看了,沒用上----------------------
#
# Set default output if not set
#
if [ $OUTPUT_MODE == none ]#是none
then
if [ $USE_IO == yes ]#no
then
set OUTPUT_MODE io
else
set OUTPUT_MODE fmu#OUTPUT_MODE=fmu了,這是我們預期的
fi
fi

if [ $OUTPUT_MODE == io -a $IO_PRESENT != yes ]#不符合條件
then
# Need IO for output but it not present, disable output
set OUTPUT_MODE none
echo "[init] ERROR: PX4IO not found, disabling output"

# Avoid using ttyS0 for MAVLink on FMUv1
if hw_ver compare PX4FMU_V1
then
set FMU_MODE serial
fi
fi

if [ $HIL == yes ]#no,跳過
then
set OUTPUT_MODE hil
if hw_ver compare PX4FMU_V1
then
set FMU_MODE serial
fi
else
# Try to get an USB console if not in HIL mode
nshterm /dev/ttyACM0 &
fi

#
# Start the Commander (needs to be this early for in-air-restarts)
#
#飛行狀態進程,standby inair什麼的
commander start

#
# Start primary output
#
set TTYS1_BUSY no#初始化了一個TTYS1_BUSY變量

# If OUTPUT_MODE == none then something is wrong with setup and we shouldn't try to enable output
#如果OUTPUT_MODE只能等於fmu或io如果是none那就完蛋了
if [ $OUTPUT_MODE != none ]
then
if [ $OUTPUT_MODE == io ]#不是io
then
echo "[init] Use PX4IO PWM as primary output"
if px4io start
then
echo "[init] PX4IO started"
sh /etc/init.d/rc.io
else
echo "[init] ERROR: PX4IO start failed"
tone_alarm $TUNE_OUT_ERROR
fi
fi
if [ $OUTPUT_MODE == fmu ]#對了,是fmu
then
echo "[init] Use FMU PWM as primary output"
if fmu mode_$FMU_MODE #$FMU_MODE=pwm 所以此處執行fmu pwm啓動pwm和ppm
then
echo "[init] FMU mode_$FMU_MODE started"
else
echo "[init] ERROR: FMU mode_$FMU_MODE start failed"
tone_alarm $TUNE_OUT_ERROR
fi

if hw_ver compare PX4FMU_V1#判斷板子的版本對不對
then
if [ $FMU_MODE == pwm -o $FMU_MODE == gpio ]
then
set TTYS1_BUSY yes#是YES
fi
if [ $FMU_MODE == pwm_gpio ]
then
set TTYS1_BUSY yes
fi
fi
fi
--------------------------後面一大段又都不要了---------------------
if [ $OUTPUT_MODE == mkblctrl ]
then
echo "[init] Use MKBLCTRL as primary output"
set MKBLCTRL_ARG ""
if [ $MKBLCTRL_MODE == x ]
then
set MKBLCTRL_ARG "-mkmode x"
fi
if [ $MKBLCTRL_MODE == + ]
then
set MKBLCTRL_ARG "-mkmode +"
fi

if mkblctrl $MKBLCTRL_ARG
then
echo "[init] MKBLCTRL started"
else
echo "[init] ERROR: MKBLCTRL start failed"
tone_alarm $TUNE_OUT_ERROR
fi

fi
if [ $OUTPUT_MODE == hil ]
then
echo "[init] Use HIL as primary output"
if hil mode_pwm
then
echo "[init] HIL output started"
else
echo "[init] ERROR: HIL output start failed"
tone_alarm $TUNE_OUT_ERROR
fi
fi

#
# Start IO or FMU for RC PPM input if needed
#
if [ $IO_PRESENT == yes ]
then
if [ $OUTPUT_MODE != io ]
then
if px4io start
then
echo "[init] PX4IO started"
sh /etc/init.d/rc.io
else
echo "[init] ERROR: PX4IO start failed"
tone_alarm $TUNE_OUT_ERROR
fi
fi
else
if [ $OUTPUT_MODE != fmu ]
then
if fmu mode_$FMU_MODE
then
echo "[init] FMU mode_$FMU_MODE started"
else
echo "[init] ERROR: FMU mode_$FMU_MODE start failed"
tone_alarm $TUNE_OUT_ERROR
fi
if hw_ver compare PX4FMU_V1
then
if [ $FMU_MODE == pwm -o $FMU_MODE == gpio ]
then
set TTYS1_BUSY yes
fi
if [ $FMU_MODE == pwm_gpio ]
then
set TTYS1_BUSY yes
fi
fi
fi
fi
fi
--------------------------到此爲止前面的沒有用---------------------
#
# MAVLink
#
set EXIT_ON_END no

if [ $HIL == yes ]#no
then
sleep 1
mavlink start -b 230400 -d /dev/ttyACM0
usleep 5000
else
if [ $TTYS1_BUSY == yes ]#yes
then
# Start MAVLink on ttyS0, because FMU ttyS1 pins configured as something else
mavlink start -d /dev/ttyS0用ttyS0(USART2)啓動mavlink
usleep 5000等一會

# Exit from nsh to free port for mavlink
set EXIT_ON_END yes #設置成yes了腳本最後幾行會判斷他,mark
else#不符合條件,不看了
# Start MAVLink on default port: ttyS1
mavlink start
usleep 5000
fi
fi

#
# Sensors, Logging, GPS
#
啓動了各種傳感器
echo "[init] Start sensors"
sh /etc/init.d/rc.sensors

if [ $HIL == no ]#是no
then
echo "[init] Start logging"
sh /etc/init.d/rc.logging#在裏面啓動了sdlog2 這個module
#終於啓動gps了
echo "[init] Start GPS"
gps start
fi
-----------------------------固定翼設置,又跳過---------------
#
# Fixed wing setup
#
if [ $VEHICLE_TYPE == fw ]
then
echo "[init] Vehicle type: FIXED WING"

if [ $MIXER == none ]
then
# Set default mixer for fixed wing if not defined
set MIXER FMU_AERT
fi

if [ $MAV_TYPE == none ]
then
# Use MAV_TYPE = 1 (fixed wing) if not defined
set MAV_TYPE 1
fi

param set MAV_TYPE $MAV_TYPE

# Load mixer and configure outputs
sh /etc/init.d/rc.interface

# Start standard fixedwing apps
sh /etc/init.d/rc.fw_apps
fi
-----------------------------到此爲止,前面不看---------------
#
# Multicopters setup
#
到了多旋翼設置,這個不能跳
if [ $VEHICLE_TYPE == mc ]是mc
then
echo "[init] Vehicle type: MULTICOPTER"

if [ $MIXER == none ]MIXER==FMU_quad_x
then
# Set default mixer for multicopter if not defined
set MIXER quad_x
fi

if [ $MAV_TYPE == none ]MAV_TYPE是none
then
# Use MAV_TYPE = 2 (quadcopter) if not defined
set MAV_TYPE 2 MAV_TYPE變成2了,這個估計就是地面站顯示的機型

# Use mixer to detect vehicle type
if [ $MIXER == FMU_hex_x -o $MIXER == FMU_hex_+ ]
then
set MAV_TYPE 13
fi
if [ $MIXER == hexa_cox ]
then
set MAV_TYPE 13
fi
if [ $MIXER == FMU_octo_x -o $MIXER == FMU_octo_+ ]
then
set MAV_TYPE 14
fi
if [ $MIXER == FMU_octo_cox ]
then
set MAV_TYPE 14
fi
fi

param set MAV_TYPE $MAV_TYPE最後還把這個參數存了呢!

# Load mixer and configure outputs
sh /etc/init.d/rc.interface
這個rc.interface很重要啊,主要是pwm的設置和接口,還有電機輸出矩陣

# Start standard multicopter apps
sh /etc/init.d/rc.mc_apps
啓動四個算法核心:ekf姿態解算,gps位置解算,姿態控制,導航控制
fi

#
# Generic setup (autostart ID not found)
#
if [ $VEHICLE_TYPE == none ]我們是mc
then
echo "[init] Vehicle type: GENERIC"

# Load mixer and configure outputs
sh /etc/init.d/rc.interface
fi

# Start any custom addons
if [ -f $EXTRAS_FILE ]執行額外的腳本
then
echo "[init] Starting addons script: $EXTRAS_FILE"
sh $EXTRAS_FILE
else
echo "[init] Addons script not found: $EXTRAS_FILE"
fi

if [ $EXIT_ON_END == yes ]因爲TTYS_BUSY是yes前面設了EXIT_ON_END是yes
then
exit直接退出nsh
fi

# End of autostart
fi
完事了!
〈/font〉


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章