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 到项目仓库
  • 在评论区留言交流

0
0

订阅

发表回复 0

Your email address will not be published. Required fields are marked *

captcha
Enter the characters shown in the image:
Reload

This CAPTCHA helps ensure that you are human. Please enter the requested characters.