HPMicro ArduPilot 开发环境 Docker 镜像发布
上一篇文章 HPMicro ArduPilot 支持包 v0.1.0 发布 中,我们介绍了 HPMicro 系列 MCU 的 ArduPilot 支持包,让开发者可以在先楫半导体的 MCU 上运行完整的 ArduPilot 飞控固件。
自发布以来,不少开发者反馈:搭建编译环境繁琐、依赖冲突是上手的最大障碍。为此,我们推出了配套的 Docker 开发环境镜像,一键拉取,开箱即用。
为什么需要 Docker?
ArduPilot 的编译工具链依赖较多,包括特定版本的 GCC 交叉编译器、Python 环境、CMake 以及 HPMicro 的 SDK。手动配置往往会遇到:
- Python 版本冲突
riscv32-unknown-elf-gcc版本不匹配导致编译失败- HPM_SDK 环境变量配置遗漏
Docker 镜像将所有依赖打包在一起,无论本地环境上是否正确配置了编译的环境,只要能运行 Docker,就能得到几乎一致的开发体验。
镜像信息
| 项目 | 内容 |
|---|---|
| 镜像名称 | hpmicro-ardupilot-dev |
| 基础镜像 | Ubuntu 22.04 LTS |
| ArduPilot 版本 | Copter-4.5 (含 HPMicro 补丁) |
| HPM SDK 版本 | v1.11.0 |
| 工具链 | riscv32-unknown-elf-gcc-13.2.0 |
| Python | 3.10.12 |
| 镜像大小 | 649MB |
快速开始
1. 安装 Docker
如尚未安装 Docker,请参考官方文档或其他网页。
2. 拉取镜像
从以下链接可以下载docker镜像
https://resource.hpmicro.com/hpmicro-ardupilot-dev.tar.gz
下载完成后,使用以下命令将镜像加载到Docker系统中:
docker load -i hpmicro-ardupilot-dev.tar.gz
加载完成后,可以使用以下命令验证镜像是否成功加载:
docker images
你应该能看到 ardupilot-dev 镜像在列表中。
3. 克隆源码
在宿主机上克隆 ArduPilot 源码(含 HPMicro 补丁分支):
git clone --recurse-submodules https://github.com/hpmicro/ardupilot.git -b hpmicro/v0.1.x
cd ardupilot
4. 启动容器并挂载代码
docker run -it --rm -v ./:/ardupilot ardupilot-dev:latest
进入容器后,你会看到如下提示符,说明环境已就绪:
ardupilot@9879e649c385:/ardupilot$
执行ls命令后可以看到ardupilot仓库的文件
AntennaTracker ArduSub CODE_OF_CONDUCT.md Doxyfile.in Rover benchmarks get-pip.py pyproject.toml waf
ArduCopter BUILD.md COPYING.txt Makefile Tools build libraries tasklist.json wscript
ArduPlane Blimp Dockerfile README.md Vagrantfile docs modules tests
编译固件
编译 HPMPILOTBF67 飞控固件
# 在容器内执行
./waf configure --board hpmpilotbf67
./waf copter
编译成功后,固件位于:
/ardupilot/build/hpmpilotbf67/build/bin/arducopter/output/demo.elf
/ardupilot/build/hpmpilotbf67/build/bin/arducopter/output/demo.bin
烧录固件
编译完成后,在宿主机上使用hpm_manufacturing_tool烧录,或使用 JTAG 调试器烧录.
调试时的源文件路径问题
问题描述
从Docker容器中编译出来的elf文件,在使用gdb或ozone进行调试时,可能会报找不到源文件的错误。这是因为编译时使用的是容器内的文件路径(如/ardupilot/...),而调试时在宿主机上的实际路径不同。
解决方案
可以使用调试工具的路径前缀替换功能来解决这个问题:
在Ozone中使用路径替换
在Ozone的脚本或命令中使用Project.AddPathSubstitute函数,例如:
// 将容器内路径替换为宿主机实际路径
Project.AddPathSubstitute("/ardupilot", "/home/user/ardupilot");
在GDB中使用路径替换
在GDB命令行中使用directory命令,例如:
# 将容器内路径映射到宿主机实际路径
directory /ardupilot /home/user/ardupilot
这样设置后,调试器就能正确找到源代码文件,实现断点调试等功能。
进阶用法
使用 alias 简化命令
在宿主机的 ~/.bashrc 或 ~/.zshrc 中添加:
alias hpm-dev='sudo docker run -it --rm -v ./:/ardupilot ardupilot-dev:latest'
之后在 ArduPilot 目录下执行 hpm-dev 即可一键进入开发环境。
非交互模式直接编译
无需进入交互式 shell,直接执行编译命令并退出:
docker run -it --rm -v ./:/ardupilot ardupilot-dev:latest ./waf configure --board hpmpilotbf67
docker run -it --rm -v ./:/ardupilot ardupilot-dev:latest ./waf copter
这种方式非常适合集成到 CI/CD 流水线(如 Jenkins、GitHub Actions)中。
常见问题
Q:下载源码时提示网络超时?
A:检查网络链接,是否可以正常访问仓库
Q:容器内修改的文件在容器退出后消失了?
A:这是正常行为。使用 -v 挂载的目录(即你的源码目录)会持久化,但容器内其他位置的改动不会保留。建议所有源码和产物都放在挂载目录下。
Q:源码编译报错?
A:排查源码克隆是否完整,检查submodule代码是否都正常。
Q:如何进入一个已停止的容器?
A:本镜像设计为无状态容器(--rm 参数),建议每次重新运行。如需保留容器状态,去掉 --rm 参数,并使用 docker start -ai 重新进入。
反馈与贡献
如果你在使用过程中遇到问题,或希望贡献代码,欢迎:
- 提交 Issue 或 PR 到项目仓库
- 在评论区留言交流