您现在的位置是:首页 >技术交流 >无人机系统 ArduPilot 仿真测试(SITL仿真)网站首页技术交流

无人机系统 ArduPilot 仿真测试(SITL仿真)

LionelMartin 2025-02-13 12:01:02
简介无人机系统 ArduPilot 仿真测试(SITL仿真)

环境

  • 虚拟机 Ubuntu 18.04
  • 安装环境需要的功能包
  • 安装 movproxy(过程中搜到两种方式)
# 安装前最好先更新一下源,不过国内还是下载速度慢,最好每次用 -i 国内镜像
sudo apt-get update
    • 方式1 :这是mav代理官方(中文官方说明
      这个方法,我没试;怕python3 和ros冲突
sudo apt-get install python3-dev python3-opencv python3-wxgtk4.0 python3-pip python3-matplotlib python3-lxml python3-pygame
pip3 install PyYAML mavproxy --user
echo 'export PATH="$PATH:$HOME/.local/bin"' >> ~/.bashrc
    • 方式2:我测试的是这种
sudo apt-get install python-dev python-opencv python-wxgtk3.0 python-matplotlib python-pygame python-lxml python-yaml vim git screen -y
# 没有装pip管理的装一下
sudo apt-get install python-pip
# 然后装 MAVProxy, 用清华源,不然太慢了
sudo pip install MAVProxy -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 安装ArduPilot的准备
    自己建一个管理文件
cd ~
mkdir courseRoot
# 增加一个环境变量
sudo echo "export courseRoot=/home/$USER/courseRoot" >> ~/.bashrc
source .bashrc

安装ArduPilot

cd $courseRoot
mkdir apm
cd apm
# 一般来说,linux直接git clone 就好,如下:
git clone https://github.com/ArduPilot/ardupilot.git
  • 尴尬的是我linux没有梯子代理,网就是不好,连不上外网,那只有一个笨办法了,从Windows上git clone 下来
  • 这个windows 上 git clone 的方式在linux 上打开时,又会出现新的问题:即
/usr/bin/env: "python3
": 没有那个文件或目录
  • 这个问题就是克隆下来的时候,Windows和linux编码不同造成的,那怎么办,都到这步了,解决咯,方法是:
vim xxx.py
## vim 指令中,设置编码方式
:set ff=unix
可以再使用一次
:set ff
查看是否设置成功为unix
:wq
  • 这个做还有一个问题,文件权限的问题
    就是windows上克隆下来的仓库,复制到linux后权限基本都不可用,所以还需要递归的给所谓文件赋权限,不然后面运行会报一大堆错
sudo chmod -R 777 ardupilot
  • 继续安装库的子模块(这就是为啥不推荐网差直接去下载库的.zip文件了,因为它没法搞这个)
cd ardupilot
# 这一步就是在把库关联的子模块库也搞下来(因为在远程仓库这些子模块只有关联的链接)
git submodule init
git submodule update --init --recursive
  • 这一步搞完,加环境变量,方便启动仿真
vim ~/.bashrc
export PATH="/home/用户/courseRoot/apm/ardupilot/Tools/autotest":$PATH
export apm=/home/用户/courseRoot/apm

测试就是 随便打开一个终端,sim_ 然后 tab 是否补全。

  • 现在就是SITL的使用
    • 运行SITL:
sim_vehicle.py -v ArduCopter --map --console
    • 第一次运行会出现各种问题
  • 问题1:
./../libraries/AP_Logger/AP_Logger_Backend.cpp: In member function ‘bool AP_Logger_Backend::Write_VER()’:
../../libraries/AP_Logger/AP_Logger_Backend.cpp:578:5: sorry, unimplemented: non-trivial designated initializers not supported
     };
     ^
compilation terminated due to -Wfatal-errors.

这问题在于,源码采用的是C语言的编译方式,我们编译采用的是C++的编译,而C++对结构体初始化要求很严格,就采用C语言风格初始化时运行不按照顺序初始化成员,但是C++不行,所以这里报错了,具体问题分析看这篇博文

看看源码:

AP_Logger_Backend.cpp中:578行

log_VER pkt{
568         LOG_PACKET_HEADER_INIT(LOG_VER_MSG),
569         time_us  : AP_HAL::micros64(),
570         board_type : fwver.board_type,
571         board_subtype: fwver.board_subtype,
572         major: fwver.major,
573         minor: fwver.minor,
574         patch: fwver.patch,
575         fw_type: fwver.fw_type,
576         git_hash: fwver.fw_hash,
579         build_type: fwver.vehicle_type,
578     };

再对比 log_VER结构体的定义,在文件/ardupilot/libraries/AP_Logger/LogStructure.h中

struct PACKED log_VER {
 663     LOG_PACKET_HEADER;
 664     uint64_t time_us;
 665     uint8_t board_type;
 666     uint16_t board_subtype;
 667     uint8_t major;
 668     uint8_t minor;
 669     uint8_t patch;
 670     uint8_t fw_type;
 671     uint32_t git_hash;
 672     char fw_string[64];
 673     uint16_t _APJ_BOARD_ID;
 674     uint8_t build_type;
 675 };

这里在初始化时,没有给数组 fw_string 和 _APJ_BOARD_ID 赋值,导致不符合C++的初始化要求,所以解决方法就是修改AP_Logger_Backend.cpp的代码:

log_VER pkt{
568         LOG_PACKET_HEADER_INIT(LOG_VER_MSG),
569         time_us  : AP_HAL::micros64(),
570         board_type : fwver.board_type,
571         board_subtype: fwver.board_subtype,
572         major: fwver.major,
573         minor: fwver.minor,
574         patch: fwver.patch,
575         fw_type: fwver.fw_type,
576         git_hash: fwver.fw_hash,
577         "",
578         0,
579         build_type: fwver.vehicle_type,
580     };
  • 问题2没有map 和 console 的窗口出现
    正常运行下,是会出现以下三个窗口:
    在这里插入图片描述
    如果没有显示,map 和 console 可以采用以下指令更新相关功能包,一定是pip2 ,直接pip 没用
sudo -H pip2 install --upgrade MAVProxy pymavlink future lxml -i https://pypi.tuna.tsinghua.edu.cn/simple

ArduPilot 和 SITL 仿真的使用

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。