直接看最后, 即可!!
前言
PX4开源飞控固件支持很多款硬件, 包括pixhawk, cuav, 和 cube等, 在1.12版本中px4官方开始实验性的支持树莓派直接运行. 这样我们就可以在树莓派上直接运行飞控程序, 考虑到树莓派处理器的性能, 那么就算可以实现很多对性能要求较高的算法啦, 比如说MPC.
区别
以往运行复杂算法的方案是将树莓派作为上位机负责顶层规划, 然后向pixhawk硬件发送飞行指令, 对于做顶层规划类的控制自是没问题, 但是如果做底层控制, 那么我们更希望直接由高性能计算平台直接控制电机来控制飞行器, 而之前上位机的方案需要额外将控制指令发送到pixhawk, 这样就多了很多时间上的滞后. 尤其对于高机动的控制, 时间滞后会制约控制器的潜能.
我的平台
2022年上半年开始树莓派就贼拉贵, 我从实验室的箱底翻出了树莓派2B, 发现居然是能用的!
我的PC上的系统是Win10, 运行虚拟机ubuntu 18, 也在ubuntu20上测试过, wsl也测试过, 都能轻松打通编译环节, 问题都出在了上传固件到树莓派这个环节上!!!
正常的配置流程
关于如何配置其实完全可以参照官网
- ubuntu下的配置树莓派的编译环境配置
https://docs.px4.io/master/en/dev_setup/dev_env_linux_ubuntu.html#raspberry-pi - 树莓派固件的编译, 可以使用树莓派的官方系统, 也可以使用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 - 这里以树莓派的官方系统为例子, 建议在ubuntu 18.04上进行编译. 如果是wsl也是可以编译的.
无非就是, 修改树莓派的启动文件, 空出树莓派的核心2给px4运行, 其他的就是常规的下载源代码, 编译之类的.
遇到的问题(本文重点来啦, 坑!)
下面是遇到的问题和解决方法
- 官方建议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_default
或make distclean
. 这样在上传固件的时候就能检测树莓派啦, 但是新的问题是我这里遇到了输入树莓派ssh密码依旧显示密码不正确, 但是直接连接ssh密码就是可以的, 倒腾了很久也没研究清楚, 如果有人知道, 欢迎留言! - 之后我改用ubuntu18.04直接编译树莓派的PX4固件, 依旧遇到了上面1中的问题, 就是在上传固件的时候总是显示找不到树莓派, 即使按照官方的要求
export AUTOPILOT_HOST=192.168.X.X
也是不行. 最后分析了下报错提示, 以及makefile文件 - 无论是上面的情况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 pi@192.168.199.232:px4/
rsync -arh --progress /home/kcx064/Desktop/PX4-Autopilot/posix-configs/rpi/pilotpi*.config pi@192.168.199.232:px4/
rsync -arh --progress /home/kcx064/Desktop/PX4-Autopilot/build/scumaker_pilotpi_default/etc pi@192.168.199.232: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上操作
由于没有拓展版(上面有IMU和转换PWM的模块), 所以运行后显示没有传感器.
后续
参看https://github.com/PX4/PX4-Autopilot/pull/18400, 官方已经修复, 但是对于已经发布的1.12这个问题只能自己修复啦, 如下图所示
也就是前面的问题是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
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)