rCS启动脚本分析

2023-05-16

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


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

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

随机推荐

  • 2019全国电赛总结

    准备阶段 xff1a 赛前大约一个星期就开始全力备战电赛 xff0c 由于学校条件不算太好 xff0c 所以选题上就不选放大器设计之类的题目 xff0c 只能选择一些电源题 xff0c 控制题 xff0c 造飞机题 技术准备 xff1a 这
  • UBUNTU使用RTL8811CU网卡(包含树莓派)

    8811cu 8821 github链接 一 普通的Ubuntu系统 xff0c 测试的是ubuntu18 04 下载驱动 从绿联中下载 xff1a 链接 下载解压后 xff0c chmod Linux文件夹 sudo chmod R 77
  • XTDrone ROS安装

    XTDrone ROS安装 本博客是参考XTDrone内容 xff0c 进行ROS安装和配置 参考连接 xff1a XTDrone 梗概ubuntu18的源 xff0c 并更新 参考 xff1a 更改ubunut源 sudo apt upd
  • PX4 GAZEBO无人机添加相机并进行图像识别

    PX4 GAZEBO无人机添加摄像头并进行图像识别 在之前完成了ROS的安装和PX4的安装 xff0c 并可以通过roslaunch启动软件仿真 接下来为无人及添加相机 xff0c 并将图像用python函数读取 xff0c 用于后续操作
  • XTDrone 视觉SLAM环境配置

    基于XTDrone的视觉SLAM章节 xff0c 进行环境配置 中途遇到了一些问题 xff0c 一一解决后成功完成了 xff0c 记录该流程 一 遇到的问题与参考链接 XTDrone相关参考连接 xff1a 链接依赖安装教程 xff1a O
  • XTDrone 视觉惯性里程计(VIO)配置

    XTDrone 视觉惯性里程计 xff08 VIO xff09 配置 参考XTDron进行配置 xff0c 对于依赖的配置写成文档 xff0c 参考主要为 xff1a XTDrone Ceres Solver 2 0 0 1 下载2 0 0
  • ros realsense D435i摄像头配置

    ros realsense D435i摄像头配置 之前在ubunut18中配置了ROS环境 xff0c 现在需要在此基础上 xff0c 配置D435i相机的SDK和ROS包 一 参考 https github com IntelRealSe
  • 树莓派4B(ubuntu mate系统)使用d435i运行vins

    树莓派4B xff08 ubuntu mate系统 xff09 使用d435i运行vins 提示本文为随手笔记 xff0c 并不严谨 xff0c 可参考 xff1a 博客和博客进行配置 树莓派 ubuntu mate 20系统安装ros的步
  • 树莓派3B+增加虚拟内存

    普通ubuntu系统增加虚拟内存参考 xff1a https blog csdn net weixin 42405819 article details 117886557 编译opencv时 xff0c 卡在了91 不动 xff0c 按照
  • ROS主机从机设置

    ROS主机从机设置 在ROS基础上 xff0c 配置主机和从机 xff0c 实现主机和从机的话题联通 配置hosts 在主机和从机的 etc hosts文件中 xff0c 配置如下内容 xff08 也许主机只需要写入 master xff1
  • VINS、MAVROS等的坐标系统一(草稿,未得出明确结果)

    由于不同算法之间的坐标系不同 xff0c 导致计算的结果混乱 xff0c 该博客的目的是记录和统一不同算法之间的坐标系 xff0c 保证坐标系的统一 一 VINS算法 vins算法 xff0c 使用D435I相机 该坐标方向为 xff1a
  • ROS学习笔记9-创建ros消息和服务

    该节内容主要来自于官方文档的两个小节 xff1a 1 使用rosed来编辑 2 创建ros消息的服务 先来看rosed xff1a rosed rosed命令是rosbash的一部分 xff0c 使用rosed可以直接编辑包中的一个文件 x
  • CUAV RTK初步使用体验和感受

    记录使用RTK进行无人机定位并操作的使用体验 一 RTK定位设置 使用的是CUAV制作发售的RTK xff0c 型号为C9P xff0c 目前该产品已经下架 xff0c 上新了C9PS 并不需要太多的设置 xff0c 在飞控接入RTK后 x
  • 记录一次WIN11开机在登录页面循环的问题

    记录一次由于未进行win密码设置 xff0c 导致开机后卡在登录界面无法登录进去的问题 最后完美解决了 1 背景 开机后 xff0c 显示用户登录界面 xff0c 但是和以往不同 xff0c 没有了密码输入框 xff0c 只有一个 登录 按
  • Ubuntu中增加串口的缓冲区

    增加串口缓冲区 xff0c 用于尝试解决px4 ros中显示TX溢出的问题 以下大部分代码和内容均有CHATGPT生成 xff0c 代码已经通过验证 一 通信溢出问题 PX4和ROS的通信溢出可能是由于几个原因造成的 以下是一些建议 xff
  • GRBL代码使用与修改

    下载官方grbl代码 xff0c 并进行修改使其正确 1 问题 xff1a 购买了328p单片机 xff0c 购买了grbl的底板 xff0c 但是烧录之后无法正常使用 问题发现 xff1a 引脚错误了 xff0c 官方代码中的引脚需要修改
  • ubuntu使用rc.local开机自启USB设备读写权限

    无人机飞控为ACM0 xff0c 串口USB为USB0 xff0c 使用rc为其开机自启给与权限 大部分由chagpt生成 xff0c 已验证 首先 xff0c 创建一个新的 etc rc local 文件 xff08 如果尚不存在 xff
  • Friendlycore增加inodes数量

    背景 xff1a 为Nanopim1安装了core系统 xff0c tf卡大小64G xff0c 安装后正常扩展到了整个tf卡 xff0c 但是在安装hass的docker显示磁盘空间不够 xff0c 最终发现是inode被用完了 其ino
  • UORB

    转载地址 xff1a http blog arm so armteg pixhawk 183 0503 html Pixhawk 飞控 系统是基于ARM的四轴以上飞行器的飞行控制器 xff0c 它的前身是PX4 IMU xff0c Pixh
  • rCS启动脚本分析

    转载地址 xff1a http wellmakers com p 61 401 还有一篇很重要的文章 xff0c 讲述了整个系统的大致启动过程 xff1a http blog chinaunix net uid 29786319 id 43