乐迪AT9S遥控器

摇杆校准方法link
什么是遥控器通道? 遥控器发出的指令数。link
channel_5默认是遥控器的F;
点end看通道;

APP遥控器

yaw通道:-1~+1,默认0;
throttle通道:0~+1,默认0.5;
8通道:0,0.15,0.95好像

Mcontroller cpplibrary

  1. accelCalibrator:加速度校准
  2. ahrs:航姿参考系统(9轴imu),采用DCM(方向余弦矩阵方法)或EKF(扩展卡尔曼滤波方法)预估飞行器姿态。
  3. attitude_multi:多旋翼姿态控制相关库
  4. compassCalibrator:磁罗盘校准
  5. ekf_baro:卡尔曼滤波——气压计;ekf_gnss:GPS;ekf_odometry:里程计;ekf_rangefinder:声呐和红外测距传感器的交互库
  6. LowPassFilter:低通滤波器;LowPassFilter2p:二阶低通滤波器
  7. flash:写SD卡
  8. math:一些数学算法;common:基本的函数;geodesicgrid:测地线算法,即计算曲面两点局部最短路径;location:从GPS获取地理位置;math_inc:分型图形库数学函数;matrix3:33矩阵类;matrixN:NN矩阵类;quaternion:四元数类;rotations:特殊旋转角的宏定义;vector2:二维向量;vector3:三维向量;vectorN:N维向量
  9. motors:电机类
  10. pid:pid算法;p:只有kp环节的控制算法;pid_2d:二维平面运动的pid控制;pid:包含kp、ki、kd环节的控制算法
  11. position:位姿控制
  12. sdlog:sd卡日志
  13. uwb:uwb基站定位
  14. Common:所有执行文件和其他库都需要的基础核心库。
  15. HAL:硬件抽象层库,提供给其他高级控制代码一致的接口,而不必担心底层不同的硬件(例如stm32)。
  16. MAVLink:地面站通信、飞行日志

飞机坐标系

右手系,x方向是mcontroller到usb口方向,z方向指向大地。

真的是太难理解这代码了,也不写类图。今天又是被打败的一天

头文件变量定义

参考链接

坐标系定义

dcm_matrix:地球坐标系到机体坐标系的旋转矩阵,XYZ固定角,即

例如yaw=-101时候的dcm_matrix:
-0.261037,0.965124,0.019878
-0.965249,-0.260695,-0.018238
-0.012420,-0.023948,0.999636

控制电机

1. 电机控制方式

Mcontroller控制电机的方式是,改变接入电调的PWM波脉宽1000~2000来实现。
PWM波概念中有占空比、脉宽、频率,Mcontroller默认频率400Hz,可以改脉宽。

Motor_Set_Value(i, 脉宽);

然后烧录代码,连接遥控器/app,解锁电机。但注意在freertos.c中注释掉这一行。

2. 电机自解锁设置方法

如果是默认模式,即app按下解锁键(channel8)才能解锁电机,可以看一下源码:
在freertos.c的Loop100hzTask函数中调用了lock_motors_check函数,而lock_motors_check函数调用了unlock_motors函数。

如果不想用遥控器/app,只想上电就解锁电机,那么用一下方法:

  1. 在 Clibrary/hal.h 中声明自定义的 init 函数,我写的是 void wcz_init(void);
  2. 在 Maincontroller/Maincontroller.cpp 中实现自定义的 init 函数,并写入以下代码:
 // enable output to motors and servosset_rcout_enable(true);FMU_PWM_Set_Output_Enable();motors->set_interlock(true);FMU_LED4_Control(false);FMU_LED7_Control(true);

  1. 在 Core/src/freertos.c 的 void InitTask(void *argument) 函数内填入自定义的 init 函数,如下。注意添加位置在osThreadTerminate 函数之前。

  2. 在 Core/src/freertos.c 的 Loop100hzTask() 函数中注释掉 lock_motors_check() 函数,原因是此函数会查找遥控器/app是否发来电机解锁消息,与我们自定义解锁相冲突。

  3. 在 Core/src/freertos.c 的 Loop400hzTask() 函数中注释掉 mode_update(); 因为我们还没把自定义的运动模式写进去,因此先不写。

电调操作

https://blog.csdn.net/lqj11/article/details/108544892?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%BC%96%E7%A8%8B%E6%8E%A7%E5%88%B6%E7%94%B5%E8%B0%83&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-108544892.142v32pc_rank_34,185v2control&spm=1018.2226.3001.4187

电调概念:
https://blog.csdn.net/sinat_16643223/article/details/112302701?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166107128116781647524184%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166107128116781647524184&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-112302701-null-null.142v42pc_ran_alice,185v2control&utm_term=%E7%94%B5%E8%B0%83&spm=1018.2226.3001.4187

好盈60A电调使用说明书
https://blog.csdn.net/qq_41138470/article/details/103714386?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166107128116781647555727%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166107128116781647555727&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v33_ecpm-12-103714386-null-null.142v42pc_ran_alice,185v2control&utm_term=%E7%94%B5%E8%B0%83&spm=1018.2226.3001.4187

关于解锁概念

Mcontroller对电机解锁有两个描述,一个是lock,一个是arm。
lock指的是app右上角的小锁,arm指的是左手下拉油门右手右拉油门这种方式。
结果是M1口unlock前无输出,unlock后输出400Hz、占空比40%、脉宽1000us的PWM波。
然后arm后默认输出占空比44.7%左右的PWM(即赋予电机初始转速)。

关于保存SD卡数据

在完成保存SD卡数据函数(Logger_Cat_Callback和Logger_Data_Callback)后烧录程序。
Mcontroller插入≤32G的SD卡,上电,然后连接app,先unlock,然后arm,然后unarm,完成保存数据的一个循环。Mcontroller从电机解锁到重新锁定期间为一个完整的日志生命周期。这个过程中可以看到app右上角的sd卡图标颜色“灰-绿-灰”。

串口收发大疆电机can总线信息

这是半年前写的代码,当时没写教程现在就忘了,并且Mcontroller源码也改了不少,取消了串口回调函数,需要自己写。
由于Mcontroller没有can口,因此需要外接一个can转TTL串口模块到TX\RX。我购买的can转ttl模块链接,拨码开关SW2(波特率1M)和SW4(透传)打开,模块的T接下个设备的R,R接T。缺点是好像发送频率要低点,脉宽不够。
例如接到T1和R1,之后通过修改/Core/Src/freertos.c中InitTask内的config_comm()函数即可完成对应串口的模式配置,例如把第二个参数(串口1)改成DEV_COMM。当然如果想用usb_print来显示结果的话,可以把第一个参数(串口0)改成DEV_COMM.
大疆电调C610额定供电24V,实测用4~6S电池也能用。首先按照说明书设置C610从站号如下。

CAN通讯协议:

发送can信息频率为1kHz(有点高啊)。下面开始收发电机控制指令,依靠改变电流值进行。至于需不需要对收到的数据进行滤波不清楚。

  1. 接受串口数据
  2. 按照CAN通信协议读取信息
  3. 更新电机状态。这里电流值和转速都是有符号整型uint16_t的。
  4. PID计算电机电流
  5. 发送电机电流信息

延时

vTaskDelayUntil, 详见链接https://blog.csdn.net/wwwlyj123321/article/details/118637117

多模式切换(common.cpp)

  1. ROBOT_STATE 数据类型含义:
    飞行状态(STATE_FLYING)和自定义状态(STATE_DRIVE)。还有飞行状态的子状态,例如起飞降落爬升停止等等。
    变量 robot_state:机器人当前状态
    变量 robot_state_desired:决定了robot_main_mode,保证必须停止状态后才能进入无人车模式

  2. ROBOT_SUB_MODE 数据类型含义:
    机器人具体运动模式,例如飞行模式有自稳、定高、定点、导航模式,还有自定义模式下的飞轮起立滚动转向地面运动模式。
    变量 robot_sub_mode:相当于channel6,机器人具体运动模式,连接到maincontroller文件夹里的各种具体运动线程函数。

  3. ROBOT_MAIN_MODE 数据类型含义:
    机器人主模式,有空中机器人模式,麦轮车模式,蜘蛛机器人模式,UGV自动驾驶车模式。
    变量 robot_main_mode:相当于channel5,用来结合channel6改变robot_sub_mode。

Mcontroller学习过程相关推荐

  1. 开源WebGIS架构

    开源WebGIS架构 目前国际上著名的地理空间信息生产商大都拥有了成熟的产品线, 基本涵盖了从数据采集.数据编辑.数据管理.空间数据互操作.空间分析到网络地理信息服务注册.发布.聚合等所有地理信息工程 ...

  2. 目标检测中如何定义正负样本,和正负样本在学习过程中loss计算起的作用

    如何定义正负样本,和正负样本在学习过程中loss计算起的作用 正负样本定义 分类和回归head如何学习和利用划分后的正负样本(loss如何计算) 正负样本在分类中loss计算的处理 正样本在bbox ...

  3. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  4. 用反向传播算法解释大脑学习过程?Hinton 等人新研究登上 Nature 子刊

    机器之心报道 魔王.Jamin.杜伟 反向传播可以解释大脑学习吗?近日 Hinton 等人的研究认为,尽管大脑可能未实现字面形式的反向传播,但是反向传播的部分特征与理解大脑中的学习具备很强的关联性.该 ...

  5. 小孩子如何学会语言?科学家使用计算机模型解释儿童语言学习过程

    来源:学术头条本文约2500字,建议阅读5分钟 本文介绍了小孩学会语言的过程以及科学家如何依托计算机程序对其进行预测. 人类的交流能力可谓是动物王国中其他物种所无与伦比的,语言允许人们以独特的方式进行 ...

  6. 心得丨走过最长的路,就是机器学习过程中的弯路

    营长的一位转型AI的朋友,最近对营长抱怨,"走过的最远的路,就是机器学习过程中的弯路",然后开始各种blablabla,从论文的坑,到模型的坑,再到培训的坑...一路吐槽. 尤其是 ...

  7. linux 学习过程中的坑之 find 正则表达式

    1 标准的正则表示式 格式 . 表示任意单个字符 * 表示任意次数 + 表示1次或1次以上 {3} 表示精确匹配次数为3次 {n,m}表示n次到m 次之间 ^ 行首锚定 $行尾锚定 \< 单词首 ...

  8. 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(一)

    这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000005040834 突然想起来我这个博客冷落了好多年了,也该更新一下,呵 ...

  9. GraphQL学习过程应该是这样的

    记录一个从枯燥学习 GraphQL 的过程,到发现项目 Gitter,模仿项目 Github-Trending-API,最后做一个自己的学习项目 Github-Trending-GraphQL. 一开 ...

最新文章

  1. python处理 ctrl+c
  2. ubuntu java7安装_Ubuntu下安装配置 JDK 7
  3. 142-练习8和9 for循环的嵌套调用和随机数的生成
  4. 如何给Linux操作系统(CentOS 7为例)云服务器配置环境等一系列东西
  5. 【HDU - 6187】Destroy Walls(思维,最大生成树)
  6. 《SpringCloud超级入门》使用Eureka编写服务消费者《十一》
  7. 光骓者的荣耀(洛谷P5638题题解,弃坑Java拥抱C++)
  8. rubyinstaller官网无法访问的解决办法
  9. 最简单的 Django 教程
  10. 我的小程序之个人所得税计算器
  11. 打开Adobe Premiere Pro提示“由于找不到msvcp110.dll,无法继续执行代码。重新安装程序可能会解决此问题”。【方法适用于几乎所有dll文件丢失时】
  12. C51/C52单片机printf打印出来的值是原来值的256倍
  13. Frida Hook Android App 进阶用法之 Java 运行时
  14. Diagnosing OSGi uses conflicts
  15. 综述 | 语义分割经典网络及轻量化模型盘点
  16. 英语知识系列:按发音规律重排的英语音标
  17. 简单、强大的swig.js
  18. iphone ios 视频拍摄旋转
  19. 【分子结构】原子结构总结——2015年9月12日
  20. 基于stm32的DHT11、光照强度、烟雾浓度、振动频率的proteus仿真(全网第一)

热门文章

  1. Java实现登录注册
  2. 48个Dreamweaver超级实用技巧。
  3. 机械行业ERP选型的两大原则
  4. 【LOJ520】「LibreOJ β Round #3」绯色 IOI(开端)
  5. task host window阻止关机该怎么办?
  6. DB2 “The transaction log for the database is full” 问题及解决办法
  7. BIM软件工具选择顺手——事半功倍
  8. 谈谈我和优化云公司合作的那些事
  9. mysqlplus 批量插入_mybatis+mysql批量插入和批量更新
  10. 云闪付小程序Vue授权组件只兼容Vue2,改造兼容Vue3版本