PX4水下机器人源码分析

一、Px4版本1.14.1机型文件

PX4Autopilotmain\ROMFS\px4fmu_common\init.d\airframes路径下

这个脚本设置了BlueROV2(重型配置)的各种参数和初始化步骤,包括电池设置、通信设置、机架和旋翼配置以及PWM输出功能的映射。通过这些设置,可以确保机器人在启动时加载正确的配置,并按照预期的方式运行

# 加载默认的UUV配置

. ${R}etc/init.d/rc.uuv_defaults

# 设置参数

param

set-default

CBRK_IO_SAFETY

22027

MAV_1_CONFIG

102

BAT1_A_PER_V

37.8798

BAT1_CAPACITY

18000

BAT1_V_DIV

11

BAT1_N_CELLS

4

BAT_V_OFFS_CURR

0.33

# 机架和旋翼配置

param

set-default

CA_AIRFRAME

 7

CA_ROTOR_COUNT

 8

CA_R_REV

 255

# 旋翼0参数

param

set-default

CA_ROTOR0_AX

1

CA_ROTOR0_AY

-1

CA_ROTOR0_AZ

0

CA_ROTOR0_KM

0

CA_ROTOR0_PX

0.5

CA_ROTOR0_PY

0.3

CA_ROTOR0_PZ

0.2

 # 旋翼1参数    

param

set-default

CA_ROTOR1_AX

1

CA_ROTOR1_AY

1

CA_ROTOR1_AZ

0

CA_ROTOR1_KM

0

CA_ROTOR1_PX

0.5

CA_ROTOR1_PY

-0.3

CA_ROTOR1_PZ

0.2

# 旋翼2参数

param

set-default

CA_ROTOR2_AX

1

CA_ROTOR2_AY

1

CA_ROTOR2_AZ

0

CA_ROTOR2_KM

0

CA_ROTOR2_PX

-0.5

CA_ROTOR2_PY

0.3

CA_ROTOR2_PZ

0.2

# 旋翼3参数

param

set-default

CA_ROTOR3_AX

1

CA_ROTOR3_AY

-1

CA_ROTOR3_AZ

0

CA_ROTOR3_KM

0

CA_ROTOR3_PX

-0.5

CA_ROTOR3_PY

-0.3

CA_ROTOR3_PZ

0.2

# 旋翼4参数

param

set-default

CA_ROTOR4_AZ

-1

CA_ROTOR4_KM

0

CA_ROTOR4_PX

0.5

CA_ROTOR4_PY

0.5

# 旋翼5参数

param

set-default

CA_ROTOR5_AZ        

1

CA_ROTOR5_KM

0

CA_ROTOR5_PX

0.5

CA_ROTOR5_PY

-0.5

# 旋翼6参数

param

set-default

CA_ROTOR6_AZ

1

CA_ROTOR6_KM

0

CA_ROTOR6_PX

-0.5

CA_ROTOR6_PY

0.5

# 旋翼7参数

param

set-default

CA_ROTOR7_KM

0

CA_ROTOR7_PX

-0.5

CA_ROTOR7_PY

-0.5

# PWM功能映射

param

set-default

PWM_MAIN_FUNC1

101

PWM_MAIN_FUNC2

102

PWM_MAIN_FUNC3

103

PWM_MAIN_FUNC4

104

PWM_MAIN_FUNC5

105

PWM_MAIN_FUNC6

106

PWM_MAIN_FUNC7

107

PWM_MAIN_FUNC8

108

二、Rcs启动脚本

启动脚本是一个神奇的东西,它能够识别出你对应的飞机类型,加载对应的混控器,选择对应的姿态、位置估计程序以及控制程序,初始化你需要的驱动程序。

启动脚本实现了挂载SD卡,设置存储好的飞行控制初始参数(可以通过地面站修改),启动所有外设传感器,启动与地面站通行的Mavlink服务,以及机型的选择后对应启动的控制服务(以uuv为例,启动了ekf2,uuv_att_control,uuv_pos_control等服务),打开navigator服务。    

图片

启动机架代码


# Configure vehicle type specific parameters.

        # Note: rc.vehicle_setup is the entry point for all vehicle type specific setup.

        . ${R}etc/init.d/rc.vehicle_setup

进入rc.vehicle_setup 后,可以看到有一个机型判断


# UUV setup    

#

if [ $VEHICLE_TYPE = uuv ]

then

        # Start standard vtol apps.

        . ${R}etc/init.d/rc.uuv_apps

fi

然后进入rc.uuv.app​​​​​​​​​​​​​​


# Start Control Allocator

#

control_allocator start

          

#

# Start UUV Attitude Controller.

#

uuv_att_control start

          

#

# Start UUV Land Detector.

#

land_detector start rover

可以看到启动控制分配器、UUV姿态控制器和UUV着陆检测器的命令。    

三、然后我们进入到uuv_att_control.h

先来看它的头文件,uuv_att_control.h定义了一个名为 UUVAttitudeControl的类,它继承了ModuleBase、ModuleParams 和 px4::WorkItem。

公有成员函数

  • 构造函数和析构函数

UUVAttitudeControl(); ~UUVAttitudeControl(); );
  • 任务启动  

static int task_spawn(int argc, char *argv[]);
  • 定义命令

static int custom_command(int argc, char *argv[]);
  • 打印用法

static int print_usage(const char *reason = nullptr);
  • 初始化函数


bool init();

私有成员函数

  • 发布扭矩设定点


void publishTorqueSetpoint(const hrt_abstime &timestamp_sample);
  • 发布推理设定点

void publishThrustSetpoint(const hrt_abstime &timestamp_sample);
  • 运行函数(主要控制逻辑)


void Run() override;
  • 参数更新


void parameters_update(bool force = false);
  • 姿态控制


void control_attitude_geo(const vehicle_attitude_s &attitude, const vehicle_attitude_setpoint_s &attitude_setpoint, const vehicle_angular_velocity_s &angular_velocity, const vehicle_rates_setpoint_

四、然后我们进入到uuv_att_control.cpp          

1、函数constrain_actuator_commands

用于约束并设置姿态控制和推力控制的命令,以确保这些命令在合理的范围内。具体地说,它处理滚转(roll)、俯仰(pitch)、偏航(yaw)以及在 x、y、z 方向上的推力(thrust)的控制命令。以其中一个举例:​​​​​​​


检查滚转命令(roll_u)
if (PX4_ISFINITE(roll_u)) {
                roll_u = math::constrain(roll_u, -1.0f, 1.0f);4.                _vehicle_torque_setpoint.xyz[0] = roll_u;

        } else {
                _vehicle_torque_setpoint.xyz[0] = 0.0f;
        }
  • 首先检查roll_u是否为有限值(不是无穷大或NaN)
  • 如果是有限值,则将roll_u约束在 [-1.0, 1.0] 范围内,并设置为车辆的滚转扭矩设定点。
  • 如果不是有限值,则将滚转扭矩设定点设置为 0。

2、control_attitude_geo函数使用比例和微分控制器调节水下机器人的姿态。

通过计算姿态误差和角速度误差,生成控制力矩,并结合推力设定值,生成最终的控制命令。通过 constrain_actuator_commands 函数,将这些命令约束在合理范围内,以确保机器人的稳定性和安全性。

1)从四元数提取姿态和设定值​​​​​​​

Eulerf euler_angles(matrix::Quatf(attitude.q));
        float roll_body = attitude_setpoint.roll_body;
        float pitch_body = attitude_setpoint.pitch_body;
        float yaw_body = attitude_setpoint.yaw_body;
        float roll_rate_desired = rates_setpoint.roll;
        float pitch_rate_desired = rates_setpoint.pitch;
        float yaw_rate_desired = rates_setpoint.yaw;
  • 将姿态四元数转换为欧拉角。
  • 提取设定的姿态(滚转、俯仰、偏航)和角速度。

2)计算旋转矩阵


/* get attitude setpoint rotational matrix */
        Dcmf rot_des = Eulerf(roll_body, pitch_body, yaw_body);

        /* get current rotation matrix from control state quaternions */
        Quatf q_att(attitude.q);
        Matrix3f rot_att =  matrix::Dcm<float>(q_att);
;
  • 将设定的欧拉角转换成旋转矩阵rot_des。
  • 将当前姿态四元数转换为旋转矩阵rot_att。

3)计算姿态误差


/* Compute matrix: attitude error */
        Matrix3f e_R = (rot_des.transpose() * rot_att - rot_att.transpose() * rot_des) * 0.5;

        /* vee-map the error to get a vector instead of matrix e_R */
        e_R_vec(0) = e_R(2, 1);  /**< Roll  */
        e_R_vec(1) = e_R(0, 2);  /**< Pitch */
        e_R_vec(2) = e_R(1, 0);  /**< Yaw   */
  • e_R(2, 1)表示矩阵e_R的第3行第2列元素。
  • 计算姿态误差矩阵e_R该矩阵表示当前姿态与期望姿态之间的误差。
  • 使用vee-map将误差矩阵转换为误差向量e_R_vec分别对应滚转、俯仰和偏航的误差。

4)计算角速度误差并应用PD控制器​​​​​​​


/**< P-Control */
        torques(0) = - e_R_vec(0) * _param_roll_p.get();        /**< Roll  */
        torques(1) = - e_R_vec(1) * _param_pitch_p.get();       /**< Pitch */
        torques(2) = - e_R_vec(2) * _param_yaw_p.get();         /**< Yaw   */

        /**< PD-Control */
        torques(0) = torques(0) - omega(0) * _param_roll_d.get();  /**< Roll  */
        torques(1) = torques(1) - omega(1) * _param_pitch_d.get(); /**< Pitch */
        torques(2) = torques(2) - omega(2) * _param_yaw_d.get();   /**< Yaw   */

        float roll_u = torques(0);
        float pitch_u = torques(1);
        float yaw_u = torques(2);

        // take thrust as
        float thrust_x = attitude_setpoint.thrust_body[0];
        float thrust_y = attitude_setpoint.thrust_body[1];
        float thrust_z = attitude_setpoint.thrust_body[2];
  • 计算当前角度与设定角度之间的误差omega。
  • 通过P控制器计算初步的控制力矩。
  • 通过PD控制器(比例微分控制器)调整控制力矩。

五、提取推力设定值并约束控制命令​​​​​​​


constrain_actuator_commands(roll_u, pitch_u, yaw_u, thrust_x, thrust_y, thrust_z);
        /* Geometric Controller END*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/656322.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

unity制作app(10)--统一字体

1.载入字体&#xff0c;微软雅黑&#xff0c;需要3分钟左右 加载进来3个 2.font文件夹下创建一个txt&#xff0c;内部的内容如下&#xff1a; &#xfeff;啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏…

AI视频教程下载:零基础学会DALL-E 、Midjourney、Microsoft Designer、Adobe Firefly

学完本课程会得到什么&#xff1a; 掌握ChatGPT、DALL-E 2、Midjourney、Microsoft Bing Chat、Microsoft Designer和Adobe Firefly&#xff0c;全面理解生成性AI及其应用 了解OpenAI及其在生成性AI领域的尖端研究 理解提示工程的重要性以及它如何帮助产生更好的输出和数据 …

【QGIS入门实战精品教程】5.3:CGCS2000转Lambert投影

参考阅读: 【GlobalMapper精品教程】081:WGS84/CGCS2000转Lambert投影 文章目录 一、加载实验数据二、投影转换三、批量投影转换一、加载实验数据 加载配套实验数据,如下图所示:图层为长沙市范围、长沙市酒店宾馆分布点位、湖南省酒店分布点位矢量数据。 双击图层,打开信…

【Vue】Vue2中的Vuex

目录 Vuex介绍Vuex 中的核心概念 在vue2中使用Vuex安装 Vuex创建一个 Vuex Store在 Vue 实例中使用 Vuex编写 Vuex 的 state、mutations 和 actions在组件中使用 Vuex Vuex的核心State组件中获取 Vuex 的状态mapState 辅助函数对象展开运算符 Getter基本使用示例 通过属性访问通…

Unity实现首行缩进两个字符

效果 在Unity中如果想实现首行缩进两个字符&#xff0c;你会发现按空格是没法实现的。 实现原理&#xff1a;用空白的透明的字替代原来的位置。 代码&#xff1a; <color#FFFFFF00>XXX</color> 赶紧去试试吧&#xff01;

《架演》共创者第一次线上沟通会议总结

《架演》共创者第一次线上沟通——启动会 会议主题&#xff1a;《架演》共创启动会议会议时间&#xff1a;2024年5月28日&#xff0c;20:00 - 21:00会议地点&#xff1a;腾讯会议主持人&#xff1a;寒山参会人员&#xff1a; 夏军、mirror、刘哥、悟缺席人员&#xff1a;可心、…

性能测试(一)—— 性能测试理论+jmeter的使用

1.性能测试介绍 定义&#xff1a;软件的性能是软件的一种非功能特性&#xff0c;它关注的不是软件是否能够完成特定的功能&#xff0c;而是在完成该功能时展示出来的及时性。 由定义可知性能关注的是软件的非功能特性&#xff0c;所以一般来说性能测试介入的时机是在功能测试完…

20240521在Ubuntu20.04下编译RK3588平台的IPC方案

20240521在Ubuntu20.04下编译RK3588平台的IPC方案 2024/5/21 15:27 viewproviewpro-ThinkBook-16-G5-IRH:~$ viewproviewpro-ThinkBook-16-G5-IRH:~$ md5sum RK3588_IPC_SDK.tar.gz 7481cc8d59f697a5fa4fd655de866707 RK3588_IPC_SDK.tar.gz viewproviewpro-ThinkBook-16-G5…

【vue-4】遍历数组或对象v-for

1、遍历数组 <ul><li v-for"(value,index) in web.number">index>{{index}}:value>{{value}}</li> </ul> 知识点&#xff1a; <ul>标签定义无序列表 举例&#xff1a; <ul><li>Coffee</li><li>Tea…

LeetCode199二叉树的右视图

题目描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 解析 这一题的关键其实就是找到怎么去得到当前是哪一层级&#xff0c;可以利用队列对二叉树进行层次遍历&#xff0c;但…

FFmpeg操作命令 - 精简版

PS&#xff1a;&#xff08;因为我只需要简单的操作&#xff0c;所以我整理出了这份笔记&#xff09; 原网址&#xff1a;30分钟带你入门&#xff0c;20个 FFmpeg操作命令&#xff0c;包你学会 - 知乎 大佬零声Github整理库整理的笔记非常的全面&#xff0c;想看完整版去上面…

Java | Leetcode Java题解之第102题二叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> levelOrder(TreeNode root) {Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();if (root ! null) queue.a…

前端开发框架Angular

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Angular概述 Angular是由Google开发并维护的一款开源前端开发框架。它最初被设计为用于构建单页面应用&#xff08;SPA&#xff09;&#xff0c;但随着版本的更新和发展&am…

torch.matmul()的用法

这篇文章记录torch.matmul()的用法 这里仿照官方文档中的例子说明&#xff0c;此处取整数随机数&#xff0c;用于直观的查看效果&#xff1a; vector x vector 两个一维向量的matmul相当于点积&#xff0c;得到一个标量 tensor1 torch.randint(1, 6, (3,)) tensor2 torch.…

LabVIEW通过以太网控制PLC程序开发

在使用LabVIEW通过以太网控制PLC程序开发时&#xff0c;需要综合考虑硬件、软件和通信协议的协调工作。以下是详细步骤、注意事项、重点和难点分析&#xff0c;以及几种实现方式及其特点的概述。 实现步骤 确定硬件和软件环境&#xff1a; 确定PLC型号和品牌&#xff08;如西门…

错误模块路径: ...\v4.0.30319\clr.dll,v4.0.30319 .NET 运行时中出现内部错误,进程终止,退出代码为 80131506。

全网唯一解决此BUG的文章&#xff01;&#xff01;&#xff01; 你是否碰到了以下几种问题&#xff1f;先说原因解决思路具体操作1、首先将你C:\Windows\Microsoft.NET\文件夹的所有者修改为你当前用户&#xff0c;我的是administrator。2、修改当前用户权限。3、重启电脑4、删…

你什么时候感觉学明白Java了?

学是学不明白Java的&#xff0c;要学明白Java&#xff0c;一定只能在工作以后。 1 在学习阶段&#xff0c;哪怕是借鉴别人的学习路线&#xff0c;其实依然会学很多不必要的技能&#xff0c;比如jsp&#xff0c;swing&#xff0c;或者多线程&#xff0c;或者设计模式。 2 或者…

业内宝刊!影响因子3连涨,OA可选,Elsevier旗下这本SSCI解救你的选刊纠结症

【SciencePub学术】今天小编给大家带来了一本经济类的高分优刊解读&#xff0c;隶属于Elsevier出版社&#xff0c;JCR1区&#xff0c;中科院2区&#xff0c;影响因子高达4.8&#xff0c;且实时影响因子还在持续上涨中&#xff0c;领域相符的学者可着重考虑&#xff01; Emergin…

微服务架构五大设计模式详解,助你领跑行业

微服务架构设计模式详解(5种主流模式) 微服务架构 微服务&#xff0c;一种革命性的架构模式&#xff0c;主张将大型应用分解为若干小服务&#xff0c;通过轻量级通信机制互联。每个服务专注特定业务&#xff0c;具备独立部署能力&#xff0c;轻松融入生产环境&#xff0c;为系…

你对仲裁裁决不服怎么办?我教你四个狠招!

你对仲裁裁决不服怎么办&#xff1f;我教你四个狠招&#xff01; 这个标题是什么意思呢&#xff1f;也就是说&#xff0c;当你&#xff08;或用人单位&#xff09;向劳动仲裁委提出仲裁申请后&#xff0c;但劳动仲裁结果没有维护你的权益&#xff0c;或者你不满意&#xff0c;…