PX4启动脚本分析

2023-05-16

启动脚本是一个神奇的东西,它能够识别出你对应的飞机类型,加载对应的混控器,选择对应的姿态、位置估计程序以及控制程序,初始化你需要的驱动程序。下面来分析下。

图片总结

启动代码的分析必定少不了这张图,不知道是谁整理出来的,非常棒!下面的分析会结合源代码rcS以及这张图进行。

图片可能有点大,可以保存图片到本地仔细研究。

代码分析

启动脚本位于Firmware\ROMFS\px4fmu_common\init.d\rcS。不同的版本启动脚本,不过不大部分都差不多

#
# Start CDC/ACM serial driver
# 启动串口驱动
sercon

#
# Default to auto-start mode.
# 默认模式为自动启动
set MODE autostart

set TUNE_ERR ML<<CP4CP4CP4CP4CP4
set LOG_FILE /fs/microsd/bootlog.txt

#
# Try to mount the microSD card.
# 尝试挂载SD卡
# REBOOTWORK this needs to start after the flight control loop
if mount -t vfat /dev/mmcsd0 /fs/microsd
then
	# Start playing the startup tune
	# 挂载成功发出对应的声音
	tone_alarm start
else
	#挂载失败播放对应的音乐并重新挂载
	tone_alarm MBAGP
	if mkfatfs /dev/mmcsd0
	then
		if mount -t vfat /dev/mmcsd0 /fs/microsd
		then
			echo "INFO  [init] MicroSD card formatted"
		else
			echo "ERROR [init] Format failed"
			tone_alarm MNBG
			set LOG_FILE /dev/null
		fi
	else
		set LOG_FILE /dev/null
	fi
fi

 首先启动的串口驱动,然后设置了一些变量,比启动模式为自启动模式,设置日志文件存放的位置。然后挂载SD卡。如果挂载成功则播放对应的提示音,如果挂载失败则播放失败的提示音并重新挂载。

为了看清整个架构这里截图。下面开始查看SD卡中是否有启动脚本,如果有的话则执行启动脚本,并设置模式为custom启动,这样63到996的代码就不会执行了。启动完成之后会清空一些变量,并通过mavlink发送一条消息。下面开始讲述自动启动的流程。

	#
	# Start the ORB (first app to start)
	# 启动UORB
	uorb start

	#
	# Load parameters
	# 加载参数
	set PARAM_FILE /fs/microsd/params
	if mtd start
	then
		set PARAM_FILE /fs/mtd_params
	fi

	param select $PARAM_FILE
	if param load
	then
	else
		#加载失败了则reset参数
		if param reset
		then
		fi
	fi

	#
	# Start system state indicator
	# 启动系统的LED等
	if rgbled start
	then
	else
		if blinkm start
		then
			blinkm systemstate
		fi
	fi

	# Currently unused, but might be useful down the road
	#if pca8574 start
	#then
	#fi

 这里完成uorb的启动、参数的加载、系统LED的启动等操作。

	# Set AUTOCNF flag to use it in AUTOSTART scripts
	# 该参数默认为0.为1的话表示复位除RC以外的参数
	if param compare SYS_AUTOCONFIG 1
	then
		# Wipe out params except RC*
		param reset_nostart RC*
		set AUTOCNF yes
	else
		set AUTOCNF no

		#
		# Release 1.4.0 transitional support:
		# set to old default if unconfigured.
		# this preserves the previous behaviour
		# 检查下BAT_N_CELLS,如果为0,设置成默认的3
		if param compare BAT_N_CELLS 0
		then
			param set BAT_N_CELLS 3
		fi
	fi

	#
	# Set default values
	# 设置一些默认值
	set HIL no
	set VEHICLE_TYPE none
	set MIXER none
	set MIXER_AUX none
	set OUTPUT_MODE none
	set PWM_OUT none
	set PWM_RATE none
	set PWM_DISARMED none
	set PWM_MIN none
	set PWM_MAX none
	set PWM_AUX_OUT none
	set PWM_AUX_RATE none
	set PWM_ACHDIS none
	set PWM_AUX_DISARMED none
	set PWM_AUX_MIN none
	set PWM_AUX_MAX none
	set FAILSAFE_AUX none
	set MK_MODE none
	set FMU_MODE pwm
	set AUX_MODE pwm
	set MAVLINK_F default
	set MAVLINK_COMPANION_DEVICE /dev/ttyS2
	set EXIT_ON_END no
	set MAV_TYPE none
	set FAILSAFE none
	set USE_IO yes

 这里主要完成对一些参数的默认值设置。下面的分析简要的就略过好了,分析一些比较有用的代码。

	#
	# Set parameters and env variables for selected AUTOSTART
	# 
	if param compare SYS_AUTOSTART 0
	then
	else
		#执行自启动脚本
		#启动脚本里根据启动代号选择对应的程序,程序和ROMFS/px4fmu_common/init.d/目录下
		#的机型文件一样,这些程序会运行对应的脚本,比如rc.fw_default,rc.mc_default
		#同时选择对应的混控器
		sh /etc/init.d/rc.autostart
	fi
	unset MODE

这里执行rc.autostart脚本,启动脚本里根据启动代号选择对应的程序,程序和ROMFS/px4fmu_common/init.d/目录下的机型文件一样,比如4011_dji_f450、3033_wingwing等脚本,在这些脚本里面主要选择对应机型的混控器,设置PID的参数,设置PWM的通道数、DISARMED值等等,最主要的是会运行对应机型的,比如rc.fw_default(固定翼),rc.mc_default(旋翼)。在rc.fw_default脚本里面,会设置一些其他参数,比如飞机类型、返航高度、PWM的频率、占空比最小值、最大值等等。

	# Override parameters from user configuration file
	# 从用户配置文件中重写参数
	set FCONFIG /fs/microsd/etc/config.txt
	if [ -f $FCONFIG ]
	then
		echo "Custom: $FCONFIG"
		sh $FCONFIG
	fi
	unset FCONFIG

	#
	# If autoconfig parameter was set, reset it and save parameters
	# 如果autoconfig参数设置了的话,则重设参数
	if [ $AUTOCNF == yes ]
	then
		param set SYS_AUTOCONFIG 0
	fi
	unset AUTOCNF

	set IO_PRESENT no
	#USER_IO是飞控中的协处理器
	if [ $USE_IO == yes ]
	then
		#
		# Check if PX4IO present and update firmware if needed
		# 检查PX4io是否启动并更新固件
		if [ -f /etc/extras/px4io-v2.bin ]
		then
			set IO_FILE /etc/extras/px4io-v2.bin
		else
			set IO_FILE /etc/extras/px4io-v1.bin
		fi
		#启动PX4io并进行CRC校验
		if px4io checkcrc ${IO_FILE}
		then
			echo "[init] PX4IO CRC OK" >> $LOG_FILE

			set IO_PRESENT yes
		else
			#校验不通过说明CPU的程序是第一次烧写或者有更新
			tone_alarm MLL32CP8MB

			#启动px4io,,基于安全考虑关掉PWM
			if px4io start
			then
				# try to safe px4 io so motor outputs dont go crazy
				if px4io safety_on
				then
					# success! no-op
				else
					# px4io did not respond to the safety command
					px4io stop
				fi
			fi

			if px4io forceupdate 14662 ${IO_FILE}
			then
				usleep 500000
				if px4io checkcrc $IO_FILE
				then
					echo "PX4IO CRC OK after updating" >> $LOG_FILE
					tone_alarm MLL8CDE

					set IO_PRESENT yes
				else
					echo "PX4IO update failed" >> $LOG_FILE
					tone_alarm $TUNE_ERR
				fi
			else
				echo "PX4IO update failed" >> $LOG_FILE
				tone_alarm $TUNE_ERR
			fi
		fi
		unset IO_FILE

		if [ $IO_PRESENT == no ]
		then
			echo "PX4IO not found" >> $LOG_FILE
			tone_alarm $TUNE_ERR
		fi
	fi

 这里会重设一些参数,同时启动协处理器,检查CPU的程序是否是第一次烧写或者有更新。

	# waypoint storage
	# REBOOTWORK this needs to start in parallel
	# 启动简易数据服务,为航迹规划、电子围栏提供支持
	if dataman start
	then
	fi

	#
	# Sensors System (start before Commander so Preflight checks are properly run)
	# 传感器系统启动
	sh /etc/init.d/rc.sensors

	# Needs to be this early for in-air-restarts
	# 启动commander
	if [ $OUTPUT_MODE == hil ]
	then
	    commander start -hil
	else
	    commander start
	fi

	#
	# Start CPU load monitor
	# 启动CPU负载监视器
	load_mon start

这里的功能和注释上写的一样。主要的有传感器的启动,这里的启动脚本和 Firmware\ROMFS\px4fmu_common\init.d\ rc.sensors脚本一样,主要完成传感器的初始化,比如气压计、加速度计、陀螺仪等等。

	#看看是否有必要启动光流
	if ver hwcmp PX4FMU_V2
	then
		# Check for flow sensor - as it is a background task, launch it last
		px4flow start &
	fi

	if ver hwcmp PX4FMU_V4
	then
		# Check for flow sensor - as it is a background task, launch it last
		px4flow start &
	fi

	if ver hwcmp MINDPX_V2
	then
		px4flow start &
	fi

	# Start MAVLink
	# 启动USB转串口的mavlink
	mavlink start -r 800000 -d /dev/ttyACM0 -m config -x

	#
	# Logging
	# 启动日志
	if ver hwcmp PX4FMU_V1
	then
		if sdlog2 start -r 30 -a -b 2 -t
		then
		fi
	else
		if param compare SYS_LOGGER 0
		then
			# check if we should increase logging rate for ekf2 replay message logging
			if param greater EKF2_REC_RPL 0
			then
				if sdlog2 start -r 500 -e -b 18 -t
				then
				fi
			else
				if sdlog2 start -r 100 -a -b 9 -t
				then
				fi
			fi
		else
			set LOGGER_ARGS ""
			if param compare SDLOG_MODE 1
			then
				set LOGGER_ARGS "-e"
			fi
			if param compare SDLOG_MODE 2
			then
				set LOGGER_ARGS "-f"
			fi

			if logger start -b 12 -t $LOGGER_ARGS
			then
			fi
			unset LOGGER_ARGS
		fi
	fi

然后启动光流、启动日志、启动mavlink

 

	#
	# Fixed wing setup
	# 固定翼设置
	if [ $VEHICLE_TYPE == fw ]
	then
		if [ $MIXER == none ]
		then
			# Set default mixer for fixed wing if not defined
			set MIXER 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
		# 加载混控器以及配置PWM输出
		sh /etc/init.d/rc.interface

		# Start standard fixedwing apps
		# 启动固定翼需要的应用程序,包含姿态、位置估计,姿态、位置控制
		sh /etc/init.d/rc.fw_apps
	fi

接下来根据飞机是固定翼、旋翼、直升机等,选择性的执行代码,比如这里如果是固定翼,会执行rc.interface脚本,它主要完成混控器的 设置和PWM输出等功能。然后执行rc.fw_apps脚本,这里里面会启动固定翼对应的姿态、位置估计程序和控制程序,着陆检测等

同理其他飞机类型,比如旋翼、直升机的流程也差不多,最后启动通用的导航程序。到这里就大致的分析完了。

参考资料

1、shell脚本学习

2、CFZ明大佬的分析

3、虾米大佬的分析

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4启动脚本分析 的相关文章

随机推荐