拒绝随波逐流!设计与实现可控的水下机器人

这个“长着三个触角”的水下机器人看上去是不是很萌?它使用的是一种新型的由三个球形磁耦合矢量推进器组成的推进系统。与传统的水下机器人使用多个固定推进器来实现多自由度(DOF)推进相比,矢量推进器具有多自由度、寄生推力小,以及效率高等优势。

在设计包含多个矢量推进器的水下机器人时,为了实现机器人在水下三维空间中对运动轨迹的精准跟踪,如何设计多推进器的推力布局、运动控制和控制分配等算法,显得十分重要且极具挑战!

面对这些挑战,来自西南石油大学三位研究生黄宇杰、刘里宵和张又文所组成的 MTGA 团队,在王宇副教授的指导下,利用 MATLAB 设计、仿真和实现的水下机器人(如上动画)。他们的作品在 2022 年获得第十七届中国研究生电子设计竞赛 MathWorks 企业专项奖的第一名以及全国二等奖

让我们来进一步看看这个作品的设计和实现细节!

算法设计

针对所采用的磁耦合矢量推进器,团队设计了一种基于遗传算法的推力布局算法(如下图)。这个算法在矢量推进器的复杂非线性约束下,优化三个矢量推进器的安装位置和角度,实现了最大的六自由度解耦广义推力。

图片

利用这个推力布局算法确定三个推进器的安装位置和角度后,团队接下来需要考虑的是如何实现这个水下机器人多个自由度的运动和矢量推进,为此他们需要设计运动控制系统对三个电机和六个舵机的进行协同控制。

为了达到稳定的运动控制,团队将水下机器人多自由度运动解耦到水平面和垂直深度上分别进行:在垂直深度上,采用PID控制算法;在水平面上采用的是基于Lyapunov函数的反步法,并采用RBF神经网络对执行器输出饱和进行补偿。最后利用推进器推力分配模型对每个推进器的电机和舵机进行单独控制,输出所需要的推力。

图片

这其中一个关键步骤是如何得到推进器推力分配模型,也就是由六自由度期望广义推力得到协同控制三个电机和六个舵机的九个控制量。为此,团队定义了一个如下的凸优化问题,其目标是在之前确定的最优推进器布局下,考虑可重构磁耦合推进器的最大重构角和最大推力限制,最小化误差和能量消耗的总和。

团队使用传统的拉格朗日方法来求解这个带有非线性约束条件的凸优化问题,实时得到最优的控制分配方案。他们在MATLAB中进行算法参数调整和实时性优化,保证算法能在可控的迭代次数内实现较好的收敛情况。

图片

系统仿真

MTGA 团队在 MATLAB 中实现了推力布局、运动控制和控制分配等算法后,并建立了 Simulink 模型进行仿真。这使得他们可以在不利用原型进行实验的情况下调试、测试和验证所设计的算法,从而节省时间和成本。

他们所构建的 Simulink 模型包括三个主要模块:控制器、控制分配和基于机器人动力学的被控对象。

图片

每个模块都是使用 Simulink 库提供的模型和少量手写的 MATLAB 函数来构建的。例如,下图展示了他们在 Simulink 中建立的水下机器人的动力学模型。

图片

他们利用 Simulink 仿真得到的水平面下轨迹跟踪结果,您可以看到通过反步法控制得到的运动轨迹基本与参考轨迹重合。 

图片

原型开发

团队不仅构建了 Simulink 仿真系统,还采用如下模块化和基于总线的设计开发了水下机器人原型。他们使用了 Holybro Pixhawk 4(PX4)作为通信和控制计算平台,该平台是基于 Pixhawk FMUv5 项目的开源硬件。PX4 是一个广泛用于开发自主系统的开源平台,特别是用于开发无人机。它最初由  Lorenz Meier 于 2011 年开发,并已发展成为一个庞大的开源社区。

图片

团队并没有再从头手写控制分配算法的 C 代码,而是使用 MATLAB Coder 将 MATLAB 下编写控制分配算法自动转换为 C 代码,然后对代码进行少量修改后将其部署到 PX4 控制器上。这种使用 MATLAB Coder 进行自动代码生成的开发方式节省了他们的开发时间并提高了效率。

水下实验

最后,团队利用所开发的原型进行了一些水下实验来检测算法性能。下图展示了水下机器人原型在泳池中自主跟踪所设定参考轨迹的实验结果。

图片

小结

MTGA 团队利用 MATLAB 设计、仿真和实现了水下机器人。他们结合磁耦合推进器的矢量输出特性,创新性的采用遗传算法为水下机器人布局推进器提供了新思路。在此基础上,通过建立高效的推力分配模型,实现了上层运动控制与底层推进器控制的模块化分离设计。

创新性的设计和富有成果的工作使得 MTGA 团队不仅赢得了第十七届研究生电子设计竞赛的奖项,还同时向我们展示了当代中国研究生的风采!

对于未来的工作,同学们可以试着了解 UAV Toolbox Support Package for PX4® Autopilots (https://ww2.mathworks.cn/matlabcentral/fileexchange/70016-uav-toolbox-support-package-for-px4-autopilots

下载并安装这个支持包后,大家可以直接从 MATLAB 和 Simulink 访问 PX4 的外设,非常方便!此外,借助 Embedded Coder,可以自动将代码或者模型生成 C/C++ 代码,并使用 PX4 工具链构建和部署专门针对 Pixhawk 以及 Pixracer 飞行管理单元的算法。这将有助于同学们运用业界广泛使用的基于模型的设计(https://ww2.mathworks.cn/solutions/model-based-design.html)的开发流程,来实现更高效的系统设计和软件部署。

 免费分享一些我整理的人工智能学习资料给大家,整理了很久,非常全面。包括一些人工智能基础入门视频+AI常用框架实战视频、图像识别、OpenCV、NLP、YOLO、机器学习、pytorch、计算机视觉、深度学习与神经网络等视频、课件源码、国内外知名精华资源、AI热门论文等。

下面是部分截图,加我免费领取

目录

一、人工智能免费视频课程和项目

二、人工智能必读书籍

三、人工智能论文合集

四、机器学习+计算机视觉基础算法教程

最后,我想说的是,自学人工智能并不是一件难事。只要我们有一个正确的学习方法和学习态度,并且坚持不懈地学习下去,就一定能够掌握这个领域的知识和技术。让我们一起抓住机遇,迎接未来!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以点击链接领取 

二维码详情

免费下载,论文、设计请注明引用! 微小型AUV具有体积小,灵活性高、隐蔽性好等特点,可以工作于其它大型水下机器人无法进入的区域。民用上可以应用于海洋矿产勘探、海底地形探测,沉船打捞,水下考古,海洋生物探测等;军事上可以用来反水雷,作为自航水雷的载体、监察海战时水下敌情等。 首先,本文对所设计的微小型AUV的结构、推进器分布进行介绍,并对其进行受力分析和建立运动方程。结合运动方程设计了被控对象模型未知的AUV自动定深、自动定航控制器;同时研究了传统的PID控制、模糊控制、自适应控制等算法,并最终设计了应用于该微小型AUV的模糊参数自适应PID控制算法。 其次,对该具有多传感器的微小型AUV控制系统进行了研究设计。针对分布式控制系统总体机构及其通信总线进行了设计;分别详细设计了分布式系统的各个子系统;着重研究、设计了理论、算法及软件实现方案;计了基于CAN总线的分布式微小型AUV控制系统,提高了系统的稳定性和模块化程度,在结构上优化了系统的复杂性。最终形成了由软硬件系统组成分布式控制系统。 再其次,根据SINS、DVL和深度计这三个传感器的姿态角、角速度,线速度、加速度,深度等导航信息进行了AUV的航位推算研究实现;并使用综合水池实验室的X-Y航车系统,反复试验,对航位推算进行了标定,修正了安装误差角和刻度因子。提高了航位推算精度。结合航位推算和AUV制导控制设计了有海流影响的AUV自动巡航控制器。抗海流自动巡航控制器除抗海流功能外可以补偿SINS艏向安装误差带来的控制性能缺陷。
<think>我们正在寻找关于Gazebo中用于浮冰模型插件的教程或示例代码。根据提供的引用,我们可以尝试以下思路:1.引用[1]提到了Gazebo模型和材质的存储位置,以及纹理的位置。这提示我们可以通过修改材质或纹理来改变模型的外观,但并没有直接涉及插件。2.引用[2]提到了如何从模型数据库中插入模型,但同样没有提到特定的浮冰模型或相关插件。3.引用[3]则提到了运行一个名为rrbot_gazebo的launch文件,这通常机器人仿真有关,但似乎也不涉及浮冰。然而,用户的问题是关于浮冰模型的插件。在Gazebo中,插件通常用于为模型添加特定的行为或功能。例如,浮冰可能需要在水面上漂浮并移动,这可能需要使用插件来实现。由于提供的引用中没有直接关于浮冰插件的信息,我们需要根据Gazebo的通用插件开发和使用方法进行指导。在Gazebo中,模型插件通常使用C++编写,并编译成共享库(.so文件),然后在模型的SDF文件中进行引用。插件可以为模型提供物理特性(如浮力)或控制其运动。可能的步骤:1.创建浮冰模型(包括视觉和碰撞属性)。2.编写插件代码(例如,实现浮力或其他物理效果)。3.在模型的SDF文件中引用插件。4.在Gazebo中加载模型并测试。由于用户请求教程或示例代码,我们可以提供一个简单的插件示例,该示例可能使模型在水面上漂浮(假设水面已经存在,例如使用Gazebo的水面模型)。注意:Gazebo本身有一个浮力插件(BuoyancyPlugin),我们可以直接使用它,而不必自己编写。但是,如果用户需要定制行为,则需要编写自定义插件。以下步骤基于Gazebo的浮力插件:步骤1:创建浮冰模型-可以使用简单的盒子形状作为浮冰,并为其赋予适当的纹理(引用[1]中提到纹理的位置,我们可以将自定义纹理放在那里,或者使用相对路径)。-定义模型的SDF文件(例如floating_ice.sdf)。步骤2:在模型的SDF文件中添加浮力插件-在SDF文件中,我们需要添加`<plugin>`标签来使用Gazebo自带的浮力插件。示例SDF片段(浮冰模型):```xml<modelname='floating_ice'><linkname='ice_link'><inertial><mass>50</mass></inertial><collisionname='collision'><geometry><box><size>110.5</size></box></geometry></collision><visualname='visual'><geometry><box><size>110.5</size></box></geometry><material><script><uri>file://media/materials/scripts</uri><uri>file://media/materials/textures</uri><name>Ice/ice</name><!--假设存在名为Ice的材质脚本--></script></material></visual></link><!--添加浮力插件--><pluginname='buoyancy'filename='libBuoyancyPlugin.so'><fluid_density>1000</fluid_density><!--水的密度,单位kg/m³--><linkname='ice_link'><center_of_buoyancy>000</center_of_buoyancy><!--浮力中心,相对于链接坐标--><buoyancy_force>0050</buoyancy_force><!--浮力大小,这里只是示意,实际上浮力计算物体排开水的体积有关,但此插件是简单示例,可能需要更复杂的设置--></link></plugin></model>```注意:以上`BuoyancyPlugin`的使用可能需要根据实际情况调整。Gazebo默认可能没有提供完整的浮力插件,或者需要特定的设置。事实上,Gazebo有一个名为`Hydrodynamics`的插件系统,包括浮力、阻尼等。在较新的版本中,可能使用`libHydrodynamics.so`插件中的`Buoyancy`组件。由于浮力计算的复杂性,另一个常见的做法是使用Gazebo的`liftdrag`插件来实现,但通常用于空气动力学。对于浮冰,更准确的做法是使用专门处理水下环境的插件。实际上,Gazebo有一个开源项目名为“UWSim”,其中包含了水下仿真的插件。但是,在标准Gazebo中,我们可以尝试使用以下插件:-`libgazebo_buoyancy_plugin.so`:这可能需要自己编写或从其他资源获取。Gazebo官方提供过一个浮力插件的示例,可以在以下链接找到:https://github.com/osrf/gazebo/blob/gazebo11/plugins/BuoyancyPlugin.cc如果用户希望使用自定义插件,可以下载并编译该插件(如果版本匹配),或者自己编写。步骤3:在仿真环境中使用浮冰模型-可以将浮冰模型放在Gazebo世界中,并添加水面(例如一个平面作为水面,并设置水的密度?)。注意,Gazebo默认的水面模型可能是一个动态的波浪表面,使用`wave`模型。另一种方法是,Gazebo自带了水面模型,可以通过以下方式插入:-在Gazebo的Insert面板中,搜索“wave”或“ocean”模型(如果存在)。如果用户需要定制浮冰的行为,比如随着水流移动,那么可能需要编写更复杂的插件。示例自定义插件代码(简略):我们可以创建一个简单的插件,使浮冰随波逐流(例如沿某个方向移动)。以下是一个非常简单的示例,它只是让模型以恒定速度移动:```cpp#include<gazebo/gazebo.hh>#include<gazebo/physics/physics.hh>namespacegazebo{classFloatingIcePlugin:publicModelPlugin{public:voidLoad(physics::ModelPtr_parent,sdf::ElementPtr_sdf){this->model=_parent;this->updateConnection=event::Events::ConnectWorldUpdateBegin(std::bind(&FloatingIcePlugin::OnUpdate,this));}voidOnUpdate(){//设置线性速度,例如在x方向以0.5m/s移动this->model->SetLinearVel(ignition::math::Vector3d(0.5,0,0));}private:physics::ModelPtrmodel;event::ConnectionPtrupdateConnection;};GZ_REGISTER_MODEL_PLUGIN(FloatingIcePlugin)}```编译后,在SDF文件中引用:```xml<pluginname='floating_ice_plugin'filename='libFloatingIcePlugin.so'/>```然而,这只是一个非常简单的移动,没有考虑水的流动。更高级的插件可能需要获取周围水流的信息(例如,来自附近水体模型的速度场)来调整浮冰的速度。总结:1.若使用现成插件:可以尝试在SDF中引用Gazebo自带的浮力相关插件(如`BuoyancyPlugin`或`Hydrodynamics`插件),并设置参数。2.若需要自定义插件:编写C++插件,编译后在SDF中引用。由于问题中并未指定Gazebo版本,这里提供的信息是基于Gazebo11。用户可能参考的教程:-Gazebo官方插件教程:http://gazebosim.org/tutorials?tut=plugins_hello_world&cat=write_plugin-有关浮力插件的讨论:https://answers.gazebosim.org//question/19169/how-to-add-buoyancy-to-a-model/由于没有现成的浮冰模型插件的教程,我们可以建议用户:-先尝试使用现有的浮力插件(如上述示例)。-如果效果不满意,则考虑自己编写插件。因此,我们可以提供使用内置浮力插件的方法,以及一个简单自定义插件的示例代码。</think> 以下是关于Gazebo中浮冰模型插件的使用信息和示例代码。基于您的需求,我整理了以下关键内容: ### 一、浮冰模型插件核心实现 Gazebo中实现浮冰模型通常需要两个核心组件: 1. **可视化模型**(使用SDF定义) 2. **浮力插件**(使用C++或内置物理引擎) ```xml <!-- 浮冰基础模型示例(SDF文件) --> <model name="floating_ice"> <link name="ice_link"> <pose>0 0 0.5 0 0 0</pose> <collision name="collision"> <geometry> <box><size>2 2 1</size></box> </geometry> </collision> <visual name="visual"> <geometry> <box><size>2 2 1</size></box> </geometry> <material> <script> <uri>file://media/materials/scripts/ice.material</uri> <name>Gazebo/BlueIce</name> </script> </material> </visual> </link> <!-- 关键:浮力插件 --> <plugin name="buoyancy_plugin" filename="libBuoyancyPlugin.so"> <fluid_density>1025</fluid_density> <!-- 海水密度 --> <link name="ice_link"> <center_of_buoyancy>0 0 0</center_of_buoyancy> <area>4</area> <!-- 表面面积 --> </link> </plugin> </model> ``` ### 二、插件使用教程 1. **创建材质文件**(参考[^1]) ```bash # 创建冰面材质 sudo nano /usr/share/gazebo-<version>/media/materials/scripts/ice.material ``` 内容示例: ```material material Gazebo/BlueIce { technique { pass { texture_unit { texture ice.png filtering trilinear } } } } ``` 2. **在模型中调用插件** ```xml <!-- 在.world文件中添加 --> <include> <uri>model://floating_ice</uri> <pose>10 5 0 0 0 0</pose> </include> ``` 3. **启动仿真**(参考[^3]) ```bash roslaunch your_pkg ice_world.launch ``` ### 三、物理行为定制 可通过扩展内置插件实现复杂浮冰行为: ```cpp class IcePlugin : public ModelPlugin { public: void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf) { this->model = _model; this->updateConnection = event::Events::ConnectWorldUpdateBegin( boost::bind(&IcePlugin::OnUpdate, this)); } void OnUpdate() { // 添加冰面破裂/融化效果 if(sim_time > ice_life_time) { model->SetLinearVel(math::Vector3(0,0,-0.1)); // 下沉 } } }; GZ_REGISTER_MODEL_PLUGIN(IcePlugin) ``` ### 四、最佳实践建议 1. **纹理优化**(参考[^1]) - 使用透明PNG纹理实现冰面半透明效果 - 建议纹理尺寸为1024×1024,保存在`/media/materials/textures/` 2. **物理参数调整** - 浮力公式:$F_b = \rho V g$ - 适当增加$\mu$(摩擦系数)模拟冰面 3. **模型数据库集成**(参考[^2]) - 将模型放入`~/.gazebo/models/iceberg` - 通过Insert → Model Database直接调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值