无人潜水艇的设计与仿真

文章来自:MATLAB

近几年很多研究机构和公司开始进行船舶无人化研究,这种应用未来会有广阔的前景,比如海上救助打捞、海底设备检修、海洋考察等,无人潜水艇能有效减少人员费用的支出并提高航行的安全性。

作为新兴的先进海洋装备,无人潜水艇需要攻克动力、导航、通讯和船体控制等技术难题。
一方面需要成熟的路径规划算法,灵巧的操作和避障能力,可以按照既定的路线自主航行躲避障碍,另一方面需要远距离水下数据采集和通讯能力,确保作业任务的质量。
在这一领域,借助 MATLAB 和 Simulink 强大的物理建模和仿真能力,可以为您的船舶设计,系统设计和人工智能开发大幅提高效率。
在本文中,我们将描述如何在 Simulink 里对一个假想的六推进器无人艇进行动力学建模,海底环境建模,以及对一个未知位置的海底黑匣子搜索任务的算法开发。
如下图所示,我们假想的无人艇装配了 6 个推进器和 7 个传感器:
1)一左一右两个主螺旋桨,高效率地提供向前的推动力以及横向转向。
2)两个上下方向的小推进器,辅助无人艇的上浮,下潜和纵向转向。
3)左右贯通的两个侧向推进器,辅助无人艇横向转向以及侧向平移。
4)惯性传感器(IMU),辅助测速定位
5)朝向向下的多波束声呐(Multibeam sonar),负责海底测绘,辅助定位
6)朝向向前、向左和向右的三个普通声纳,负责障碍物规避
7)多普勒流速仪(Doppler Velocity Logger),负责测速
8)水下麦克风一枚,负责监听来自于目标黑匣子的 ping 声波信号
下面让我们一起来试试在 Simulink 里建模和仿真这个无人艇任务吧。

无人潜水艇的设计与仿真的图1


潜水艇的动力学模型



要实现无人艇的灵巧控制,首先需要建立动力学模型,这是设计的基础。
MATLAB 提供了多种动力学仿真手段和常用的运算工具,可以自己推导动力学方程,然后使用基础的 Simulink 模块搭建成系统控制框图(control block diagram)。
或者更便捷的方式是将 CAD 模型直接导入到 Simulink 后加工成自由体受力图(free body diagram),这样可以大大提高动力学建模的效率。
这里我们简单介绍下怎么把 CAD 模型变成 Simulink 里的自由体受力图。
通过常规的 CAD 软件,如 Solidworks,Autodesk Inventor 和 Pro/E,用户可以画出完整的机械装配,并且定义所有的质量、惯性、3D 几何和装配关系等物理参数。然后通过 MATLAB 提供的针对特定 CAD 软件的插件 Simscape Multibody Link (https://www.mathworks.com/help/physmod/smlink/ug/installing-and-linking-simmechanics-link-software.html ),用户可以从 CAD 软件中把完整的模型,包括所有物理参数自动导入到 Simulink 中。
具体的转换过程可以参考以下视频:

在 CAD 转换完成并生成相应的 .xml文件后,可以使用 smimport() 函数自动创建 Simscape Multibody 模型,这样船体的力学模型就搭建完成了。
有了这个力学模型,用户可以做好些仿真测试。譬如,
1)用户让某些部件动起来,比如螺旋桨,同时观察在螺旋桨旋转时产生的惯性对无人艇稳定性的影响。
2)用户也可以连接一个控制算法模块,来仿真无人艇的操作灵巧性,比如最小转弯半径。
3)用户还可以连接一个外力模块,来仿真无人艇在海浪里保持稳定所必需的动力要求。

无人潜水艇的设计与仿真的图2

图中演示了在 Simulink 里把控制器模块,无人机力学模型模块和外力模块连到一起,实现无人艇的动态仿真。
接下来我们具体看看怎么让潜水艇在螺旋桨的推动下动起来。
用户可以使用 simscape 里的 Joint 模块来定义螺旋桨的动力轴。Joint 模块连接两个刚体并施加主要的运动学约束,以确定这些物体如何相对彼此移动。
该模块是根据提供的自由度来参数化的,所有关节都提供了执行(力或力矩或运动轨迹)和感知相应自由度的方法。用在螺旋桨上时,用户可以定义旋转方向,旋转速度或者功率。
External Force and Torque 模块可用于对连接的刚体施加力或力矩。这些力可以是有自定义方程式的外力,或者是一个电机马达模型的输出力。

无人潜水艇的设计与仿真的图3

这个图中标注了无人艇的六个螺旋桨的力学建模方法。每个螺旋桨的动力轴都是一个 Joint 模块,里面把螺旋桨定义为一个二阶动力系统,输入一个参照转速或者参照推动力 Tt,Joint 模块会自动计算出对无人艇主体产生的一个推动力 Tf,和一个扭矩 Tw。
完成了这样一个基础的无人艇力学模型后,用户已经可以做些设计优化了。
譬如优化无人艇的在水平方向上的恢复力矩(self correcting moment),保证船体稳定。
要实现这个目标,我们一般要浮心在重心的正上方。而一般情况下,在设计过程中,无人艇内部零件是需要经常调整以确保这个重心和浮心的位置关系。
在Simulink里,实现这一点很方便。Inertia Sensor 模块提供了测量惯性属性的方法,包括质量、重心和惯性张量。
在已有的力学模型里,Inertia Sensor 模块能自动测得无人艇整体重心和浮心的位置。把内部部分零件的 XYZ 坐标值作为优化变量, 重心和浮心的 XY 坐标值相等作为优化目标,使用 Response Optimization App 这款插件进行优化计算,可以很方便地调整重心位置, 得到能实现船体稳定性的最优内部零件排列。

无人潜水艇的设计与仿真的图4


添加环境模型



2.1 静水力—重力和浮力效应
为了保持稳定的平衡,水下的潜艇的重心必须位于浮力中心的正下方,这会产生一个恢复力矩,抵消任何外部力量或干扰围绕本体滚动或俯仰轴产生的旋转,并将帮助潜艇回到水平方向。

无人潜水艇的设计与仿真的图5

2.2 水动力---附加质量的惯性力及科里奥利力,重力和浮力的恢复力,水阻尼等
水下无人艇动力学的基本方程为:

无人潜水艇的设计与仿真的图6

其中 

无人潜水艇的设计与仿真的图7

是体坐标速度矢量, 

无人潜水艇的设计与仿真的图8

是地固坐标系的位置和姿态矢量, 

无人潜水艇的设计与仿真的图9 

无人潜水艇的设计与仿真的图10

是刚体质量矩阵和科里奥利效应, 

无人潜水艇的设计与仿真的图11

是附加质量的惯性矩阵, 

无人潜水艇的设计与仿真的图12

是科里奥利力和向心力矩阵, 

无人潜水艇的设计与仿真的图13

是水阻尼矩阵, 

无人潜水艇的设计与仿真的图14

是恢复力/力矩,表示重力和浮力的共同作用。
Simscape Multibody 负责实现刚体动力学,考虑重力影响。Simscape Multibody 同时也有坐标轴转换模块,自动、实时、准确地完成体坐标系和地固坐标系的转换。其他所有效应都需要作为外力和力矩由用户自定义的方程式来施加。
阻力和升力 是由于流体在潜水艇表面周围流动而产生的压力和摩擦力的结果。
升力垂直于流动方向,阻力平行且与流动方向相反。这两种力都是速度平方的函数,并且高度依赖于潜水艇的形状、雷诺数定义的流动中层流和湍流状态之间的过渡、表面摩擦、到海洋底部的距离以及许多其他复杂因素。
在 Simulink 中,用户可以简单地定义一个固定的阻力和浮力系数,也可以做得更精准些。譬如,导入一个阻力和浮力系数和雷诺数对应的数据库,然后以查找表(look up table)的形式,在 Simulink 仿真的过程中动态改变阻力和浮力系数,达到精度更高的仿真效果。

无人潜水艇的设计与仿真的图15

图中是 6 个自由度上的浮力系数和船体与流体方向之间的夹角的对照图

无人潜水艇的设计与仿真的图16

附加质量 是由周围流体的惯性特性产生的压力作用于潜艇的力和力矩,当潜艇加速或减速时必须带动周围一定质量的流体一同运动,这种效应对于水中运动的物体是很重要的,它的作用可认为是对潜艇实际质量的明显增加。
计算附加质量矩阵系数是一个复杂的问题,需要使用 CFD 方法解决并通过实验验证。有几种简化的方法可以为一般形状(球体、圆柱体、平板等)的潜艇提供适当的一阶近似。

无人潜水艇的设计与仿真的图17

无人潜水艇的设计与仿真的图18

例子中,潜艇是典型的细长 myring 形状,假设围绕x轴旋转对称,应用细长理论和 Lamb’s k-factors 的组合来估计扁长球体的附加质量矩阵的系数,将其简化为:

无人潜水艇的设计与仿真的图19

对应水下潜艇,这些系数常被视为常数,并假设自上而下和左右舷对称,可以得出:

无人潜水艇的设计与仿真的图20

无人潜水艇的设计与仿真的图21 

对于细长理论的细节,可参考 MIT 出版的 Maneuvering and control of Marine Vehicles 第 8 章节,电子书链接: https://dspace.mit.edu/bitstream/handle/1721.1/35260/13-49Fall-2000/NR/rdonlyres/Ocean-Engineering/13-49Maneuvering-and-Control-of-Surface-and-Underwater-VehiclesFall2000/9902D412-8BF9-4401-874B-850F2FC6267A/0/all.pdf

    ◆  

(2条)
默认 最新
你好呀,请问我在mathworks,simscape案例复制了一个传感器封装模块,可是自己运行时候,发现参数没复制进去,请问这个该怎么处理呢?
评论 点赞
👍🏻
评论 点赞
点赞 4 评论 2 收藏 6
关注