APM飞控学习之路:5 串口概述与收发调试

2023-05-16

        “云中谁寄锦书来,雁字回时,月满西楼”。当无人机在空中飞翔时,从APM飞控到飞手之间有几条看不见的“风筝线”——(1)2.4GHz的遥控;(2)433/915MHz的数传;(3)5.8GHz的图传;(4)osd(on-screen display)。其中遥控是大家最为熟知的,用于控制飞行和切换模式。数传说白了是一个披着射频的皮的无线串口,波特率57600,连接地面站可实时观测飞行数据和在线调参。图传是FPV(First Person View)必备,传输视频信号用于航拍。osd是锦上添花的部件,将飞行数据叠加到视频信号上一起传回地面接收机。


        遥控、图传和osd都是很成熟的产品,对于开源用户来说定制性不强,而数传可以传回用户感兴趣的任何数据以及在线调参,实为居家必备之良品。如果选购与APM适配的3DR数传,无需任何修改,插上APM即可在地面站(Mission Planner)监测无人机的飞行数据。从功能上看,数传与下载程序兼具串口功能的USB线别无二致,只是形态上有线无线而已。二者的技术基础是串口以及基于串口的Mavlink通信,本文主要讨论如何使用APM中的串口并进行二次开发。


APM2.8串口概述


        串口的英文名是UART,全称Universal Asynchronous Receiver/Transmitter,即通用异步接收/发送机,只要一对传输线(RX-TX)即可实现双向通信。串口通过USB转TTL模块可插在电脑的USB口,在设备管理器上体现为COM口,是单片机调试和通信的重要接口。

        对于APM2.8飞控,其主控芯片为Atmega2560,有4个串口,分别为UART0~UART3,在APM中起作用的只是前3个,即UART0、UART1和UART2。UART0接USB,UART1接GPS,UART2接数传。

        APM3.2.1源码为适应除APM之外的不同硬件(如PIXHAWK),在硬件抽象层HAL(Hardware Abstraction Layer)提供了通用的外设接口。在HAL.h中可以查看HAL类的声明,串口方面保留了_uartA~_uartE共5个。

class AP_HAL::HAL {
public:
    HAL(AP_HAL::UARTDriver* _uartA, // console
        AP_HAL::UARTDriver* _uartB, // 1st GPS
        AP_HAL::UARTDriver* _uartC, // telem1
        AP_HAL::UARTDriver* _uartD, // telem2
        AP_HAL::UARTDriver* _uartE, // 2nd GPS
        AP_HAL::I2CDriver*  _i2c,
        AP_HAL::SPIDeviceManager* _spi,
        AP_HAL::AnalogIn*   _analogin,
        AP_HAL::Storage*    _storage,
        AP_HAL::UARTDriver* _console,
        AP_HAL::GPIO*       _gpio,
        AP_HAL::RCInput*    _rcin,
        AP_HAL::RCOutput*   _rcout,
        AP_HAL::Scheduler*  _scheduler,
        AP_HAL::Util*       _util)
        :
        uartA(_uartA),
        uartB(_uartB),
        uartC(_uartC),
        uartD(_uartD),
        uartE(_uartE),
        i2c(_i2c),
        spi(_spi),
        analogin(_analogin),
        storage(_storage),
        console(_console),
        gpio(_gpio),
        rcin(_rcin),
        rcout(_rcout),
        scheduler(_scheduler),
        util(_util)
    {}

    virtual void init(int argc, char * const argv[]) const = 0;

    AP_HAL::UARTDriver* uartA;
    AP_HAL::UARTDriver* uartB;
    AP_HAL::UARTDriver* uartC;
    AP_HAL::UARTDriver* uartD;
    AP_HAL::UARTDriver* uartE;
    AP_HAL::I2CDriver*  i2c;
    AP_HAL::SPIDeviceManager* spi;
    AP_HAL::AnalogIn*   analogin;
    AP_HAL::Storage*    storage;
    AP_HAL::UARTDriver* console;
    AP_HAL::GPIO*       gpio;
    AP_HAL::RCInput*    rcin;
    AP_HAL::RCOutput*   rcout;
    AP_HAL::Scheduler*  scheduler;
    AP_HAL::Util*       util;
};

        落实到APM2.8飞控板上,从HAL_AVR_APM2_Class.cpp中可以查看串口的对应关系,同样可以得出只用了前3个,且UART0接USB,UART1接GPS,UART2接数传。源码与飞控板,一个底层,一个上层,“默契”地达成了一致。

HAL_AVR_APM2::HAL_AVR_APM2() :
    AP_HAL::HAL(
        &avrUart0Driver, /* phys UART0 -> uartA */
        &avrUart1Driver, /* phys UART1 -> uartB */
        &avrUart2Driver, /* phys UART2 -> uartC */
        NULL,            /* no uartD */
        NULL,            /* no uartE */
        &avrI2CDriver,
        &apm2SPIDriver,
        &avrAnalogIn,
        &avrEEPROMStorage,
        &avrUart0Driver,
        &avrGPIO,
        &apm2RCInput,
        &apm2RCOutput,
        &avrScheduler,
        &avrUtil )
{}

        如果大家仔细观察上面APM2.8的方框图,可以发现数传和USB接口都是走的UART0,这是为何?因为APM2.8采用了一种MUX复用的方式,使得当数传与USB同时接上的时候,USB会把数传屏蔽,即UART0占主导地位。在此祭出硬件原理图,TS5A23157是一个模拟开关,3DR代表数传。当USB和数传同时接上时,模拟开关会将3DR_RX与RX0接上,3DR_TX与TX0接上,即串口0把数传给屏蔽了。

串口源码分析

        一个串口要发挥作用,首先需要初始化,即配置波特率、设置起始位等操作。对于STM32单片机(用于PIXHAWK),还有串口中断等配置。APM中的Arduino单片机比较简单,只需配置好波特率,其余保持默认即可。

        Arduino程序的初始化,一般在setup()函数中。不出所料,串口的初始化也在其中,见ArduCopter.pde的setup()函数,可以看到初始化函数init_ardupilot()。

void setup() 
{
    cliSerial = hal.console;

    // Load the default values of variables listed in var_info[]s
    AP_Param::setup_sketch_defaults();

    // setup storage layout for copter
    StorageManager::set_layout_copter();

    init_ardupilot();

    // initialise the main loop scheduler
    scheduler.init(&scheduler_tasks[0], sizeof(scheduler_tasks)/sizeof(scheduler_tasks[0]));
}

        在Visual Studio+VMICRO的环境下,按F12或鼠标右键可转到init_ardupilot()的定义,在system.pde的init_ardupilot()中摘出与uartA有关的代码以便分析。

hal.uartA->begin(map_baudrate(g.serial0_baud), 512, 128);,

//gcs[0].init(hal.uartA);

hal.uartA->set_blocking_writes(false);

        第1行和第3行很好理解,分别是uartA设置波特率(115200)和非阻塞模式,第2行的gcs[0]容易让人迷惑。gcs的全称为Ground Control Station,即地面工作站。再转到gcs的定义,可发现其数据类型为GCS_MAVLINK,由此可断定该行代码的作用是绑定Mavlink和uartA,将数据以Mavlink协议与地面站通信。为单独测试串口收发,可取消uartA与Mavlink的绑定,即注释掉gcs所在行的代码。


串口数据收发


        初始化搞定之后,就可以进行简单的串口收发测试——串口助手发数据给飞控,飞控返回原数据。串口的接收一般有2种方式:查询或中断。Arduino中的串口中断函数为SerialEvent,是一种软中断,博主将Arduino nano板中测试通过的串口中断代码移植到APM源码中,发现并不起作用。原因尚不明确,或许 APM板本身并不支持,也可能是博主移植的地方不合适。期待有心人进行尝试,欢迎留言讨论。
        为了推进测试进程,转向查询方式。有2种方式:1.在ArduCopter.pde的fast_loop中查询;2.在UserCode.pde中添加代码。如果要使用UserCode.pde,需在ArduCopter.pde添加相应的宏,才能将UserCode.pde加入编译。为了方便,博主在fast_loop()中添加串口接收查询代码:

static void fast_loop()
{

    // IMU DCM Algorithm
    // --------------------
    read_AHRS();

    // run low level rate controllers that only require IMU data
    attitude_control.rate_controller_run();
    
#if FRAME_CONFIG == HELI_FRAME
    update_heli_control_dynamics();
#endif //HELI_FRAME

    // write out the servo PWM values
    // ------------------------------
    set_servos_4();

    // Inertial Nav
    // --------------------
    read_inertia();

    // 串口接收查询 by--岳小飞
    while (hal.uartA->available())
    {
         uint8_t data = (uint8_t)hal.uartA->read();
         hal.uartA->write(data);
    }

    // run the attitude controllers
    update_flight_mode();

    // optical flow
    // --------------------
#if OPTFLOW == ENABLED
    if(g.optflow_enabled) {
        update_optical_flow();
    }
#endif  // OPTFLOW == ENABLED

}

        打开串口,APM飞控会发出一串提示字符,包括版本信息,如“Init ArduCopter V3.2.1”。博主发送“YueXiaoFei”,飞控原样返回,测试通过。基于这个简单的收发测试,大家可自定义数据协议,发送和接收感兴趣的飞行数据,也可学习基于串口的Mavlink协议。

        PS:无人机系列的第5篇至此结束,系列博客也随之告一段落。就应用方面而言,从入门到编译,从编译到调试,博主尽可能地将问题讲清楚,所有资料免积分下载,也算是为开源贡献自己的一份力吧。博客中可能存在一些小错误,也欢迎大家在评论区批评指正。力有不逮,敬请见谅~


  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APM飞控学习之路:5 串口概述与收发调试 的相关文章

  • APM_ArduCopter源码解析学习(四)——IMU

    APM ArduCopter源码解析学习 xff08 四 xff09 IMU 前言一 system cpp 1 1 无人机内部初始化1 2 Copter init ardupilot 1 3 Copter startup INS groun
  • APM(pixhawk)飞控疑难杂症解决方法汇总

    摘自 xff1a http www nufeichuiyun com p 61 28 APM xff08 pixhawk xff09 飞控疑难杂症解决方法汇总 xff08 持续更新 xff09 by 怒飞垂云2019年11月4日 APM无法
  • pixhawk(APM)重刷固件后需要做的事情(亲测)

    选机型 xff08 不然最后你都校准完也解锁不了 xff0c 电调会一直叫 xff0c 也没法进行电调校准 xff0c 刚刚发现机架类型一设置好 xff0c 电调立马就不叫了 xff0c 说明设置好机型电调就立马有信号了 xff09 地面站
  • pixhawk(APM)与树莓派的接线

    当然我之前也专门写过TX2 树莓派和pixhawk的接线 xff0c 但那时默认用的PX4固件 xff0c 这回是APM固件 见https blog csdn net sinat 16643223 article details 10776
  • 从APM源码分析GPS、气压计惯导融合

    最近事多 xff0c 忙着开源自研飞控 xff0c 现主要工作基本已经完成 xff0c 代码最迟下月中旬开放 xff0c 博客来不及更新 xff0c 还请各位见谅 xff0c 后面会抽空多更的咯 xff01 xff01 xff01 自研飞控
  • PX4 APM ROS MAVROS Gazebo之间关系

    https www cnblogs com yilangUAV p 14476923 html 1 PX4与APM 参考 https bbs amovlab com forum php mod 61 viewthread amp tid 6
  • 【Ardupilot (APM)】 Benewake(北醒) TFmini-i CAN 基于PixHawk的运用说明

    目录 一 前言二 TFmini i CAN 配置三 接线四 飞控参数设定4 1 避障的常用设置4 2 避障测试4 3 定高的常用设置4 4 定高测试 五 常见问题 一 前言 TFmini i CAN PixHawk1 CAN 端口或任何已刷
  • ArduPilotMega (APM) 是市面上最强大的基于惯性导航的开源自驾仪

    http bbs loveuav com thread 54 1 1 html ArduPilotMega APM 是市面上最强大的基于惯性导航的开源自驾仪 特性包括 免费开源固件 xff0c 支持飞机 xff08 34 ArduPlane
  • APM-MP日志分析参数索引

    MP日志分析参数索引 通过 ctrl 43 F 查找获取需要对应参数信息 AP Logger 64 LoggerMessage ADSB ADSB 64 Description Automatic Dependent Serveillanc
  • APM的解锁(ARM)流程

    解锁检测函数 解锁检测函数是arm motors check xff08 xff09 xff0c 作为scheduler每秒运行10此 xff0c 定义在motors cpp中 xff0c 定义如下 define ARM DELAY 20
  • 使用simulink分析APM日志信息

    一 将bin转化成mat文件 使用mission planner将bin文件转化成mat文件 二 将工作区变量转化成timeserial对象 RCIN TimeSerial 61 timeseries RCIN 3 RCIN 2 1e6 三
  • 寻找APM中EKF的五大公式

    EKF核心代码位置 AP NavEKF2 cpp 进入该函数 进入该函数 xff0c 然后可以看到关键部分 xff0c 也即卡尔曼五个公式的地方 下面介绍每个公式的具体位置 28状态值 首先要知道选用的状态值有哪些 xff0c 28状态值
  • APM-MAVROS连接

    1 运行mavros roslaunch mavros apm launch fcu url 61 34 dev ttyUSB0 921600 34 2 读取topic之前先运行以下命令 xff0c 修改飞控广播频率 rosservice
  • APM添加超声模块及定高程序分析

    给飞控添加新的模块 xff0c 通常的做法是写驱动文件 xff0c 然后用uORB订阅消息 xff0c 这种方法已经有文章介绍了 xff0c 下面介绍另一种更加简洁的方法 硬件连接 UARTD xff08 ttyS2 xff09 超声 Bo
  • apm、pixhawk、pixhack飞控航拍后pos数据提取流程

    apm pixhawk pixhack飞控pos数据提取流程 下载日志 打开log分析 区域omap地图验证 验证之前将log文件使用mission planner进行kml验证 筛选相机pos坐标 xff08 选择CAM xff09 很重
  • 【飞控学习】APM和PX4飞控源码下载及安装

    对于无人机开发的专业人员来说 xff0c APM和PX4是现今市面上最强大的2个开源无人机飞控 学习和查看他们2者的源码 xff0c 将会提高我们对整个无人机的姿态解算和控制的深入理解 现在我们就来下载2者的源码和安装查看2者源码的软件 1
  • APM中电机输出分析

    一 APM类分析 老规矩 xff0c 先上类图 xff08 1 xff09 如图 xff08 1 xff09 所示 xff0c AP Motors是大部分电机类的父类 xff0c 是AC AttitudeControl姿态控制类的保护型成员
  • APM:ELK 与 Prometheus

    同为监控应用的两个平台 Prometheus和ELK的对比 ELK和Prometheus的对比 Prometheus ELK 轻量 部署相对简单 较重 组件较多 部署起来较麻烦 使用灵活 需要使用者会灵活运用 上手较为简单 适用于短期使用
  • zipkin接入mysql【windows】

    java jar zipkin jar 这种方式启动数据是保存在内存中的 下面我们配置一下将数据保存到mysql中 创建数据库 CREATE DATABASE zipkin 创建表结构 表结构内容参考以下连接 https github co
  • 一次APM32替换STM32的经历分享

    系列文章目录 这几年相信大家知道STM32系列的芯片价格翻倍的涨 自己玩都快玩不起了 要是用于生产 这得多掏多少钱 所以现在大家都选择了国产芯片 哈哈不能说多差吧 价格你没得说 这是我的一次APM32代替STM32的经历 你是不是也会遇到这

随机推荐

  • Python的main函数

    在 Python 中 xff0c 程序的入口点通常指的是一个特定的函数 xff0c 即 main 函数 这个函数是程序的起点 xff0c 也是程序的入口 xff0c 通过调用 main 函数 xff0c 程序开始执行 在 Python 中
  • CMakeList静态库多层嵌套问题 undefined reference to

    前言 被一个问题缠绕了很长时间 xff0c 这两天花精力好好研究了一下 xff0c 总算解决了 xff0c 翻过来看 xff0c 就是自己不注意造的很多小问题 我的想法是把一些代码封装起来 xff0c 但是有些部分要求能让现场工作同事有一定
  • gazebo仿真环境中 加入传感器

    1 传感器加入自己的模型中需要那些步骤 1 节点说明 xff0c 链接关系 lt robot name 61 test gt lt link name 61 34 link1 34 gt lt link name 61 34 link2 3
  • 以下为Windows NT 下的32 位C++程序,请计算sizeof 的值

    char str 61 Hello char p 61 str int n 61 10 请计算 sizeof str 61 sizeof p 61 sizeof n 61 答案 6 4 4 void Func char str 100 请计
  • vue实现显示10条数据点击查询看更多

    vue实现显示10条数据点击查询看更多 要求如下 当页面的数据超过10条时只显示10条 且显示 点我查看更多喔 每次点击 页面数据增加10条 思路解析 如题 假设有20条数据 只显示10条 点击查看更多按钮 span class token
  • 433和2.4G无线通信比较

    DSSS 2 4G无线数据传输系统优势 一 很正常的升级换代 xff1a 系统工作的长期稳定性和可靠性 xff0c 是一个无线通信系统最重要的指标 由于一般433兆及915兆产品使用的是低频窄带通信技术 xff0c 它们的工作频率范围很窄5
  • Android adb dumpsys 命令总结

    adb shell dumpsys 有哪些命令可以用 xff0c 可以使用adb shell service list来查看 查看package这个service的帮助信息 adb shell dumpsys package h 查看act
  • 在STM32中实现ROS节点——Rosserial的用法

    目录 内容介绍前言生成要移植到stm32的自定义消息和服务生成针对stm32的移植库包roslibs在Mdk中实现C和C 43 43 代码混合编译修改mdk配置修改stm32 ROS通讯接口驱动测试补充说明 内容介绍 本文介绍如何将stm3
  • ubuntu下用apt-get install 安装软件时出现 initramfs-tools错误

    错误提示 xff1a gzip stdout No space left on device E mkinitramfs failure cpio 141 gzip 1 update initramfs failed for boot in
  • ubuntu虚拟机下桥接模式,静态ip上网

    近期使用VM安装了ubuntu12 10玩玩 xff0c 途中也遇到了许多问题 xff0c 安装完成后 xff0c 系统默认是选择NAT连接方式的 xff0c 可以直接通过火狐浏览器上网 xff08 不需任何设置 xff0c 系统自己配置好
  • Windows下安装GTK+(整理)

    以下为网上摘的 xff0c 自己把它整理在了一起 WINDOWS下实现GTK 43 GTKMM的编程 xff08 一 xff09 下载软件包 1 下载dev C 43 43 开发软件 xff08 我的版本是4 9 9 2 xff09 2 下
  • windows gtk+开发环境搭建方法详解(图解)

    GTK 43 开发环境搭建 工欲善其事 必先利其器 首先介绍一下GTK 43 开发环境的搭建 网上很多所谓的GTK的开发环境的搭建基本都是抄来抄去 也不知道有没有人使用他们介绍的方法搭建并编译成功 很不幸的是我使用他们写的方法没有搭建成功
  • GTK在Linux下的安装

    linux gtk 是linux平台下的图形界面开发接口 xff0c 它不同于qt xff0c 它是完全免费的 xff0c Qt是基于c 43 43 的商业开发包 xff0c 涉及版权等问题 xff0c gtk则是基于c的全免费的 xff0
  • android SDK下各目录的用途,以及在不同系统下哪些是通用的。

    Android SDK 目录下有很多文件夹 xff0c 主要都是干什么的呢 1 add ons 这里面保存着附加库 xff0c 比如google Maps xff0c 当然你如果安装了OPhone SDK xff0c 这里也会有一些类库在里
  • Linux系统文件系统基础罗列

    Linux 文件系统是linux的一个十分基础的知识 xff0c 同时也是学习linux的必备知识 本文将站在一个较高的视图来了解linux的文件系统 xff0c 主要包括了linux磁盘分区和目录 挂载基本原理 文件存储结构 软链接硬链接
  • 至今互联网上收集最全的精品教育资源【转载+补充】

    海慧为您奉上 xff01 xff01 xff01 操作指引 xff1a 第一步 xff1a 注册一个360云盘账号 xff0c 注册地址 xff1a yunpan 360 cn xff0c 拥有自己的账号和密码 第二步 xff1a 下载36
  • Linux Android 真机调试配置

    1 USB 链接手机 xff0c 打开USB调试 2 在终端中输入lsusb命令 xff0c 查看USB设备信息 xff0c 找到手机对应的USB信息 eg Bus 002 Device 003 ID 12d1 1035 Huawei Te
  • 【ROS2】类ROS1的rate定时器写法(c++&python例子)

    在ROS2官方教程里 xff0c 代码和ROS1例程有很大不同 xff0c 大部分节点都使用了类的写法 xff0c 并且用到了很多C 43 43 的新功能 其中 xff0c 发布消息是采用了一个定时器timer xff0c 并且注册一个回调
  • C++中STL常用容器的优点和缺点

    我们常用到的STL 容器 有vector list deque map multimap set和multiset xff0c 它们究竟有何区别 xff0c 各自的优缺点是什么 xff0c 为了更好的扬长避短 xff0c 提高程序性能 xf
  • APM飞控学习之路:5 串口概述与收发调试

    云中谁寄锦书来 xff0c 雁字回时 xff0c 月满西楼 当无人机在空中飞翔时 xff0c 从APM飞控到飞手之间有几条看不见的 风筝线 xff08 1 xff09 2 4GHz的遥控 xff1b xff08 2 xff09 433 91