rCS启动脚本分析

PX4飞行控制系统启动流程详解

转载地址: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〉


The "RCS Commander" (RCS = Remote Control System) tool supports you in your day-to-day work with SINUMERIK solution line control systems. The "RCS Commander" tool makes it easy to manage files on your PC and on SINUMERIK solution line control systems. The "RCS Commander" tool offers the following functions: Exchanging data between the SINUMERIK and your PC. Generating and restoring an image from the CompactFlash Card of your control system to save data. Writing images to a CompactFlash Card. Loading commissioning files directly to the control system and from the control system to your PC. This function is used to support commissioning. Managing the control system's NC data. You can copy files directly from the PC to the NC and from the NC to the PC. Monitoring processes and remote control of the SINUMERIK via a remote control function. Saving the control system's current HMI view as a screen on your PC. This function is used to represent your control system and improves support in the event of an error. Editing the following user files in the OFFLINE mode on the PC: PLC alarm texts (oem_alarms_plc) Cycle alarm texts (oem_alarms_cycles) Part program messages (oem_partprogram_messages) EasyScreen files Tool management texts EasyExtend files (oem_aggregate) Maintenance planner files (oem_maintenance) Managing user files with the following options: Creating a project OFFLINE. Create a project, which automatically copied the files from the control. Copy individual files using project dialog to the control system or copy from the control system into the project. Delete user files using project dialog on the control
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值