两连杆机器鱼的简单建模方法

在机器鱼的建模过程中,无可避免地会遇到一个问题,那就是:

机器鱼的推进力是如何产生的呢?

如果不想明白这个问题,我们没有对推力建模,机器鱼甚至都无法前进,这样我们的建模工作自然就无法往下进行了。

如何对这个问题的解答呢?

生物学家会认为鱼类会利用身体摆动产生反卡门涡街,向后喷射,从而获得推进力,但貌似具体的建模方法有些复杂。

一些文献中,把鱼尾巴当做是一个机翼,用翼型理论来分析鱼尾受力,这样确实是一种方法。

一些文献中,则利用细长体理论来建模鱼尾受力。(这个不太清楚,就不瞎说了)

以上方法,我都可以理解推力是如何产生的,但是最让我郁闷的就是:

一些文献中把鱼尾巴的力分作两部分,一是附加质量力,二是粘滞阻力。

我非常不能理解,如果只有这两部分力的话,真的还可以创造向前的力吗?

毕竟咋一看,附加质量就是在原来基础上增加了一些质量,并不会产生推力,而阻力感觉上也不可能会产生推力。

(附加质量实际上就是说在水里物体运动要带动周围流体一块运动,这种效应可以近似看做为本体的质量增加了,增加的这部分质量就是附加质量。)

那么这样子是否真的可以产生推力呢?

直觉不可靠,让我们从一个简单的两连杆机器鱼出发,对其建立模型,来揭开我们的谜底吧!

1 两连杆机器鱼示意图

说明:

点bb bb代表鱼头质心,同时也是转动关节的所在位置,而点tt tt则代表鱼尾质心,从鱼头质心到鱼尾质心的向量由rbtrbt r_{bt}rbt​表示,鱼尾的转动角用θθ \thetaθ表示。图中的坐标系为鱼头坐标系。

1.1 关节运动规律

假设鱼尾以某种运动规律进行运动,具体而言就是,θ的变化遵循某种规律,这里采用的是余弦函数,如下:

2 两连杆机器鱼建模过程

2.1 鱼头分析

(1)位置和速度更新

假设鱼头在世界系的位置为Pw​,姿态为γ,这里就考虑二维的,所以姿态可以就用一个偏航角表达。

假设鱼头的速度为Vb​,角速度为Ωb,代表的是鱼头相对于惯性系的速度在鱼头坐标系的表示。

(注意,这里Pb,Vb​,Ωb​表示的还是三维向量)

位置更新公式为:

这里的(∗)z代表的就是括号内向量的第三个的元素。

另外:

速度更新公式为:

(2)水动力分析

在文章开头说了,我们主要是为了验证如果只考虑附加质量力和粘滞阻力的话,是否能产生推进力。附加质量实际上就是质量,我们只需要在正常的质量上再设置大一些就可以了,这里不需要再分析。而粘滞阻力,我们采取如下建模方式:

其中sign(∗)代表符号函数。

(3)受力分析

假设鱼头受到来自鱼尾的力F以及力矩M,利用牛顿欧拉公式,则有:

其中,mb​和Jb​分别是鱼头的质量和转动惯量 。

所以,鱼头的加速度和角加速度为:

2.2 鱼尾分析

(1)鱼尾速度计算

首先,根据图片,我们可以知道rbt​的表达式如下

其中,r代表了从b点到t点的距离。

其次,我们计算鱼尾的速度和加速度,如下:

其中,e3=[0,0,1]T。

(2)鱼尾受力分析

鱼尾受到来自鱼头的−F的力,以及−M的力矩。利用牛顿欧拉方程:

进一步整理,可得:

到这里,我们可以通过联立(1)和(2)方程,求解由尾巴运动,造成的鱼头加速度了。

Note. 如果对这些公式接受起来还有困难的话,读者可以移步:

3 MATLAB代码实现

以下代码,完全按照上述公式进行复现。

clc;

clear all;

close all;

% 物理参数——鱼头

mb = 1.0;

Jb = 0.01;

% 物理参数——鱼尾

mt = 0.2;

Jt = 0.001;

r = 0.1;

% 关节运动

theta = 0;

dtheta = 0;

ddtheta = 0;

a = pi*2;

b = pi/4;

% 运动状态

Vb = zeros(3,1);

dVb = zeros(3,1);

Wb = zeros(3,1);

dWb = zeros(3,1);

Vt = zeros(3,1);

dVt = zeros(3,1);

Wt = zeros(3,1);

dWt = zeros(3,1);

Yaw = 0;

Pos = zeros(3,1);

% 阻力系数

CFb = 10*[0.1; 0.01; 0];

CMb = [0; 0; 1];

CFt = [0.1; 0.1; 0.1];

% 力

F = zeros(3,1);

M = zeros(3,1);

% 其他辅助变量

e3 = [0;0;1];

time = [];

The = [];

Vel = [];

WVel = [];

Poslist = [];

Flist = [];

Mlist = [];

%% 主要仿真过程

for t = 0:0.01:20

% 给定关节运动

theta = b*cos(a*t);

dtheta = -a*b*sin(a*t);

ddtheta = -a*a*b*cos(a*t);

r_bt = r*[cos(theta);sin(theta);0];

% 鱼尾速度

Wt = Wb + dtheta*e3;

Vt = Vb + cross(Wt,r_bt);

% 鱼尾加速度

dWt = dWb + ddtheta*e3;

dVt = dVb + cross(Wt,Vb) + cross(dWt,r_bt)+cross(Wt,cross(Wt,r_bt));

% 力

F = -mt*dVt;

M = cross(r_bt, F) - Jt*dWt - cross(Wt, Jt*Wt);

% 计算阻力

Fdb = -0.5*CFb.*[sign(Vb(1))*Vb(1)*Vb(1); sign(Vb(2))*Vb(2)*Vb(2); sign(Vb(3))*Vb(3)*Vb(3)];

Mdb = -0.5*CMb.*[sign(Wb(1))*Wb(1)*Wb(1); sign(Wb(2))*Wb(2)*Wb(2); sign(Wb(3))*Wb(3)*Wb(3)];

Fdt = -0.5*CFt.*[sign(Vt(1))*Vt(1)*Vt(1); sign(Vt(2))*Vt(2)*Vt(2); sign(Vt(3))*Vt(3)*Vt(3)];

% 分析头部连杆,计算鱼头加速度

dVb = (F+Fdb-mb*cross(Wb, Vb))/mb;

dWb = (M+Mdb-cross(Wb,Jb*Wb))/Jb;

% 鱼头速度更新

Vb = Vb + dVb*0.01;

Wb = Wb + dWb*0.01;

% 鱼头位置更新

Yaw = Yaw + Wb(3)*0.01;

R = [cos(Yaw), -sin(Yaw), 0;

sin(Yaw), cos(Yaw), 0;

0, 0, 1];

Vw = R*Vb;

Pos = Pos + Vw*0.01;

% 收集数据

time = [time, t];

Poslist = [Poslist, Pos];

Flist = [Flist, F];

Mlist = [Mlist, M];

Vel = [Vel, Vb];

WVel = [WVel, Wb];

end

%% 绘图

figure(1)

subplot(3,2,1)

title('力');

hold on

plot(time, Flist(1,:),'r')

ylabel('X')

grid on

subplot(3,2,3)

plot(time, Flist(2,:),'g')

ylabel('Y')

grid on

subplot(3,2,5)

plot(time, Flist(3,:),'b')

ylabel('Z')

grid on

subplot(3,2,2)

title('力矩');

hold on

plot(time, Mlist(1,:),'r')

ylabel('X')

grid on

subplot(3,2,4)

plot(time, Mlist(2,:),'g')

ylabel('Y')

grid on

subplot(3,2,6)

plot(time, Mlist(3,:),'b')

ylabel('Z')

grid on

figure(2)

subplot(3,2,1)

title('速度');

hold on

plot(time, Vel(1,:),'r')

ylabel('X')

grid on

subplot(3,2,3)

plot(time, Vel(2,:),'g')

ylabel('Y')

grid on

subplot(3,2,5)

plot(time, Vel(3,:),'b')

ylabel('Z')

grid on

subplot(3,2,2)

title('角速度');

hold on

plot(time, WVel(1,:),'r')

ylabel('X')

grid on

subplot(3,2,4)

plot(time, WVel(2,:),'g')

ylabel('Y')

grid on

subplot(3,2,6)

plot(time, WVel(3,:),'b')

ylabel('Z')

grid on

figure(3)

plot(Poslist(1,:),Poslist(2,:))

grid on

axis equal

4 仿真结果分析

4.1 鱼头固定,只摆动鱼尾,推力的效果

以上是力的曲线,可以看出总体上,X轴上的力有往负半轴偏移的趋势。说明,当鱼头不固定时,很有可能鱼尾的摆动会产生一定的前向力,但是有两次,分别是10s和35s的时候正向上出现了很大的力,也就是说,出现后向力的可能性也有,主要取决于鱼头当时的状态。

以上是速度和轨迹的图线,可以看到,鱼头是忽进忽退的,速度一会儿朝前,一会儿朝后。

综上,在这种情况下,并不能产生稳定的推力。

4.3 鱼头不固定,摆动鱼尾,考虑阻力

看到这里,是不是感叹,奇迹发生了!

考虑了阻力以后,X轴上的力往负半轴偏移了,速度也往负半轴方向增长,鱼游动的轨迹也成了一条直线。鱼顺利产生了推进力,和实验中观察到的现象是一致的。

究其原因,大概是,考虑阻力以后,鱼头的晃动变得可控,使得力始终保持在鱼体的轴线附近,从而产生了推进力!

5 小结

OK!

看到了这里,我们已经验证了,只考虑附加质量和阻力实际上确实可以产生推进力,而且阻力在这里起到了至关重要的作用。

但是阻力究竟是如何起作用的呢?

我也还在探索中,有了新发现再来更新吧!

Matlab多惯量仿真,两连杆机器鱼的简单建模以及MATLAB仿真相关推荐

  1. 两连杆机器鱼的简单建模以及MATLAB仿真(2)

    两连杆机器鱼的简单建模以及MATLAB仿真(2) 上一篇文章中,写过了关于两连杆机器鱼建模的方法.实际上,有一个细节值得注意,那就是在联立(1)和(2)方程,求解鱼头加速度,这一步中,是如何联立求解的 ...

  2. 两连杆机器鱼的简单建模以及MATLAB仿真

    两连杆机器鱼的简单建模方法 在机器鱼的建模过程中,无可避免地会遇到一个问题,那就是: 机器鱼的推进力是如何产生的呢? 如果不想明白这个问题,我们没有对推力建模,机器鱼甚至都无法前进,这样我们的建模工作 ...

  3. 用matlab和RTB做二连杆机械臂动力学建模

    文章目录 写在前面 二连杆机械臂 RTB建模 仿真与验证 源代码 写在前面 本文使用的工具为matlab以及Peter Corke的RTB(Robotics Toolbox).基于RTB 10.3.1 ...

  4. matlab在数学中的应用论文,探究数学建模中MATLAB的运用

    随着科学技术的高速发展,自然科学的各个领域都需要在调查研究的基础上建立数学模型,并通过计算解决实际问题.数学建模在合理假设的基础上将实际问题简单化.抽象化,用数学知识解决问题并接受实践的检验.在这一过 ...

  5. matlab求动物繁殖问题,动物繁殖问题数学建模实验matlab程序.doc

    动物繁殖问题数学建模实验matlab程序 问题: 谋农场饲养的某种动物所能达到的最大年龄为15岁,将其分为三个年龄组:第一组0-5岁:第二组6-10岁:第三组11-15岁.动物从第二个年龄组开始繁殖后 ...

  6. matlab 遗传算法编码,【转载】一份简单的遗传算法MATLAB代码 | 古意人

    遗传算法基本原理并不复杂,但是在网上搜索的话往往会找到很庞大的代码,对matlab的新手来说不太合适.在这里我有一份很简单的遗传算法程序,总共就几十行的代码,却把遗传算法的精髓给体现得淋漓尽致了,尤其 ...

  7. matlab app设计步骤_1.1数学建模与MATLAB–MATLAB入门

    1.1数学建模与MATLAB–MATLAB入门 关注本专栏,继续分享数学建模与MATLAB知识 一.MATLAB是什么? MATLAB 是目前在国际上被广泛接受和使用的科学与工程计算软件.虽然 Cle ...

  8. 光伏发电并网逆变simulink/matlab仿真 两级三相/单相系统

    光伏发电并网逆变simulink/matlab仿真 两级三相/单相系统 前级采用boost升压斩波电路 mppt最大功率点跟踪采用扰动观察法 可接单相或者三相并网逆变 id=666229534115& ...

  9. 三相两相坐标变换matlab仿真,交流电机的三相静止到两相静止及两相静止到两相旋转坐标变换的分析及MATLAB仿真...

    一 笼 一田娜侧如 伺服电动机资 一 交流电机的三相静止到两相静止及两相静止到两相旋转坐标变换的分析及日 仿真 兰州交通大学自动化与电气工程学院 吴炳娇 摘 要 矢量变换在交流电机复杂模型的简化中发挥 ...

  10. 设定行车路线实验matlab,桥式吊车小车运动控制系统的建模及MATLAB仿真讲解.doc...

    桥式吊车小车运动控制系统的建模及MATLAB仿真讲解 线性系统理论上机实验报告 题目:桥式吊车小车运动控制系统的建模及MATLAB仿真 班级:控制[专研]-12: 学号:2012309030122号: ...

最新文章

  1. python字典通讯录_Python利用字典将两个通讯录文本合并为一个文本实例
  2. 最小生成树板子-AcWing 858. Prim算法求最小生成树
  3. Origin教程:DSC曲线的描述和绘制
  4. OPMS项目管理系--新增加项目报表统计
  5. 视频搜索时代到来了吗?[翻译]
  6. PAT乙级(1027 打印沙漏)
  7. Qt编程之对QGraphicsItem点击右键弹出菜单
  8. 数据库基本----SQL语句大全(转载)
  9. Mycat快速入门(六): Mycat管理命令和监控
  10. 人工智能初步学习笔记
  11. 计算机专业的浪漫情话,计算机科学与技术表白情话
  12. 国王学院计算机科学,伦敦大学国王学院计算机科学本科.pdf
  13. 消息队列(mq)是什么?
  14. 阿里云oss文件上传(简单上传、服务端签名后直传)
  15. Audition CS6 安装到2%出现安装失败
  16. 【Akka】Akka并发编程设计
  17. .net core 压力测试 web性能工具
  18. 为什么要学习网络协议?
  19. 电脑版pdf阅读器有哪些?编辑途径分析
  20. C#实现信用卡用户还款功能

热门文章

  1. 第五步_安装编译必须的软件包依赖包
  2. 系统提示 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。
  3. 对博客园文章审核规则的质疑
  4. 理解文档对象模型(2)
  5. PotPlayer 禁止更新
  6. SVM 学习心得
  7. javascript实现跳转菜单
  8. .NET 中的序列化
  9. Docker 全套笔记整理
  10. HCIE RS 2019.11.05面试战报