ArduPilot/ChibiOS(Windows/VScode)从开发环境到固件编译烧录

重要链接

源码地址:GitHub - ArduPilot/ardupilot: ArduPlane, ArduCopter, ArduRover, ArduSub source

官方代码学习wiki:Welcome to the ArduPilot Development Site — Dev documentation

官方Copter学习wiki:ArduPilot Copter — Copter documentation

地面站MissionPlanner学习wiki:Mission Planner Home — Mission Planner documentation

环境部分参考博客,环境配置参考CSDN博客:参考博客

编译部分参考博客,可以借鉴其中步骤:次要参考博客

下载代码:

git clone --recurse-submodules https://github.com/Ardupilot/ardupilot

环境配置及搭建

**注意事项**

由于ArduPilot代码(较新版本)的编译工具依赖Linux环境,故若需要在windows下配置VSCode进行开发,则需要安装WSL,即在当前Windows系统下安装一个Ubuntu子系统,,WSL相当于创建了一个unbuntu系统,该系统在windows下以文件夹的形式呈现,文件在两个系统间均能共用共享,可以在Windows系统下打开Ubuntu的文件系统,省去了频繁切换的麻烦,同时也省去了使用虚拟机带来的不便。

注意:VSCode安装在Windows系统下,但代码放在Ubuntu系统的文件夹下。

**------------**

1)在windows下安装WSL(Windows Subsystem for Linux)环境

手动安装(可以选择安装的版本)

 CSDN教程:WSL的安装与使用 (超详细图文版安装教程)_wsl安装-CSDN博客

官方教程:Install WSL | Microsoft Learn

快捷安装(默认安装最新发行版Ubuntu)

以管理员身份打开powershell,输入指令即可一步安装,安装完成后重启电脑

wsl --install

**注意事项**

之后的步骤需要进入WSL的ubuntu系统下,包括环境的配置、库的安装、代码的下载存放等均存放在WSL下,安装完WSL后,Windows系统下会出现Ubuntu应用程序,打开该应用即可打开Ubuntu子系统下的根目录终端。

**------------**

2)安装工具链

本地编译(用于仿真):gcc / 交叉编译(用于嵌入式平台编译):arm-none-eabi-gcc

进入ardupilot源码目录下的Tools进入environment_install,打开终端后运行安装脚本

./install-prereqs-ubuntu.sh

检测交叉编译工具链是否安装成功

arm-none-eabi-gcc --version

出现以下内容为安装完成

安装完成后执行环境变量配置

3)需要安装的VScode插件、Linux依赖、其他软件

1)VScode插件

C/C++

Python

CMake

ardupilot-devenv

WSL

remote development      

tasks shell input

Cortex-Debug

OpenOCD(用于调试)

2)linux依赖

sudo apt install openocd
#用如下指令查看openocd版本
openocd -v

3)ardupilot子模块mavlink环境初始化

Generate MAVLink Libraries · MAVLink Developer Guide

mavlink头文件生成位置为path_to/ardupilot/libraries/include/mavlink/v2.0

4)MissonPlanner地面站

先在“重要链接”处的地面站wiki中下载并安装地面站

~~bug~~

1)运行sh文件显示无法找不到命令,可能原因为没有赋予sh文件可执行权限,解决方法见下

ubuntu系统下如何运行.sh文件_ubuntu .sh-CSDN博客

2)安装完工具链后,环境配置无法完成,终端出现command not found及no such fille

说明环境变量没配置好,打开bashrc看到最后一行添加了环境变量

文件第二行空了一行,去掉以后第一条报错消失,但单独source每一个bash文件时依旧遇到问题

原因为,在运行apm自带的工具链脚本时,脚本文件的换行均为'\r\n',但在linux下运行脚本文件识别到的换行符应该为‘\n’。

运行

cat -v filename

可以看到脚本文件内有很多的^M,Windows 格式的文件,用 0D 0A (CR+LF)作为换行符,而Linux 的则是以0A(LF) 作为换行符,所以Windows 格式下的文本文件到了Linux 的话,换行符就会多出来一个 0D(CR) ,在Linux中显示为 ^M

所以解决方法是在字符层面直接删除 ^M 即可,每一个遇到该问题的文件,均执行如下指令

sed -i 's/\r//g' filename

报错处理: syntax error near unexpected token `$‘\r‘‘ (linux中的^M)_mobaxterm 报错syntax error near unexpected token `&-CSDN博客

但是这样处理在执行其他文本时依然会遇到类似问题,故需要将整个ardupilot文件夹下的所有文件由dos编码转为unix编码

最终解决方法

先安装dos2unix

sudo apt install dos2unix

再讲指定文件夹内的文件全部从dos替换为unix编码

#/path/to 即为文件夹的绝对路径
sudo find /paht/to -name "*" | xargs dos2unix

参考博客:批量dos2unix参考博客

~~------~~


固件烧录及编译

1)更新ardupilot子模块,在ardupilot目录下执行以下指令

git submodule update --init --recursive

若一直卡在cloning,则按照ubuntu系统更换国内源的步骤换源即可解决

2)先将当前用户放到dialout用户组内,将$USER替换为自己当前的用户名

sudo usermod -a -G dialout $USER

使用下述指令查看当前系统内有多少个用户组

groups

使用下述指令查看系统内用户组的成员

getent group

3)第一次编译需要先指定烧录的板子型号

waf为ardupilot文件夹内的编译脚本文件 

以下指令列出支持的板子型号

./waf list_boards

以下指令设置编译的板子型号(NxtPX4v2),第一次运行后再编译不需要再运行该指令,若修改板子型号可以重新运行该指令

#将board_name替换为自己要的板子型号
./waf configure --board board_name

4)第一次烧录需要编译bootloader

在进行bootloader编译之前需要修改hw.dat及hwbl.dat文件,该文件为硬件配置文件,位于libiraries/AP_HAL_ChibiOS下对应板子型号的hwdef文件夹内,若对硬件接口等不做修改,则不需要更改该文件。

./waf configure --board board_name --bootloader
###########
./waf clean
./waf bootloader

5)编译旋翼机模块

编译代码之前要先设定板子再编译,否则会报错

./waf configure --board board_name
./waf copter

编译通过

6)烧录Bootloader

由于使用的是stm芯片,故修改opencd的jlink配置为swd

sudo gedit /usr/share/openocd/scripts/interface/jlink.cfg

#加入下方内容
transport select swd

根据芯片型号,检测飞控板子是否连接上

#NxtPX4v2的芯片为stm32H7
openocd -f interface/jlink.cfg -f target/stm32h7x.cfg

打开另一个终端并通过telnet连接openocd

telnet localhost 4444

烧录Bootloader,注意这里要把Bootloader文件路径修改成你自己的

program /home/path_to/ardupilot/build/board_name/bootloader/AP_Bootloader

复位

reset

若飞控中已经烧录过某些程序,则存在禁用SWD接口的可能性,导致调试器无法连接单片机,这时候需要将BOOT0引脚拉高后再上电。

如果提示"Error: couldn’t bing xxx to socket: Address aleady in use"这个错误,可能是因为OpenOCD需要监听的端口已经被占用,其中xxx可能是telnet_port、gdb_port、tcl_port三者之一,这三个默认端口分别为4444、3333、6666。比如如果tcl_port被占用(这个是我在windows下经常碰到的情况),可以在.cfg文件中加入一行:tcl_port 19998,修改端口为19998,以解决这个问题。

若需要使用VSCode调试Ardupilot,需要openocd连接上飞控,同时飞控开放了swd口,由于版主手上的飞控使用串口烧录,未开放swd口,故此处不再记录使用openocd进行飞控调试的步骤

7)使用MissonPlanner烧写自定义固件

方法1:

打开MissonPlanner,找到烧录按钮并断开飞控连接

找到编译通过后的apj文件,hex文件带bootloader需要swd调试接口,

在path_to/ardupilot/build/board_name/bin内

方法2:

~~bug~~

1)"./waf permission denied"

ardupilot文件夹下的waf脚本没有可执行权限,运行如下指令即可

chmod u+x waf

2)编译过程中遇到Tools/scripts内的脚本文件均没有访问权限

修改scripts文件夹内的所有文件为可执行权限即可

cd ardupilot/Tools
chmod -R u+x scripts

3)编译飞控代码失败(.o文件生成失败,发现找不到mavlink头文件)

定位最终问题在缺失mavlink头文件

跟着”mavllink环境初始化”的步骤在ardupilot根目录创建一个include,并运行mavgenerate.py在include文件夹里生成mavlink头文件即可解决

4)static_assert(sizeof(1e6) == sizeof(float), "Compilation needs to use single-precision constants");/class "AP_HAL::Util" has no member.......

莫名其妙的头文件包含问题,提示找不到定义,但实际上都能够找到,但修改c_cpp_properties.json里的include_path只是修改了编辑器的包含路径,即只是ide能够识别并进行代码高亮等,编译器对include path依然未知

尝试解决方法:编译多次后发现,经常遇到该类问题,查找ardupilot根目录下的waf编译规则(.lock-waf_linux_build文件)时发现在运行files内包含的脚本时经常碰到无法运行的问题,给ardupilot文件夹赋予777权限。无效

chmod -R 777 ardupilot

 回溯到最开始报错的地方是这里,报错为,即缺失std_realloc的定义,即Utils函数内定义的跟内存申请相关的函数均没有被识别

VScode的terminal上运行代码编译指令会报错,但是在ubuntu系统终端下运行时不会报错,推测是VScode编译器路径没有配置好

发现build以后CH_CFG_USE_HEAP被定义为FALSE了,导致函数无法被识别

::看这里::(这个问题的最终解决方法)

考虑chibios设置不正确,检查了半天没找到在哪里开启chibios,最后发现是飞控代码编译有错,跟着网上的教程步骤编译无法通过会报错,编译代码前一定要先指定板子型号,否则编译时无法链接到对应的hwdef.dat文件,导致开启chibios的宏定义无法检索,所以报了找不到文件的错误。

已经在5)中更新

5)执行./waf bootloader失败,报错Group bootloader not found

即bootloader没有链接到对应的板子上,需要完整执行一遍步骤2)中的三行指令

6)Missing configuration file '/home/ehang/ardupilot/build/NxtPX4v2/ap_config.h', reconfigure the project!

执行指令

./waf distclean

7)MissionPlanner烧写自定义固件时软件报错

烧写固件时报错

8)TabError: inconsistent use of tabs and spaces in indentation

成功解决TabError: inconsistent use of tabs and spaces in indentation-CSDN博客

9)unzip: No such file or directory

sudo apt-get install unzip

~~------~~

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值