1、编译环境搭建
1、创建虚拟环境:
bash
sudo apt update
sudo apt install git make python3-venv python3-pip curl -y
cd ~
# 创建名为 drone_env 的虚拟环境
python3 -m venv drone_env
# 激活它(执行后,你的终端提示符前面会多出一个 (drone_env))
source drone_env/bin/activate

2、安装依赖
bash
pip install pymavlink pyserial

3、拉取源码更新子模块
bash
mkdir -p ~/ardupilot_projects
cd ~/ardupilot_projects
git clone https://github.com/ardupilot/arduremoteid.git
cd arduremoteid
git submodule init
git submodule update --recursive

2、构建自动化编译脚本
根据官方的编译指南,接下来我们需要执行源码自带的三个 Shell 脚本。这三个脚本会将零散的源码组装成编译器能看懂的结构。
请保持在 (rid_env) 虚拟环境中,并在 arduremoteid 目录下,依次执行以下三条命令:
bash
./scripts/install_build_env.sh
这个脚本是核心。它会在后台自动下载 arduino-cli(一个纯命令行的、毫无图形界面的轻量级编译器)以及 ESP32 的底层工具链。它会把所有的东西都悄悄安装在你的 ~/.arduino15/ 和 ~/bin/ 目录下,绝对不会碰你系统的全局环境变量,100% 不会影响你的 ROS 开发。
./scripts/regen_headers.sh
这一步会利用我们刚安装好的 Python 依赖库(pymavlink),将刚才拉取下来的 MAVLink 和 DroneCAN 子模块里的 XML 协议定义文件,转换为 C++ 能够调用的 .h 头文件。
./scripts/add_libraries.sh
这一步相当于"搭桥",它会把你刚才生成的那些头文件和库,硬链接(或者复制)到 arduino-cli 能默认找到的库文件夹里(通常是 ~/Arduino/libraries/)

3、底层编译
1、编译准备工作:
在真正编译固件之前,我们必须使用官方写好的 make setup 命令来配置底层的 ESP32 支持包。
bash
cd RemoteIDModule
make setup
如果编译器正常,我们需要进入源码模块目录,让它自动安装适配的 ESP32 库,这一步会调用 arduino-cli 去下载特定版本(2.0.3)的 ESP32 核心包以及 Adafruit NeoPixel LED 驱动库。

如果出现以下错误:
安装时出错:下载 esp32:riscv32-esp-elf-gcc@gcc8_4_0-esp-2021r2-patch3 工具时出错: Get "https://github.com/espressif/crosstool-NG/releases/download/esp-2021r2-patch3/riscv32-esp-elf-gcc8_4_0-esp-2021r2-patch3-linux-amd64.tar.gz": dial tcp 20.205.243.166:443: connect: connection refused
make: *** [Makefile:59:setup] 错误 1
则是因为代理问题,需要配置环境变量,可以用临时代理,包括socks5代理或者是clash的局域网连接,然后接着进行就可以了,make setup有断点重连形式,可以重复运行
4、编译 ESP32-S3 固件
在 (rid_env) 虚拟环境中,并在 RemoteIDModule 目录下,执行以下命令:
bash
make esp32s3dev
编译过程解析
当运行这条命令时,系统会自动化执行以下逻辑:
版本同步:脚本会读取当前的 Git 版本号并生成版本头文件。
协议生成:重新运行协议脚本,确保 MAVLink 头文件是最新的。
源码编译:使用 arduino-cli 编译项目中的 .ino、.cpp 和 .h 文件。这会针对 ESP32-S3 的架构(Xtensa LX7)生成二进制指令。
固件合并:这是最核心的一步。Makefile 会调用 esptool.py 将生成的四个分散文件(引导程序、分区表、引导配置、主程序)合并成一个完整的 ArduRemoteID-ESP32S3_DEV.bin 文件。



5、烧录测试
在win11里通过ESP32的官方烧录工具FLASH DOWNLOAD TOOL进行烧录下载,选择串口、develop、地址0x0,直接烧录就好,然后重新上电后就会显示RID开头的热点,密码是ArduRemoteID,可以在源码中修改,最后可以通过192.168.4.1进入后台查看RID的信息,但这只是表象,还未与飞控连接



连接局域网的热点后,在浏览器进入192.168.4.1RID的后台界面进行查看
6、集成到飞控
在虚拟机中启动软件在环仿真(可以参考我的往期博客本地编译Ardupilot的源码)
6.1启动软件在环仿真
执行以下命令开启软件仿真:
bash
../Tools/autotest/sim_vehicle.py -v ArduCopter -f quad --console --map --out=udp:你的Windows_IP:14550
在你的 Ubuntu 虚拟机终端里(根据自己的情况是否要进虚拟环境),进入 ArduCopter 目录,执行之前的命令(注意替换成你当前的 Windows 宿主机 IP):

6.2主机地面站UDP连接
端口选择UDP,地面站会自己识别到的,或者是雷迅家的LGC地面站

按下CRTL+f打开面板,找到MavLink,然后选择ESP32对应的串口号,波特率选择57600(通过USB转TTL,或者是S3的板子的type-c直接连接电脑)

选择连接,勾选Write access允许写入,此时S3单片机会亮蓝色灯,根据原理图可知,是串口协议正在工作,说明已经收到来自地面站的mavlink内容,后续S3将自动解析并广播出去,最后在手机端,打开Dronescanne软件进行查看,默认飞机的位置是澳大利亚(我用的是软件在环仿真,如果是自己的飞控,则是实际位置)
6.3 Drone scanner APP查看

对于DroneScannerAPP貌似仅限于iphone的APP store商店,对于安卓不太友好,或者用Github开源的opendroneid,在release中找到.apk安卓版的安装包,移植安装到安卓手机上进行测试,以下是开源地址,可以进行参考:
https://github.com/opendroneid/receiver-android/releases