Apm飞控学习笔记之添加我的设备或单片机-Cxm

Posted CHENxiaomingming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apm飞控学习笔记之添加我的设备或单片机-Cxm相关的知识,希望对你有一定的参考价值。

目录

PX4/APM/飞控的学习笔记前言-Cxm_chen_taifu的博客-CSDN博客开始了 开始了终于有时间可以学习飞控了此文章是用来当目录,我会持续更新我的学习之旅,希望能对各位有所帮助如果有错误的地方还请各位大佬不吝赐教,可以在评论区回复相关问题来交流。此帖持续更新...https://blog.csdn.net/chen_taifu/article/details/122115245?spm=1001.2014.3001.5502在前一章我们说了如何在飞控中添加自己的代码让他跑起来,这一章我们要添加自己的负载设备从而实现和飞控之间的通信。具体作用看自己需要什么功能,飞行控制,飞机状态读取等都可以实现。

首先一个完整的功能最好是具备有自己的架构我们这边可以先看一下其他的例程,还是4.07版本的Apm源码 

librariesAP_Devo_Telem 这个例程 

我们直接展示一波传统复制粘贴这个文件夹 改个名叫AP_Flycontrol 并且吧 .cpp和.h  文件也同样改名,放进去 librariesAP_Flycontrol  

librariesAP_FlycontrolAP_Flycontrol.h        具体功能看注释

/*

2022/2/13
@CHENxiaomingming
e-mail:2210138207@qq.com

*/
#pragma once

#include <AP_HAL/AP_HAL.h>
#include <AP_AHRS/AP_AHRS.h>
#include <AP_SerialManager/AP_SerialManager.h>

class AP_Flycontrol
public:
    AP_Flycontrol();
    void uart(void);
    bool updata();
private:
    
;

然后是cpp文件 librariesAP_FlycontrolAP_Flycontrol.cpp

/*

2022/2/13
@CHENxiaomingming
e-mail:2210138207@qq.com

功能:
通信协议
数据校验成功 地面站显示 data ok 
*/

#include <stdio.h>
#include <GCS_MAVLink/GCS.h>    //地面站
#include "AP_Flycontrol.h"

extern const AP_HAL::HAL& hal;

//重置数据和串口
AP_Flycontrol::AP_Flycontrol(void)

    ;

//串口配置
void AP_Flycontrol::uart(void)
          
        hal.uartD->begin(9600);
         //hal.uartD->print("uart set ok");    //串口设置成功
         gcs().send_text(MAV_SEVERITY_CRITICAL,  //地面站消息发送
                "uart set ok");

 
//数据更新
bool AP_Flycontrol::updata()

    //uart();
    uint8_t _uart_data;
    uint8_t _flag = 0;
    int16_t i;
    uint8_t scope = hal.uartD->available();     //check if any bytes are waiting

        for(i = 0; i < scope; i++)
        
            _uart_data = hal.uartD->read();     //获取当前数据
            switch (_flag)
            
            case 0:
                if (_uart_data == 0x52)
                    _flag = 1;
                break;
            case 1:
                if (_uart_data == 0x31)
                    _flag = 2;
                break;
            case 2:
                gcs().send_text(MAV_SEVERITY_CRITICAL,
                    "data ok");
                _flag = 0;
                return 1;
                break;

            default:
                _flag = 0;
                break;
            
        
    return 0;

里面有牵扯到一些串口函数 不清楚的可以去官网看 然后自己试试

UARTs and the Console — Dev documentationhttps://ardupilot.org/dev/docs/learning-ardupilot-uarts-and-the-console.html

后面代码过长我就直接截图吧

然后就是第一章节的内容啦  ArduCopterCopter.h 

声明函数

指向类

 

ArduCopterCopter.cpp 

最后运行调试的过程中我遇见了很多问题

包括了Initialising APM  地面站报错阿一大堆

都是因为线程的配置 和串口问题 和资源占用 一定要注意占用过高很可能导致未知问题出现

 

因为他每次都是重新执行这个线程 在ArduCoptersystem.cpp这里面  处理的只需要执行一次的数据 

在void Copter::init_ardupilot() 飞控初始化里面 

 

最后就是 一定要吧自己写的模块添加进ArduCopterwscript这一点很重要,很重呀否则就会

undefined reference to 这个卡了我两天

#!/usr/bin/env python
# encoding: utf-8

def build(bld):
    vehicle = bld.path.name
    bld.ap_stlib(
        name=vehicle + '_libs',
        ap_vehicle=vehicle,
        ap_libraries=bld.ap_common_vehicle_libraries() + [
            'AC_AttitudeControl',
            'AC_InputManager',
            'AC_PrecLand',
            'AC_Sprayer',
            'AC_Autorotation',
            'AC_WPNav',
            'AP_Camera',
            'AP_IRLock',
            'AP_InertialNav',
            'AP_Motors',
            'AP_RCMapper',
            'AP_Avoidance',
            'AP_AdvancedFailsafe',
            'AP_SmartRTL',
            'AP_Stats',
            'AP_Beacon',
            'AP_Arming',
            'AP_WheelEncoder',
            'AP_Winch',
            'AP_Follow',
            'AP_Devo_Telem',
            'AP_OSD',
            'AC_AutoTune',
            'AP_KDECAN',
            'AP_Flycontrol',    //添加到这里
        ],
    )

    bld.ap_program(
        program_name='arducopter',
        program_groups=['bin', 'copter'],
        use=vehicle + '_libs',
        defines=['FRAME_CONFIG=MULTICOPTER_FRAME'],
        )

    bld.ap_program(
        program_name='arducopter-heli',
        program_groups=['bin', 'heli'],
        use=vehicle + '_libs',
        defines=['FRAME_CONFIG=HELI_FRAME'],
        )

最后编译 和烧录 

校验成功

 

 

 

 

以上是关于Apm飞控学习笔记之添加我的设备或单片机-Cxm的主要内容,如果未能解决你的问题,请参考以下文章

Apm飞控学习笔记之添加我的飞行模式-Cxm

Apm飞控学习笔记之添加我的飞行模式-Cxm

Apm飞控学习笔记之如何添加自己的功能-Cxm

Apm飞控学习笔记之如何添加自己的功能-Cxm

Apm飞控学习笔记之悬停loiter模式-Cxm

Apm飞控学习笔记之悬停loiter模式-Cxm