当前位置: 首页 > article >正文

Ardusub源码剖析——control_manual.cpp

代码

#include "Sub.h"

// manual_init - initialise manual controller
bool Sub::manual_init()
{
    // set target altitude to zero for reporting
    pos_control.set_pos_target_z_cm(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;
}

// 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());
}

剖析

Sub::manual_init()

#include "Sub.h"

代码包含 Sub 类的定义,以便在这个源文件中使用 Sub 类及其成员函数和成员变量。

// manual_init - initialise manual controller
bool Sub::manual_init()
{

manual_init 函数声明。它是一个成员函数,属于 Sub 类,不接受任何参数,并返回一个布尔值(bool)。返回值用来指示初始化是否成功,在这个例子中,函数总是返回 true

    // set target altitude to zero for reporting
    pos_control.set_pos_target_z_cm(0);

设置位置控制系统的目标高度为0厘米。

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

在手动模式下,原本用于姿态保持的输入现在变成了推力输入。为了避免在手动控制模式下出现混乱的行为(特别是横滚和俯仰),需要将控制输入设置为中性。调用 set_neutral_controls 函数,它负责将所有控制输入设置为中性。这意味着没有横滚、俯仰或偏航的输入,从而确保潜水器在手动控制开始时保持稳定,不会出现突然的动作。

    return true;

返回 true,表示手动控制初始化成功。

Sub::manual_run()

// manual_run - runs the manual (passthrough) controller
// should be called at 100hz or more
void Sub::manual_run()
{

这是 manual_run 函数的声明和注释。注释说明了这个函数的作用是运行手动控制器,并且建议该函数应该以至少100Hz的频率被调用。

    // 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;
    }

这段代码检查潜水器的电机是否已经启动(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();: 放松姿态控制器,在电机未启动时防止不必要的控制动作。
    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);

这些行设置了潜水器的横滚(roll)、俯仰(pitch)和偏航(yaw)输入。输入值来自于对应的通道(channel),并且已经被标准化(normalized)处理,意味着它们是介于-1到1之间的值。

  • channel_roll->norm_input(): 获取标准化的横滚输入。
  • channel_pitch->norm_input(): 获取标准化的俯仰输入。
  • 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());

这些行设置了潜水器的油门(throttle)、前进(forward)和横向(lateral)输入。这些输入同样来自于对应的通道,并且已经被标准化。

  • channel_throttle->norm_input(): 获取标准化的油门输入。
  • channel_forward->norm_input(): 获取标准化的前进输入。
  • channel_lateral->norm_input(): 获取标准化的横向输入。

http://www.kler.cn/a/419715.html

相关文章:

  • ElasticSearch easy-es 聚合函数 group by 混合写法求Top N 词云 分词
  • Java - JSR223规范解读_在JVM上实现多语言支持
  • Spring Cloud Alibaba(六)
  • qt QToolBox详解
  • 【Nacos01】消息队列与微服务之Nacos 介绍和架构
  • 要使用 OpenResty 创建一个接口,返回客户端的 IP 地址,并以 JSON 格式输出
  • 【网络安全设备系列】1、防火墙
  • Electron-vue 框架升级 Babel7 并支持electron-preload webapck 4 打包过程记录
  • 二分法篇——于上下边界的扭转压缩间,窥见正解辉映之光(2)
  • 【深度学习】利用Java DL4J 优化金融投资组合
  • Equirectangular to Perspective(E2P)算法详解(附代码)
  • 从最浅层剖析C语言————第六节(深入了解数组传参、嵌套调用以及链式访问)
  • UI设计从入门到进阶,全能实战课
  • 源码分析之Openlayers的核心EventTarget类的实现
  • Python 列表操作详解
  • 深入解析数据结构:红黑树、哈希Map、B树与B+树的底层逻辑
  • ctfhub web技能树篇
  • 基于 PostgreSQL 和 PostGIS 数据服务器模式的设计方案
  • 高斯消元——acwing
  • C++stack、queue
  • npm安装依赖后报错
  • 【计算机网络】实验6:IPV4地址的构造超网及IP数据报
  • Go运行Grule引擎实现计费规则管理
  • 【Linux】开启你的Linux之旅:初学者指令指南
  • LeetCode27.移除元素
  • NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比