PX4二次开发——编译和启动脚本的修改
一、在修改之前我们先了解一下目录结构
1.1 总目录结构
上图,是源码目录
Src:目录是源码目录存放所有的源码,源码的查看都应该在这里。
Mavlink:是MAvlink的库目录,源码要调用这个库,如果我们要修改和添加MAVLINLK消息ID也是在这个目录下面。
NuttX:是NuttX的系统库,如果做二次开发,很少用到这个库。
Cmake:是存放的Cmake编辑脚本文件夹,其中Cmake/Configs是存放的不同硬件的编译脚本,nuttx_mindpx-v2_default是PIXHAWK这个硬件的编辑脚本,如果要添加驱动,添加系统功能的模块函数,要修改里面的编译选项,保证添加的模块文件,能够被编译到。
Romfs:是文件系统文件夹。里面存放的飞控系统的启动脚本,我们要修改启动脚本主要在这个文件夹里面。src/Romfs/px4fmu_common/init.d ,如rcS主要的启动脚本,还有其他的rc.XXX的脚本,传感器脚本,参数脚本等等,反正负责系统初始化的,如果自己定写了个功能模块要随系统启动那么就在这里添加启动。和linux系统的启动脚本非常相似。
Msg:是存放UORB消息主题的地方,如果要二次开发添加消息主题,就在这个文件夹里面添加修改。
1.2 子目录结构
Src这个目录比较重要,详细看看:
1.2.1 Drivers
Drivers是驱动文件夹,包括了所有的传感器驱动,三轴,地磁,加速度,超声波…
1.2.2 Examples
Examples是实例文件夹,入门PIXHAEK开发的一些很好的例子就在里面,其中最经典的是 px4_simple_app这个例子,要搞明白进程间通信UORB就是这个例程。
1.2.3 Modules
Modules是功能模块文件夹,什么位置估计,位置控制,指令控制…都在这个文件夹,也是二次开发主要要修改的文件夹。
1.2.4 Systemcmds
Systemcmds是系统指令文件夹,都是飞控的支持的命令的源码。比如top命令,reboot命令等等,这些命令都可以在终端操作。
总的来说,我们做应用进程,关注modules、drivers两个文件夹就好了。
二、再来谈谈编译脚本
编译脚本的作用,是将这些人们写的程序编译成二进制文件供机器使用。
这个PIXHAWK原生固件采用的Cmake编译脚本的书写方式,降低makefile的书写难度。我们只要掌握几个修改脚本就可以掌握系统的编译。
2.1 总的模块编译脚本的修改
由前面我们所学习想要编译需要的指令(make px4_fmu-v3_default)知道,总的编译目录在Firmware->boards->px4->fmu-v3->deault.cmake当中,如下图
这个文件夹是飞控硬件选择文件夹,根据不同的硬件,在刷固件时选择不同的版本编译后下载。那么我们需要编译什么模块,填写好正确的模块路径,系统就会编译里面的源码
px4_add_board(
PLATFORM nuttx
VENDOR px4
MODEL fmu-v3
LABEL default
TOOLCHAIN arm-none-eabi
ARCHITECTURE cortex-m4
ROMFSROOT px4fmu_common
IO px4_io-v2_default
TESTING
UAVCAN_INTERFACES 2
SERIAL_PORTS
GPS1:/dev/ttyS3
TEL1:/dev/ttyS1
TEL2:/dev/ttyS2
TEL4:/dev/ttyS6
DRIVERS
adc/board_adc
adc/ads1115
barometer
batt_smbus
camera_capture
camera_trigger
differential_pressure
distance_sensor
dshot
gps
imu/adis16448
imu/adis16477
imu/adis16497
imu/l3gd20
imu/lsm303d
imu/invensense/icm20608g
imu/invensense/icm20948
imu/invensense/mpu6000
imu/invensense/mpu9250
irlock
lights/blinkm
lights/rgbled
lights/rgbled_ncp5623c
magnetometer
mkblctrl
optical_flow/px4flow
pca9685
pca9685_pwm_out
pwm_input
pwm_out_sim
pwm_out
px4io
roboclaw
tap_esc
telemetry
test_ppm
tone_alarm
uavcan
MODULES
airspeed_selector
attitude_estimator_q
battery_status
camera_feedback
commander
dataman
ekf2
esc_battery
events
fw_att_control
fw_pos_control_l1
land_detector
landing_target_estimator
load_mon
local_position_estimator
logger
mavlink
mc_att_control
mc_hover_thrust_estimator
mc_pos_control
mc_rate_control
navigator
rc_update
rover_pos_control
sensors
sih
temperature_compensation
vmount
vtol_att_control
SYSTEMCMDS
bl_update
dumpfile
esc_calib
gpio
hardfault_log
i2cdetect
led_control
mixer
motor_ramp
motor_test
mtd
nshterm
param
perf
pwm
reboot
reflect
sd_bench
system_time
tests
top
topic_listener
tune_control
usb_connected
ver
work_queue
EXAMPLES
fixedwing_control
hello
hwtest
px4_mavlink_debug
px4_simple_app
rover_steering_control
uuv_example_app
work_item
)
我们只需要在MODULES里面加入我们写的一个应用程序所在的文件夹即可,这个编译就会跳转到该文件夹下,在该文件夹其实还是有个Cmakelist需要编写,是实现具体app编译的配置。接下来就看看子模块Cmakelist.txt的编写。
2.2 子模块的Cmakelsit的修改
前面配置好的总的编译模块添加了,编译路径之后,实际上编译器是去寻找子模块下面的CmakeList.txt去进一步编译
进入我们写应用的文件下,即src->module->airspeed_selectors当中,这里以这个模块为例。
下面是里面的代码,源就就是应用程序,剩下那个是依赖
px4_add_module(
MODULE modules__airspeed_selector
MAIN airspeed_selector
SRCS
airspeed_selector_main.cpp
DEPENDS
git_ecl
ecl_airdata
AirspeedValidator
)
以上就是如何将一个自己写的程序,正确填写到编译路径当中。那么如何开始自己写的模块呢,那就要在启动脚本中添加,接下来就是看看启动脚本如何启动我们自己编写的模块。
三、启动脚本修改
上篇文章我们已经说过启动脚本是如何运行的,如果我们只是写一个固定翼程序,那么我只需在rc.fw_apps中写即可,其他的类推。主启动脚本,在我们在地面站选好机型后,会自动跳入到该子启动脚本把我们写的app打开。
四、总结
综上,其实在我们写完一个应用程序,想让它跑起来,无非就是两个问题,一是否编译了,二是否跑起来了。编译问题,我们只需知道改一个总编译,它会跳转到子编译当中。启动问题,就进入启动脚本,看你使用的载具模型,在其中start即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)