PX4之启动脚本

news2024/10/5 21:25:42

PX4通过rcS脚本来设定需要启动的程序,比如设备驱动、控制模块、数据通信等。rcS脚本在项目中的文件位置

ROMFS/px4fmu_common/rcS

对应硬件平台固件上的位置

/etc/init.d/rcS

启动脚本流程如下

#!/bin/sh
# PX4FMU startup script.
# 
# 一些注释
#

# 设置默认参数
set R /						#根目录
set AUTOCNF no
set FCONFIG /fs/microsd/etc/config.txt		#SD卡上的设置脚本
set FEXTRAS /fs/microsd/etc/extras.txt		#SD卡上的附加脚本
set FRC /fs/microsd/etc/rc.txt				#SD卡上启动脚本,如果有的话运行这个脚本
set IOFW "/etc/extras/px4_io-v2_default.bin"	#固件文件,如果有的话,自动刷新
set IO_PRESENT no
set LOGGER_ARGS ""
set LOGGER_BUF 8
set MAV_TYPE none			#飞行器类型,这里未设定
set MIXER none
set MIXER_AUX none
set MIXER_FILE none
set MIXER_EXTRA none
set OUTPUT_MODE none
set PARAM_FILE ""			#参数文件,未设定
set PWM_OUT none
set PWM_MAIN_RATE p:PWM_MAIN_RATE
set PWM_AUX_OUT none
set PWM_AUX_RATE p:PWM_AUX_RATE
set PWM_EXTRA_OUT none
set PWM_EXTRA_RATE p:PWM_EXTRA_RATE
set EXTRA_MIXER_MODE none
set RC_INPUT_ARGS ""
set SDCARD_AVAILABLE no
set SDCARD_EXT_PATH /fs/microsd/ext_autostart
set SDCARD_FORMAT no
set SDCARD_MIXERS_PATH /fs/microsd/etc/mixers
set STARTUP_TUNE 1
set USE_IO no
set VEHICLE_TYPE none

#打印系统信息
ver all

# 载入SD卡
if [ -b "/dev/mmcsd0" ]
then
	if mount -t vfat /dev/mmcsd0 /fs/microsd		#mount
	then
		if [ -f "/fs/microsd/.format" ]
		then
			echo "INFO [init] format /dev/mmcsd0 requested (/fs/microsd/.format)"
			set SDCARD_FORMAT yes
			rm /fs/microsd/.format
			umount /fs/microsd

		else
			set SDCARD_AVAILABLE yes
		fi
	fi

	if [ $SDCARD_AVAILABLE = no -o $SDCARD_FORMAT = yes ]
	then
		echo "INFO [init] formatting /dev/mmcsd0"
		set STARTUP_TUNE 15 # tune 15 = SD_ERROR (overridden to SD_INIT if format + mount succeeds)

		if mkfatfs -F 32 /dev/mmcsd0
		then
			echo "INFO [init] card formatted"

			if mount -t vfat /dev/mmcsd0 /fs/microsd
			then
				set SDCARD_AVAILABLE yes
				set STARTUP_TUNE 14 # tune 14 = SD_INIT
			else
				echo "ERROR [init] card mount failed"
			fi
		else
			echo "ERROR [init] format failed"
		fi
	fi

	if [ $SDCARD_AVAILABLE = yes ]
	then
		if hardfault_log check
		then
			set STARTUP_TUNE 2 # tune 2 = ERROR_TUNE
			if hardfault_log commit
			then
				hardfault_log reset
			fi
		fi
	fi

	set PARAM_FILE /fs/microsd/params			#载入成功的情况下,设置参数文件为/fs/microsd/params
fi

# 查看SD卡上的启动脚本,如果有的话启动SD卡上的脚本,没有的话启动默认脚本
if [ -f $FRC ]
then
	. $FRC
else
	# 默认启动脚本
	
	# 查询MTD设备,挂载SPI-EEPROM,如果有的话设置从mtd设备载入参数
	if mft query -q -k MTD -s MTD_PARAMETERS -v /fs/mtd_params
	then
		set PARAM_FILE /fs/mtd_params
	fi

	# 载入参数,如果有板载校正数据
	if mft query -q -k MTD -s MTD_CALDATA -v /fs/mtd_caldata
	then
		param load /fs/mtd_caldata
	fi

	# 从PARAM_FILE载入参数
	param select $PARAM_FILE
	if ! param import
	then
		echo "ERROR [init] param import failed"
		set STARTUP_TUNE 2 # tune 2 = ERROR_TUNE

		param dump $PARAM_FILE

		if [ -d "/fs/microsd" ]
		then
			dmesg >> /fs/microsd/param_import_fail.txt &

			# try to make a backup copy
			cp $PARAM_FILE /fs/microsd/param_import_fail.bson &
		fi

		# try importing from backup file
		if [ -f "/fs/microsd/parameters_backup.bson" ]
		then
			echo "[init] importing from parameter backup"

			# dump current backup file contents for comparison
			param dump /fs/microsd/parameters_backup.bson

			param import /fs/microsd/parameters_backup.bson
		fi
	fi

	if [ $SDCARD_AVAILABLE = yes ]
	then
		param select-backup /fs/microsd/parameters_backup.bson
	fi

	# 如果硬件版本为V5X或V6X,启动网络管理程序
	if ver hwcmp PX4_FMU_V5X PX4_FMU_V6X
	then
		netman update -i eth0
	fi

	# 如果自动配置不为0,重设一系列参数
	# SYS_AUTOCONFIG定义针对某一机型的自动参数设置,如DJI-F330, DJI-F450, 3DR SOLO等,都有一个对应的数字,具体可以查看/etc/init.d目录下的脚本,或者项目目录ROMFS/px4fmu_common/init.d/airframes目录下的脚本
	if param greater SYS_AUTOCONFIG 0
	then
		# Wipe out params except RC*, flight modes, total flight time, calibration parameters, next flight UUID
		param reset_all SYS_AUTO* RC* COM_FLTMODE* LND_FLIGHT* TC_* CAL_ACC* CAL_GYRO* COM_FLIGHT*
		set AUTOCNF yes
	fi

	# 板载架构配置脚本(可选)
	set BOARD_ARCH_RC_DEFAULTS ${R}etc/init.d/rc.board_arch_defaults
	if [ -f $BOARD_ARCH_RC_DEFAULTS ]
	then
		echo "Board architecture defaults: ${BOARD_ARCH_RC_DEFAULTS}"
		. $BOARD_ARCH_RC_DEFAULTS
	fi
	unset BOARD_ARCH_RC_DEFAULTS

	# 板载配置脚本(可选)
	set BOARD_RC_DEFAULTS ${R}etc/init.d/rc.board_defaults
	if [ -f $BOARD_RC_DEFAULTS ]
	then
		echo "Board defaults: ${BOARD_RC_DEFAULTS}"
		. $BOARD_RC_DEFAULTS
	fi
	unset BOARD_RC_DEFAULTS

	# 启动声调报警模块
	tone_alarm start

	# 启动数据管理模块,根据源代码注释,也包含路径点存储(waypoints storage)
	if param compare SYS_DM_BACKEND 1
	then
		dataman start -r
	else
		if param compare SYS_DM_BACKEND 0
		then
			# dataman start default
			dataman start
		fi
	fi

	# 启动socket通讯和事件发送模块
	send_event start

	# 启动资源载入监控
	load_mon start

	# 启动灯闪控制模块
	rgbled start -X -q
	rgbled_ncp5623c start -X -q

	# 运行自动配置脚本,自动配置脚本中,根据SYS_AUTOSTART数值运行对应机型的参数配置
	set AUTOSTART_PATH etc/init.d/rc.autostart
	if ! param compare SYS_AUTOSTART 0
	then
		if param greater SYS_AUTOSTART 1000000
		then
			# Use external startup file
			if [ $SDCARD_AVAILABLE = yes ]
			then
				set AUTOSTART_PATH etc/init.d/rc.autostart_ext
			else
				echo "ERROR [init] SD card not mounted - trying to load airframe from ROMFS"
			fi
		fi
		. ${R}$AUTOSTART_PATH
	fi
	unset AUTOSTART_PATH

	# 运行SD卡上的用户配置文件,FCONFIG在前面定义,指向SD卡上的配置文件
	if [ -f $FCONFIG ]
	then
		echo "Custom: ${FCONFIG}"
		. $FCONFIG
	fi

	# 如果AUTOCNF已经设置,SYS_AUTOCONFIG置零
	if [ $AUTOCNF = yes ]
	then
		param set SYS_AUTOCONFIG 0
	fi

	# 如果设置了UAVCAN_ENABLE,启动CAN总线控制
	if param greater -s UAVCAN_ENABLE 0
	then
		if uavcan start
		then
			if param greater UAVCAN_ENABLE 2
			then
				set OUTPUT_MODE uavcan_esc
			fi
		else
			tune_control play error
		fi
	else
		if param greater -s UAVCAN_V1_ENABLE 0
		then
			uavcan_v1 start
		fi
	fi

	# 检查PX4IO以及是否需要更新固件
	if [ -f $IOFW ]
	then
		# Check for the mini using build with px4io fw file
		# but not a px4IO
		if ver hwtypecmp V540 V560
		then
			param set SYS_USE_IO 0
		else
			if px4io checkcrc ${IOFW}
			then
				set IO_PRESENT yes
			else
				# tune Program PX4IO
				tune_control play -t 16 # tune 16 = PROG_PX4IO

				if px4io update ${IOFW}
				then
					usleep 10000
					tune_control stop
					if px4io checkcrc ${IOFW}
					then
						tune_control play -t 17 # tune 17 = PROG_PX4IO_OK
						set IO_PRESENT yes
					else
						tune_control play -t 18 # tune 18 = PROG_PX4IO_ERR
					fi
				else
					tune_control stop
				fi
			fi
		fi
	fi

	if param compare -s SYS_USE_IO 1
	then
		set USE_IO yes
	fi

	if [ $USE_IO = yes -a $IO_PRESENT = no ]
	then
		echo "PX4IO not found"
		set STARTUP_TUNE 2 # tune 2 = ERROR_TUNE
	fi

	# 启动RC更新(把RC输入映射到手动控制)
	rc_update start

	#启动手动控制模块
	manual_control start

	# 启动传感器程序,启动commander模块
	if param greater SYS_HITL 0
	then
		set OUTPUT_MODE hil
		sensors start -h
		commander start -h
		# disable GPS
		param set GPS_1_CONFIG 0

		# start the simulator in hardware if needed
		if param compare SYS_HITL 2
		then
			sih start
		fi
	else
		set BOARD_RC_SENSORS ${R}etc/init.d/rc.board_sensors
		if [ -f $BOARD_RC_SENSORS ]
		then
			echo "Board sensors: ${BOARD_RC_SENSORS}"
			. $BOARD_RC_SENSORS
		fi
		unset BOARD_RC_SENSORS

		. ${R}etc/init.d/rc.sensors

		if param compare -s BAT1_SOURCE 2
		then
			esc_battery start
		fi

		if ! param compare BAT1_SOURCE 1
		then
			battery_status start
		fi

		commander start
	fi

	# 启动磁偏估计
	if param compare -s MBE_ENABLE 1
	then
		mag_bias_estimator start
	fi

	# 启动摄像头相关程序
	if param greater -s TRIG_MODE 0
	then
		camera_trigger start
		camera_feedback start
	fi

	# 启动板载mavlink流(可选)
	set BOARD_RC_MAVLINK ${R}etc/init.d/rc.board_mavlink
	if [ -f $BOARD_RC_MAVLINK ]
	then
		echo "Board mavlink: ${BOARD_RC_MAVLINK}"
		. $BOARD_RC_MAVLINK
	fi
	unset BOARD_RC_MAVLINK

	# 启动UART/串口驱动程序
	. ${R}etc/init.d/rc.serial

	if [ $IO_PRESENT = no ]
	then
		# Must be started after the serial config is read
		rc_input start $RC_INPUT_ARGS
	fi

	# 启动PPS输入驱动
	if param greater -s PPS_CAP_ENABLE 0
	then
		pps_capture start
	fi

	# 启动摄像头拍摄模块
	if param greater -s CAM_CAP_FBACK 0
	then
		if camera_capture start
		then
			camera_capture on
		fi
	fi

	# 运行rc.vehicle_setup
	# rc.vehicle_setup脚本中运行接口程序(rc.interface)和飞行器应用程序(rc.mc_apps)(以多轴飞行器为例)
	# 其中rc.interface中启动电机PWM控制程序pwm_out和载入输出配置mixer文件,类似
	#		pwm_out start			- 启动PWM输出程序
	#		mixer load ...			- 载入PWM输出配置文件
	# rc.mc_apps启动飞行器相关主要控制程序,包括
	#		attitude_estimate_q		- 姿态估计
	#		ekf2					- 卡尔曼滤波
	#		mc_att_control			- 姿态控制
	#		mc_rate_control			- 速度控制
	#		mc_pos_control			- 位置控制
	#		land_detector			- 着陆检测
	# 等
	
	. ${R}etc/init.d/rc.vehicle_setup

	# 播放启动提示音
	param compare CBRK_BUZZER 782090
	if [ "$?" != "0" -o "$STARTUP_TUNE" != "1" ]
	then
		tune_control play -t $STARTUP_TUNE
	fi

	# 启动导航模块
	navigator start

	# 启动热校正(thermal calibration)程序
	. ${R}etc/init.d/rc.thermal_cal

	# 启动vmount, px4flow, bst等模块
	if param greater -s MNT_MODE_IN -1
	then
		vmount start
	fi

	if param compare -s SENS_EN_PX4FLOW 1
	then
		px4flow start -X
	fi

	# Blacksheep telemetry
	if param compare -s TEL_BST_EN 1
	then
		bst start -X
	fi

	# 启动陀螺仪滤波、校正等相关程序
	if param compare -s IMU_GYRO_FFT_EN 1
	then
		gyro_fft start
	fi

	if param compare -s IMU_GYRO_CAL_EN 1
	then
		gyro_calibration start
	fi

	# 启动附加板载脚本
	set BOARD_RC_EXTRAS ${R}etc/init.d/rc.board_extras
	if [ -f $BOARD_RC_EXTRAS ]
	then
		echo "Board extras: ${BOARD_RC_EXTRAS}"
		. $BOARD_RC_EXTRAS
	fi
	unset BOARD_RC_EXTRAS

	# 启动SD卡俯加脚本
	if [ -f $FEXTRAS ]
	then
		echo "Addons script: ${FEXTRAS}"
		. $FEXTRAS
	fi

	# 启动数据记录
	. ${R}etc/init.d/rc.logging

	# 启动AUTOSTART后处理程序
	if ! param compare SYS_AUTOSTART 0
	then
		. ${R}etc/init.d/rc.autostart.post
	fi

	# 启动板载bootloader升级程序
	set BOARD_BOOTLOADER_UPGRADE ${R}etc/init.d/rc.board_bootloader_upgrade
	if [ -f $BOARD_BOOTLOADER_UPGRADE ]
	then
		sh $BOARD_BOOTLOADER_UPGRADE
	fi
	unset BOARD_BOOTLOADER_UPGRADE
fi

# 清除参数设置
unset R
unset AUTOCNF
unset FCONFIG
unset FEXTRAS
unset FRC
unset IO_PRESENT
unset IOFW
unset LOGGER_ARGS
unset LOGGER_BUF
unset MAV_TYPE
unset MIXER
unset MIXER_AUX
unset MIXER_FILE
unset OUTPUT_MODE
unset PARAM_FILE
unset PWM_AUX_OUT
unset PWM_AUX_RATE
unset PWM_MAIN_RATE
unset PWM_OUT
unset PWM_EXTRA_OUT
unset PWM_EXTRA_RATE
unset RC_INPUT_ARGS
unset SDCARD_AVAILABLE
unset SDCARD_EXT_PATH
unset SDCARD_FORMAT
unset SDCARD_MIXERS_PATH
unset STARTUP_TUNE
unset USE_IO
unset VEHICLE_TYPE

# 通知mavlink启动完成
mavlink boot_complete

启动的过程按图示大致如下(当前版本)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

其中黄色部分为SD卡自定义脚本,蓝色部分为控制相关程序,紫色部分为机型相关自动配置程序,绿色部分为算法程序。

总结主要的点有:

1 程序启动首先Load SD卡,如果SD卡上有自定义启动脚本,就运行SD卡上的脚本,如果没有(默认情况),运行板载自动启动流程
2 机型相关的参数配置通过SYS_AUTOSTART值来定义,通过设置这个值,可以自动载入某一机型对应的参数(如DJI 450,3DR SOLO等)
3 飞行控制相关程序在commander,rc.vehicle_setup,navigator等模块或脚本启动,主要的飞控相关模块有
rc_input - 遥控输入
commander - 命令处理
navigator - 导航
pos_control - 位置控制
att_control - 姿态控制
pwm_out - 电机输出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HDFS】FsDatasetImpl#convertTemporaryToRbw方法

功能: 把一个temporary副本转换成RBW副本。 方法的参数: 正在被转换成Rbw状态的的Temporary状态副本。 调用场景: datanode接收一个块的数据完成时,如果stage处于BlockConstructionStage.TRANSFER_RBW,那么就需要把temporary副本转换成RBW类型副本。 注意点: TEMPORARY副…

python 打包EXE

注: 从个人博客园 移植而来 环境: Windows7 Python 2.7 参考: 使用pyinstaller打包python程序 Pyinstaller 打包发布经验总结 Using PyInstaller 简介 使用python引用第三方的各种模块编写一个工具后,如果想发给其他人&…

Python基础-环境安装

Python安装1.下载PythonPython网址:https://www.python.org/进入Python官网,点击Downloads,选择自己对应的操作系统(此处以Windows为例)在左侧的稳定发行版中,选择一个3.5版本以上的,然后点击对…

2003-Can‘t connect to MySQL server on ‘192.168.232.128(10060 “Unknown error“)

MySQL远程连接报错2003-cant connection to mysql server on ‘IP’(10061 unknown error)的解决 **首先去看有没有关闭防火墙!!!** 停止firewall服务 systemctl stop firewalld.service 禁止firewall开机启动 syste…

C++的完美讲解,还不快来看看?

目录 简介: 创建C程序: Windows编译简介: Hello,C World! 简介: C融合了3中不同的编程传统:C语言代表的过程性传统、C在C语言基础上添加的类代表的面向对象语言的传统以及C模板支持的通用编程传统。一般来说,计算机语言…

揭开JavaWeb中Cookie与Session的神秘面纱

文章目录1,会话跟踪技术的概述2,Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3,Session3.1 Session的基本使用3.2 Session的原理分析3.3 Session的使用细节3.3.1 Session…

数据结构与算法系列之kmp算法

什么是kmp算法 1.kmp算法是一种改进的字符串算法,其核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数已达到快速匹配的目的。 它主要实现作用的是 在 (主串)中找到 (匹配)字符串。 例 BF算法与k…

接口服务限流方案

一.限流方式1.中间件支持限流2.限流配置单台服务最大qps,通过令牌桶算法进行限流3.支持url前缀匹配二.配置1.文件配置qps 1000 //单台服务最大qpsrule "/ucenter" //限流识别前缀,如不配置为全局限流downgradeHttpStatus 200//降级方案返回…

PointNet++的源码运行

首先,从github上下载源码https://github.com/yanx27/Pointnet_Pointnet2_pytorch也可以从百度网盘下载链接:https://pan.baidu.com/s/1sgTYuqnBVC9p3bib450SOQ 提取码:gujd再下载对应的测试数据分类数据modelnet40_normal_resampled下载&…

UnRaid虚拟机安装OpenWrt软路由

文章目录0、前言1、Openwrt虚拟机安装1.1、前提,需要先在UnRaid中开启虚拟机:1.2、下载OpenWrt虚拟机镜像并上传至UnRaid共享文件夹1.3、创建OpenWrt虚拟机2、开启并设置OpenWrt虚拟机2.1、修改OpenWrt管理ip2.2、OpenWrt的上网设置0、前言 最近折腾了很…

扁桃体肥大对儿童有什么影响?怎么办及怎样才能消下去?

很多人不知道扁桃体肥大对孩子有什么影响。今天,李松培医生将向大家讲解这方面的知识。同时,他还将告诉大家如何消除扁桃体肥大扁桃体肥大对儿童有什么影响:事实上,说实话,扁桃体肥大对儿童的影响很大,因为…

最全Linux驱动开发全流程详细解析(持续更新)

Linux驱动开发详细解析 一、驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁。 具体任务 读写设备寄存器(实现控制的方式)完成设备的轮询、中断处理、DMA通信(CPU与外设通信的方式)进行物理内存…

Python爬虫(8)selenium爬虫后数据,存入sqlit3实现增删改查

之前的文章有关于更多操作方式详细解答,本篇基于前面的知识点进行操作,如果不了解可以先看之前的文章 Python爬虫(8)selenium爬虫后数据,存入sqlit3实现增删改查导入默认包和环境元素定位创建一个sqlit3表将爬虫到的信…

知识蒸馏综述笔记

知识蒸馏的目的 将学习能力强的复杂教师模型中的“知识”迁移到简单的学生模型中 1.知识蒸馏的背景知识 2.解释知识蒸馏的作用机制 3.归纳知识蒸馏中知识的不同形式 4.详细分析和对比了知识蒸馏的各种关键方法, 5.介绍知识蒸馏与其它技术融合、 6.对知识蒸馏…

VirtualBox 安装 CentOS 换成 Rocky Linux

1.下载 VirtualBox并安装https://www.virtualbox.org/wiki/Downloads2.下载Rocky Linux选择 Rocky-9.1-x86_64-dvd.iso 镜像 官网https://rockylinux.org/download阿里云镜像服务https://mirrors.aliyun.com/rockylinux/9.1/isos/x86_64/?spma2c6h.25603864.0.0.70c556799nMQL…

设计模式看 Spring。

设计模式看 Spring。 文章目录设计模式看 Spring。自定义 Spring 框架。7.1 Spring 使用回顾。7.2 Spring 核心功能结构。7.1.1 bean 概述。7.3 Spring IoC 相关接口分析。7.3.1 BeanFactory 解析。7.3.2 BeanDefinition 解析。7.3.3 BeanDefinitionReader 解析。7.3.4 BeanDef…

论文阅读 | Video Frame Synthesis using Deep Voxel Flow

前言: 视频帧生成方法(视频插帧/视频预测)ICCV2017 oral Video Frame Synthesis using Deep Voxel Flow 引言 当下进行视频帧合成的方法分为两种,第一种是光流法,光流准确的话效果好,光流不准确的话则生…

手摸手,带你实现3D粒子特效

文章摘要:某天,产品小姐姐找到我,要在页面上放一个动态3D模型…不会webGL?没关系!今天就来聊一聊如何用从零实现3D粒子特效。 背景 近年来,随着互联网的迅速发展,用户对产品的视觉效果需求也更…

内网渗透(四十六)之横向移动篇-使用系统漏洞ms17010横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

leaflet 加载geojson数据,随机显示不同颜色的circleMarker

第086个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet项目中加载geojson数据,随机显示不同颜色的circleMarker. 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共89行)相关API专栏目标示例效果 配置方式…