PilotPi:树莓派运行PX4配置方法

直接看最后, 即可!!

前言

PX4开源飞控固件支持很多款硬件, 包括pixhawk, cuav, 和 cube等, 在1.12版本中px4官方开始实验性的支持树莓派直接运行. 这样我们就可以在树莓派上直接运行飞控程序, 考虑到树莓派处理器的性能, 那么就算可以实现很多对性能要求较高的算法啦, 比如说MPC.

区别

以往运行复杂算法的方案是将树莓派作为上位机负责顶层规划, 然后向pixhawk硬件发送飞行指令, 对于做顶层规划类的控制自是没问题, 但是如果做底层控制, 那么我们更希望直接由高性能计算平台直接控制电机来控制飞行器, 而之前上位机的方案需要额外将控制指令发送到pixhawk, 这样就多了很多时间上的滞后. 尤其对于高机动的控制, 时间滞后会制约控制器的潜能.

我的平台

2022年上半年开始树莓派就贼拉贵, 我从实验室的箱底翻出了树莓派2B, 发现居然是能用的!
我的PC上的系统是Win10, 运行虚拟机ubuntu 18, 也在ubuntu20上测试过, wsl也测试过, 都能轻松打通编译环节, 问题都出在了上传固件到树莓派这个环节上!!!

正常的配置流程

关于如何配置其实完全可以参照官网

  1. ubuntu下的配置树莓派的编译环境配置
    https://docs.px4.io/master/en/dev_setup/dev_env_linux_ubuntu.html#raspberry-pi
  2. 树莓派固件的编译, 可以使用树莓派的官方系统, 也可以使用ubuntu的树莓派版本
    https://docs.px4.io/master/en/flight_controller/raspberry_pi_pilotpi_rpios.html
    https://docs.px4.io/master/en/flight_controller/raspberry_pi_pilotpi_ubuntu_server.html
  3. 这里以树莓派的官方系统为例子, 建议在ubuntu 18.04上进行编译. 如果是wsl也是可以编译的.
    无非就是, 修改树莓派的启动文件, 空出树莓派的核心2给px4运行, 其他的就是常规的下载源代码, 编译之类的.

遇到的问题(本文重点来啦, 坑!)

下面是遇到的问题和解决方法

  1. 官方建议ubuntu 18.04, 如果是ubuntu那么就是需要用docker编译, 需要先安装好docker, 如果不熟悉docker, 还是用18.04比较好. docker会出现很多问题. 其中一点就是上传固件的时候显示找不到目标树莓派, 参考了https://discuss.px4.io/t/upload-error-raspberry-pi-navio2/11410 表示需要先运行清除指令, 然后再设置好树莓派的IP地址的环境变量, 最后才是运行编译. 也就是需要先设置环境变量, 然后再执行编译, 如果顺序错了, 那么需要清理工程rm -rf build/scumaker_pilotpi_defaultmake distclean. 这样在上传固件的时候就能检测树莓派啦, 但是新的问题是我这里遇到了输入树莓派ssh密码依旧显示密码不正确, 但是直接连接ssh密码就是可以的, 倒腾了很久也没研究清楚, 如果有人知道, 欢迎留言!
  2. 之后我改用ubuntu18.04直接编译树莓派的PX4固件, 依旧遇到了上面1中的问题, 就是在上传固件的时候总是显示找不到树莓派, 即使按照官方的要求export AUTOPILOT_HOST=192.168.X.X也是不行. 最后分析了下报错提示, 以及makefile文件
  3. 无论是上面的情况1还是情况2,以下内容都适用(就是自己把编译好的px4固件放在树莓派上, 就需要研究哪些文件需要放到树莓派上, 以及放过去后的目录结构是什么样的)

分析过程 不想看我唠叨可以直接看最后!

upload的makefile文件如下, 也就是upload上传固件的命令是将一些文件复制到树莓派的/home/pi/px4/路径中, 但是在我实践中, make scumaker_pilotpi_default upload获取环境变量AUTOPILOT_HOST这个环节出了问题.

if(DEFINED ENV{AUTOPILOT_HOST})
	set(AUTOPILOT_HOST $ENV{AUTOPILOT_HOST})
else()
	set(AUTOPILOT_HOST "raspberrypi")
endif()

if(DEFINED ENV{AUTOPILOT_USER})
	set(AUTOPILOT_USER $ENV{AUTOPILOT_USER})
else()
	set(AUTOPILOT_USER "pi")
endif()

add_custom_target(upload
	COMMAND rsync -arh --progress
			${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${PX4_SOURCE_DIR}/posix-configs/rpi/pilotpi*.config ${PX4_BINARY_DIR}/etc # source
			\$\{AUTOPILOT_USER\}@\$\{AUTOPILOT_HOST\}:/home/\$\{AUTOPILOT_USER\}/px4 # destination
	DEPENDS px4
	COMMENT "uploading px4"
	USES_TERMINAL
)

并且在运行make scumaker_pilotpi_default upload后报错, 关键信息(经过整理)展示如下

FAILED: platforms/posix/CMakeFiles/upload 
cd /home/kcx064/Desktop/PX4-Autopilot/build/scumaker_pilotpi_default/platforms/posix && 
rsync -arh --progress 
/home/kcx064/Desktop/PX4-Autopilot/build/scumaker_pilotpi_default/bin 
/home/kcx064/Desktop/PX4-Autopilot/posix-configs/rpi/pilotpi*.config 
/home/kcx064/Desktop/PX4-Autopilot/build/scumaker_pilotpi_default/etc 
@:/home//px4

其中kcx064是我的用户名, 我将px4源码放到了桌面上, 看上面的提示可以知道就是复制三个路径下的文件到树莓派上的/home/pi/px4/中, 并且使用到了命令rsync.

清楚了这些就可以变通下啦

以下是解决问题的具体操作啦
我们手动将需要的文件复制过去即可

rsync -arh --progress  /home/kcx064/Desktop/PX4-Autopilot/build/scumaker_pilotpi_default/bin [email protected]:px4/
rsync -arh --progress  /home/kcx064/Desktop/PX4-Autopilot/posix-configs/rpi/pilotpi*.config [email protected]:px4/
rsync -arh --progress  /home/kcx064/Desktop/PX4-Autopilot/build/scumaker_pilotpi_default/etc [email protected]:px4/

上面的路径记得替换为自己的具体用户名!!!不要直接用我的, 同时注意修改后面的目标树莓派的IP地址
这样手动运行上面三条后

然后ssh连接到树莓派上, 进入/home/pi/px4/目录

cd px4

运行一下命令启动PX4程序

sudo taskset -c 2 ./bin/px4 -s pilotpi_mc.config

这条命令的参数含义就是指定px4程序运行在核心2上, 并指定配置文件pilotpi_mc.config

运行成功后, 在电脑上打开地面站就能自动通过局域网连接了, 同时可以直接在ssh上操作
PilotPi:树莓派运行PX4配置方法_第1张图片
由于没有拓展版(上面有IMU和转换PWM的模块), 所以运行后显示没有传感器.
PilotPi:树莓派运行PX4配置方法_第2张图片

后续

参看https://github.com/PX4/PX4-Autopilot/pull/18400, 官方已经修复, 但是对于已经发布的1.12这个问题只能自己修复啦, 如下图所示
PilotPi:树莓派运行PX4配置方法_第3张图片
也就是前面的问题是upload脚本的问题, 多了很多斜杠[服了], 所以删除即可, 下面放上我修改好的, 然后如果你需要的话, 文件路径位于源码根目录下的boards\scumaker\pilotpi\cmake,可以复制我的即可免去自己修改:

if(DEFINED ENV{AUTOPILOT_HOST})
	set(AUTOPILOT_HOST $ENV{AUTOPILOT_HOST})
else()
	set(AUTOPILOT_HOST "raspberrypi")
endif()

if(DEFINED ENV{AUTOPILOT_USER})
	set(AUTOPILOT_USER $ENV{AUTOPILOT_USER})
else()
	set(AUTOPILOT_USER "pi")
endif()

add_custom_target(upload
	COMMAND rsync -arh --progress
			${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${PX4_SOURCE_DIR}/posix-configs/rpi/pilotpi*.config ${PX4_BINARY_DIR}/etc # source
			${AUTOPILOT_USER}@${AUTOPILOT_HOST}:/home/${AUTOPILOT_USER}/px4 # destination
	DEPENDS px4
	COMMENT "uploading px4"
	USES_TERMINAL
)

你可能感兴趣的:(PX4,ubuntu,linux)