ardupilot的libraries之PID

本文对比分析了源码中的AC_PID与PID两类PID控制器实现,详细介绍了它们的属性、方法及其实现细节,包括计算PID输出、积分限幅、低通滤波等特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         在源码的libraries中,有两个关于PID的源文件文件夹,一个叫AC_PID,另一个是PID。AC_PID中又细分为AC_HELI_PID、AC_P和AC_PID, 这里我们只讨论AC_PID。PID文件夹中只有一个PID类,下面分别列出这两个类中的属性和方法,并大致描述其功能和实现细节,源码请自己下载阅读。

    AC_PID

    构造函数(略)

    float       get_pid(float error, float dt);      //计算PID控制器的输出,其实是分别调用了下面的get_p、get_i、get_d函数
    float       get_pi(float error, float dt);      //计算PI控制器输出
    float       get_p(float error) const;          //计算p输出
    float       get_i(float error, float dt);        //计算i输出,其中有积分限幅,由_imax决定
    float       get_d(float error, float dt);      //计算d输出,首先判断上一次的微分值是否有效,避免上一次值不确定导致大的输出,并且有20HZ的低通滤波器

    /// Reset the PID integrator
    ///
    void        reset_I();           //将积分值置0,上一次微分值置为NAN

    /// Load gain properties
    ///
    void        load_gains();

    /// Save gain properties
    ///
    void        save_gains();
    
    /// Sets filter Alpha for D-term LPF
    void        set_d_lpf_alpha(int16_t cutoff_frequency, float time_step);     //计算滤波器系数

       PID

     构造函数(略)

       float        get_pid(float error, float scaler = 1.0);   //计算PID控制器的输出,与上面用到的方法类似,不同点1.如果两次计算的时间大于1秒,则重置积分值,避免大的波动;2有一个scaler可以对输出值进行整体的比例运算,而不用调整PID三个参数,默认为1.

    // get_pid() constrained to +/- 4500
    int16_t     get_pid_4500(float error, float scaler = 1.0);      //限制PID的输出在+/-4500之间

    /// Reset the PID integrator
    ///
    void        reset_I();

    /// Load gain properties
    ///
    void        load_gains();

    /// Save gain properties
    ///
    void        save_gains();

         可以看出,两个PID实现基本一致,在细节处理上不太一样,具体各自用在什么地方还不太清楚,这里只是做个笔记,随着学习加深会进一步完善。




<think>好的,我现在需要帮用户解决生成MAVLink库时遇到的问题。用户输入的信息中提到“Generate MAVLink Libraries · MAVLink Developer Guide Generate: command not found”,并且希望将头文件生成到指定路径。首先,我需要理解用户的问题是什么。 用户可能是在尝试按照MAVLink开发者指南生成库时遇到了“Generate: command not found”的错误。这说明用户可能在执行某个命令时出现了问题,可能是命令名称错误或者环境配置不正确。用户还指定了头文件的生成路径,因此需要确保生成命令正确指向该路径。 接下来,我需要回忆MAVLink生成库的标准流程。通常,生成MAVLink库需要使用Python脚本,可能需要安装mavlink的生成器。用户可能没有正确安装相关依赖,或者没有正确设置环境变量,导致系统找不到“generate”命令。此外,用户可能没有在正确的目录下执行命令,或者命令参数有误,导致生成失败。 用户的目标是将头文件生成到ardupilot项目的特定目录中,这可能是因为他们正在为ArduPilot开发,需要将生成的mavlink头文件集成到项目中。因此,正确的路径设置至关重要,否则可能导致编译错误或找不到头文件的问题。 接下来,我需要考虑用户可能的操作步骤。通常生成MAVLink库的步骤包括克隆仓库、安装依赖、运行生成命令。用户可能在执行生成命令时使用了错误的命令名称,比如直接输入“generate”而不是使用Python脚本,或者没有正确指定消息定义文件和输出路径。 此外,用户可能没有激活Python虚拟环境,或者没有安装必要的Python包,如future、lxml等,这也会导致命令无法找到。需要检查这些依赖是否已安装。 现在,我需要验证用户的命令是否正确。根据MAVLink官方文档,生成命令通常类似于“python -m pymavlink.tools.mavgen --lang=C --wire-protocol=2.0 --output=path_to/output message_definitions/v1.0/common.xml”。用户可能误用了命令,或者路径设置不正确,导致“generate”命令找不到。 另外,用户提到的路径是“path_to/ardupilot/libraries/include/mavlink/v2.0”,需要注意输出路径是否正确,可能需要创建目录或确保路径存在,否则生成命令会失败。 可能的解决方案包括:确保安装了MAVLink生成器,正确使用Python命令调用生成脚本,指定正确的输出路径,安装必要的依赖项。此外,检查用户是否有权限写入目标目录,或者是否需要使用sudo权限。 还需要考虑用户的操作系统环境,是否在Windows、Linux或macOS下,不同系统下的命令可能略有不同,特别是路径分隔符的问题。用户可能在Windows中使用反斜杠导致路径错误,或者在Linux中没有安装Python的模块。 总结用户的潜在问题:命令错误、依赖缺失、路径错误、权限问题。需要逐步引导用户检查这些方面,并提供正确的命令示例,特别是如何指定输出路径到ardupilot的目录。</think>--- ### **MAVLink库生成问题解决方案** (针对ArduPilot开发环境定制) --- #### **错误根源定位** 1. **`Generate: command not found` 原因** - 未正确安装MAVLink代码生成工具链 - 系统PATH环境变量未包含生成器路径 - 使用了过时的命令格式(旧版用`mavgenerate.py`,新版用`mavgen.py`) 2. **路径规范要点** - ArduPilot强制要求头文件必须位于: `$ARDUPILOT_ROOT/libraries/include/mavlink/v2.0/` - 错误路径会导致编译时出现`#include <mavlink/...>`失败 --- #### **标准生成流程** 1. **安装依赖** ```bash # 进入ArduPilot容器环境(如使用SITL) cd ardupilot ./sim_vehicle.py -v ArduCopter --console --map # 安装MAVLink生成器 pip install --user future lxml git clone https://github.com/mavlink/mavlink.git export PYTHONPATH=$PYTHONPATH:$(pwd)/mavlink ``` 2. **执行生成命令** ```bash # 通过mavgen.py指定路径(关键步骤) python3 -m pymavlink.tools.mavgen \ --lang=C \ --wire-protocol=2.0 \ --output=./libraries/include/mavlink/v2.0 \ ./modules/mavlink/message_definitions/v1.0/common.xml ``` 3. **验证输出** ```bash # 检查头文件是否生成到正确位置 ls -l libraries/include/mavlink/v2.0/ # 应出现mavlink.h、common/、standard/ 等目录 ``` --- #### **ArduPilot特殊配置** 1. **强制版本锁定** 修改`modules/mavlink/README.md`中指定的commit hash: ```markdown ## MAVLink Submodule Always use commit: 8ac0d1e51a7e4dc812f60f1d35a4b8f6a6044717 ``` 执行: ```bash git submodule update --init --recursive ``` 2. **编译时链接设置** 在`wscript`中添加: ```python # 确保包含路径正确 env.Append(CPPPATH=[ 'libraries/include/mavlink/v2.0' ]) ``` --- #### **常见问题排查表** 问题现象 | 解决方案 --------------------------|--------- `ImportError: No module named mavgen` | 执行`export PYTHONPATH=$PYTHONPATH:/path/to/mavlink` 生成后头文件版本冲突 | 删除旧文件`rm -rf libraries/include/mavlink/v1.0` `#error WIRE_PROTOCOL_VERSION mismatch` | 检查生成命令和编译时`--wire-protocol`是否一致 --- #### **自动化脚本示例** 创建`generate_mavlink.sh`: ```bash #!/bin/bash set -e MAVLINK_REPO="https://github.com/mavlink/mavlink.git" TARGET_DIR="./libraries/include/mavlink/v2.0" # 清理旧版本 rm -rf $TARGET_DIR/* # 生成新头文件 python3 -m pymavlink.tools.mavgen \ --lang=C \ --wire-protocol=2.0 \ --output=$TARGET_DIR \ ./modules/mavlink/message_definitions/v1.0/common.xml # 修复权限问题 chmod -R a+rX $TARGET_DIR echo "MAVLink headers generated to: $TARGET_DIR" ``` --- #### **版本兼容性对照** MAVLink版本 | ArduPilot分支要求 | 协议特性 -----------|-------------------|--------- v2.0 | Copter-4.3+ | 支持扩展消息集 v1.0 | Copter-4.2 | 基础消息兼容模式 --- 若需进一步调试,可附加`--verbose`参数查看详细生成过程: ```bash python3 -m pymavlink.tools.mavgen --verbose --lang=C ... ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值