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<

#
# 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〉


你可能感兴趣的:(PIXHAWK)