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的主要内容,如果未能解决你的问题,请参考以下文章