Ardusub源码解析学习(五)——从manual model开始

2023-05-16

Ardusub源码解析学习(五)—— 从manual model开始

  • manual_init()
  • manual_run()


从本篇开始,将会陆续对Ardusub中各种模式进行介绍,stabilize model在系列第一篇博文已经介绍过了(如果有时间考虑再重新写一篇?),这边就直接从手动模式开始介绍吧(因为算是最简单的了...)。
manual model:手动控制模式。Pixhawk烧写进Ardusub固件之后默认都是从这个模式进行启动。顾名思义,该模式下ROV的各种控制直接通过手柄实现,系统将不会自动帮你稳定机器人姿态。

manual_init()

// manual_init - initialise manual controller
bool Sub::manual_init()
{
    // set target altitude to zero for reporting
    pos_control.set_alt_target(0);

    // attitude hold inputs become thrust inputs in manual mode
    // set to neutral to prevent chaotic behavior (esp. roll/pitch)
    set_neutral_controls();

    return true;
}

一般来说,模式控制的程序分为init()和run()两部分,manual模式下的init()函数比较简单,跟stabilize 一样,首先是将期望高度归零。然后将姿态保持输入转变为推力输入,并设置为空挡以防止不必要的震荡和摆动。

如下所示为set_neutral_controls()内部程序。

void Sub::set_neutral_controls()
{
    uint32_t tnow = AP_HAL::millis();

    for (uint8_t i = 0; i < 6; i++) {
        RC_Channels::set_override(i, 1500, tnow);
    }

    // Clear pitch/roll trim settings
    pitchTrim = 0;
    rollTrim  = 0;
}

manual_run()

// manual_run - runs the manual (passthrough) controller
// should be called at 100hz or more
void Sub::manual_run()
{
    // if not armed set throttle to zero and exit immediately
    if (!motors.armed()) {
        motors.set_desired_spool_state(AP_Motors::DesiredSpoolState::GROUND_IDLE);
        attitude_control.set_throttle_out(0,true,g.throttle_filt);
        attitude_control.relax_attitude_controllers();
        return;
    }

    motors.set_desired_spool_state(AP_Motors::DesiredSpoolState::THROTTLE_UNLIMITED);

    motors.set_roll(channel_roll->norm_input());
    motors.set_pitch(channel_pitch->norm_input());
    motors.set_yaw(channel_yaw->norm_input() * g.acro_yaw_p / ACRO_YAW_P);
    motors.set_throttle(channel_throttle->norm_input());
    motors.set_forward(channel_forward->norm_input());
    motors.set_lateral(channel_lateral->norm_input());
}

前面部分和stabilize model一致(具体看这里),来说说后面的set_xxx()部分好了。注意该形式函数是对输入通道进行设置,分别为横滚、俯仰、偏航、沉浮、前后平移和左右平移6个通道,注意每个通道可以对应多个电机(具体看这里)。括号内输入的参数要求范围在-1~1之间。

那么重点来看一下内部的norm_input()。这个函数位于库中的RC_Channel.cpp中(注意RC_Channel.cpp用于控制单个通道,而RC_Channels.cpp用于批量控制多个通道)。

简单来说,这段程序首先判断是否将通道输入反向,并根据结果将值赋给reverse_mul 这个变量。然后对通道输入的值进行限幅和计算,并将输入值radio_in转换为-1~1之间的输出量,输出量偏离0值的大小表示希望尽快向某一方向进行运动。

float RC_Channel::norm_input() const
{
    float ret;
    int16_t reverse_mul = (reversed?-1:1);
    if (radio_in < radio_trim) {
        if (radio_min >= radio_trim) {
            return 0.0f;
        }
        ret = reverse_mul * (float)(radio_in - radio_trim) / (float)(radio_trim - radio_min);
    } else {
        if (radio_max <= radio_trim) {
            return 0.0f;
        }
        ret = reverse_mul * (float)(radio_in - radio_trim) / (float)(radio_max  - radio_trim);
    }
    return constrain_float(ret, -1.0f, 1.0f);
}

在同一文件中的变量表中可以找到对应值

    // @Param: MIN
    // @DisplayName: RC min PWM
    // @Description: RC minimum PWM pulse width in microseconds. Typically 1000 is lower limit, 1500 is neutral and 2000 is upper limit.
    // @Units: PWM
    // @Range: 800 2200
    // @Increment: 1
    // @User: Advanced
    AP_GROUPINFO("MIN",  1, RC_Channel, radio_min, 1100),

    // @Param: TRIM
    // @DisplayName: RC trim PWM
    // @Description: RC trim (neutral) PWM pulse width in microseconds. Typically 1000 is lower limit, 1500 is neutral and 2000 is upper limit.
    // @Units: PWM
    // @Range: 800 2200
    // @Increment: 1
    // @User: Advanced
    AP_GROUPINFO("TRIM", 2, RC_Channel, radio_trim, 1500),

    // @Param: MAX
    // @DisplayName: RC max PWM
    // @Description: RC maximum PWM pulse width in microseconds. Typically 1000 is lower limit, 1500 is neutral and 2000 is upper limit.
    // @Units: PWM
    // @Range: 800 2200
    // @Increment: 1
    // @User: Advanced
    AP_GROUPINFO("MAX",  3, RC_Channel, radio_max, 1900),

    // @Param: REVERSED
    // @DisplayName: RC reversed
    // @Description: Reverse channel input. Set to 0 for normal operation. Set to 1 to reverse this input channel.
    // @Values: 0:Normal,1:Reversed
    // @User: Advanced
    AP_GROUPINFO("REVERSED",  4, RC_Channel, reversed, 0),
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ardusub源码解析学习(五)——从manual model开始 的相关文章

  • 模型中的 Ruby on Rails 增量计数器

    我正在尝试从另一个模型增加我的用户表中的计数器 class Count lt ActiveRecord Base belongs to user after create update count def update count user
  • 关闭 Rails 中的“updated_at”列

    我有一个简单的 日志 模型 它记录调用控制器操作的事实 该 日志 记录的条目应该创建一次并且永远不会更改 另外 我的数据库中会有很多这样的记录 因此 不需要 updated at 列 不需要浪费硬盘上的内存 我如何告诉 Rails 仅保留
  • Rails 在模型中验证值在数组内

    我有一个表格 我可以在其中传递一个字段命名 type我想要检查它的值是否在允许类型的数组内以便任何人不得发布不允许的类型 数组看起来像 allowed types type1 type2 type3 type4 type5 type6 ty
  • Rails 4 模型子文件夹

    我在 app models request book 文件夹中创建了模型 但 Book Request Status table name 返回表名称 statuses book request statuses 是正确的表名称 如何获得正
  • ASP.NET MVC 中与嵌套子模型和 PartialView 的模型绑定

    我有以下类型和类 namespace MVC Models public class Page public EditableContent Content get set public class EditableContent publ
  • Rails:是否可以向 has_and_belongs_to_many 关联添加额外的属性?

    我的意思是 如果我有两个模型 通过 has and belongs to many 关联连接 我可以在每个关联的连接表中存储其他数据吗 也就是说 额外的数据不会成为任一表中单个记录的一部分 而是它们之间的连接 我的实际模型如下 class
  • 使用ActiveRecord,有没有办法在after_update期间获取记录的旧值

    使用一个简单的示例进行设置 我有 1 张桌子 Totals 保存了总和amount第二个表中每条记录的列 Things When a thing amount更新后 我想简单地将旧值和新值之间的差异添加到total sum 现在我正在减去s
  • 为树视图创建 Qt 模型

    我正在用 Qt 使用 C 编写一个应用程序 我需要在树视图中表示一个对象结构 实现此目的的方法之一是为此创建一个模型 但在阅读有关该主题的 Qt 文档后我仍然很困惑 我的 结构 非常简单 有一个Project持有的物体Task中的对象std
  • (Django) (外键问题) model.person_id 不能为 NULL

    我知道这在 Django 圈子里似乎是一个被过度询问的问题 但我不敢说我 还没有找到解决方案 我的模型 from djago import User class InfoPersonal models Model person models
  • 在 Ember 中将模型属性插入 Img 元素 URL

    我有一个模型image id财产 我有一个包含图像元素的模型视图 我需要将 id 插入图像元素的src属性来完成图像的 URL 以便我有效地执行此操作 img src 我的第一次尝试使用了 Handlebars 助手 img src 但这也
  • 过滤 Django 管理选择框的模型结果

    我今天刚开始使用 Django 到目前为止发现做简单的事情相当困难 我现在正在努力解决的是过滤状态类型列表 StatusTypes 模型是 class StatusTypes models Model status models CharF
  • Laravel 中如何返回数组而不是集合?

    在 Laravel 中 可以仅选择一个字段并将其作为集合 数组返回 例如考虑模型Foo链接到表foos其中有字段id a b c 考虑以下示例数据 1 10 15 20 1 12 15 27 1 17 15 27 1 25 16 29 1
  • 使用枚举名称而不是值对 Pydantic 字段进行编码

    我有一个枚举类 class Group enum Enum user 0 manager 1 admin 2 我有一个 pydantic 模型 class User BaseModel id int username str group G
  • 如何在MVC模型中编写可重用的业务逻辑?

    我的问题是我们尝试使用 MVC PHP 框架 经过多次讨论后 我认为 MVC 非常好 但我缺少编写可重用模型 应用程序 逻辑的可能性 因此 我不确定我们是否有正确的方法在 MVC 框架中实现我们的软件 首先 我将描述我们目前使用的非 MVC
  • 如何在模型 Django 中创建必需:布尔字段

    我有一个模型 其中有一个名为的字段is student and is teacher Student and Teacher forms is teacher models BooleanField teacher status defau
  • 将 ActiveAdmin 用户与现有用户模型合并

    我在项目早期就设置了 ActiveAdmin 并使用了默认值admin users认证模型 从那以后 我使用 Devise 建立了一个单独的用户模型 并意识到合并两个表可能会更明智 这样管理员就可以在 Activeadmin 和站点前端中进
  • {“error”:“服务签名名称:在签名定义中找不到“serving_default””}

    我使用GCP 谷歌云平台 来训练我的模型 我可以导出导出的模型 我使用了该模型并使用了服务 1 8 CPU 的 Tensorflow 的本地 docker 映像 我得到以下结果作为 REST 后调用的输出 错误 服务签名名称 serving
  • Django 模型:如何使用 mixin 类来覆盖 django 模型以实现 save 等功能

    我想在每次保存模型之前验证值 所以 我必须重写保存函数 代码几乎是一样的 我想把它写在 mixin 类中 但失败了 我不知道如何写 super func 我英语不好 抱歉 class SyncableMixin object def sav
  • 同一数据库的多个实体框架

    我们可以在项目中为同一个数据库创建多个实体框架吗 我想为每个子系统创建实体框架 一些子系统具有共享表 这是可能的 您可以根据需要创建多个 EDMX 文件 但不建议这样做 因为 您不能查询不同模型中的多个表 定义边界将非常困难 因为大多数表都
  • 部分视图内的 ValidationSummary 未显示错误

    我有这样的部分观点 简化 model Portal Models LoginModel div class login container k block section class using Html BeginForm actionN

随机推荐

  • 驱动程序开发:SPI设备驱动

    目录 Linux下SPI驱动简介SPI架构概述SPI适配器 xff08 控制器 xff09 SPI设备驱动spi driver注册示例SPI 设备和驱动匹配过程编写imc20608六轴传感器SPI驱动设备树编写操作具体的imc20608驱动
  • 操作系统知识点(二)

    文章目录 内存管理程序执行过程内存保护 连续分配非连续分配基本分页存储管理方式基本分段存储管理方式段页式存储管理方式 虚拟内存局部性原理请求分页存储管理 内存管理 内存管理 Memory Management 是操作系统设计中最重要和最复杂
  • VR行业发展的前景和现状?

    标题 VR行业发展的前景和现状 xff1f 1 一个新事物的产生 xff0c 总是伴随着看好和唱衰两种声音 这两种态度自然有其可以理解的地方 xff0c 因为摆在我们面前的是未知 xff0c 而坐在餐桌前的两拨人 xff0c 站在不同的角度
  • 头文件与库的区别

    昨天突然问了一下什么是头文件 xff0c 我一听就傻了 xff0c 虽然上课的时候老师在讲编译的四个过程的时候说了一下 xff0c 但是还是不太理解 xff0c 我们知道编译过程中的预处理阶段会进行头文件展开 xff0c 宏替换以及条件编译
  • 进程、线程

    线程 xff08 thread xff09 线程其实是操作系统能够进行运算调度的最小单位 它是被包含在进程之中的 xff0c 是进程中的实际运作单位 一条线程指的是进程中一个单一顺序的控制流 xff0c 一个进程中可以并发多个线程 xff0
  • 基于Zynq7020双千兆以太网的数字信号处理板设计

    一 背景 背景 Xilinx公司在2010年发布了可扩展的处理器平台Zynq7000系列 xff0c 它采用了28nm工艺 xff0c 将FPGA与ARM cortex A9集成在一颗芯片上 xff0c 实现了高性能 高集成度 低功耗 Zy
  • 深入理解JS中的变量作用域

    在 JS 当中一个变量的作用域 xff08 scope xff09 是程序中定义这个变量的区域 变量分为两类 xff1a 全局 xff08 global xff09 的和局部的 其中全局变量的作用域是全局性的 xff0c 即在 JavaSc
  • 硬件工程师,从零开始无人机开发。

    毕业已经五年了 xff0c 一直在杭州某大厂 xff0c 做无人机硬件开发 无人机这块 xff0c 我进去的时候大厂刚开始 做 xff0c 有幸参与到整个无人机的硬件开发 我这个刚毕业的技术小白 xff0c 在这五年间成长了很多 无奈 今年
  • 个人总结:板球控制系统之串级PID整定方法,速度环与位置环,40S任务10S完成

    其实单环我们先出了所有题目 xff0c 但是效果显然没有串级PID的效果好 xff0c 有人需要的话可以把程序包发出来 xff0c 板球运行视屏也有 另外 xff1a 天下舵机参差不齐 xff08 哪怕型号相同 xff09 xff0c 想要
  • 树莓派3B+踩坑记录:一、安装Ubuntu Mate

    树莓派3B 43 踩坑记录 xff1a 一 安装Ubuntu Mate 树莓派 xff0c Ubuntu xff0c ROS硬件准备软件准备系统烧录安装Ubuntu Mate更换国内源网络配置开启ssh远程其他彩虹屏解决方案XShell和X
  • PointNet代码详解

    PointNet代码详解 最近在做点云深度学习的机器人抓取 xff0c 这篇博客主要是把近期学习PointNet的一些总结的知识点汇总一下 PointNet概述详见以下网址和博客 xff0c 这里也就不再赘述了 三维深度学习之pointne
  • 卡尔曼滤波通俗易懂的解释

    关于卡尔曼滤波 xff0c 网上的资料很多 xff0c 但是有很大一部分都是不断堆叠公式 xff0c 然后用各种晦涩难懂的专业术语进行解释 xff0c 说实话我刚开始看的时候也是云里雾里 xff0c 因此写下这篇博客是为了照顾和我一样的萌新
  • STM32通过PWM控制ESC30C电调

    最近在搞一个水下推进器 xff0c 这东西的控制其实跟四旋翼的螺旋桨控制差不多 但我也是第一次用STM32板子来控制电调驱动桨叶旋转 xff0c 因此踩了很多坑 网上找了很多资料 xff0c 但是很多都写的不是很清楚 xff0c 这边稍微记
  • STM32F7同一定时器多路输出PWM波通道之间相互影响问题

    2020 8 12更新 这次用Cube直接生成PWM控制代码 xff0c 然后再RT Thread Studio上编写程序 xff0c 发现可实现TIM1和TIM8的8路PWM波调控 xff0c 因此上面论述的问题可能是自己在写底层时有某些
  • Ardusub源码解析学习(一)——Ardusub主程序

    APM Sub源码解析学习 xff08 一 xff09 Ardusub主程序 前言一 准备工作二 Ardusub cpp解析2 1 scheduler table2 2 schedulerget scheduler tasks setup
  • Ardusub源码解析学习(二)——电机库

    Ardusub源码解析学习 xff08 二 xff09 电机库学习 一 RC输入与输出1 1 RC Input1 2 RC Output 二 电机库学习2 1 setup motors 2 2 add motor raw 6dof 2 3
  • Ardusub源码解析学习(三)——车辆类型

    APM Sub源码解析学习 xff08 三 xff09 车辆类型 一 前言二 class AP HAL HAL三 class AP Vehicle3 1 h3 2 cpp 四 class Sub4 1 h4 2 cpp 五 总结 一 前言
  • 年度回忆录(2012.10----2013.01)

    寒假结束了 xff0c 年也过完了 xff0c 提前回来一天就开始着手补上这迟到的年终总结 xff0c 写了一个多星期还觉得有些东西没有写出来 xff0c 无奈 xff0c 点到为止吧 2012 年的后半年经历了很多 xff0c 收获了很多
  • Ardusub学习——飞行模式

    参考资料 xff1a Ardusb官方手册 Sub Rework joystick input and pilot input in general Flight Modes Ardusub支持多种飞行模式 xff0c 但是其中一部分需要有
  • Ardusub源码解析学习(五)——从manual model开始

    Ardusub源码解析学习 xff08 五 xff09 从manual model开始 manual init manual run 从本篇开始 xff0c 将会陆续对Ardusub中各种模式进行介绍 xff0c stabilize mod