运用CPG算法控制的绳驱机器鱼

本文主要是复现了Central Pattern Generator(CPG) Control of a Biomimetic Robot Fish for Multimodal Swimming中的CPG算法。论文链接可见DOI:https://doi.org/10.1007/s42235-019-0019-2

机器鱼运动学分析

根据Lighthill的理论,鱼体在行进时的鱼体中线可用公式概括:

y(x,t)=(c_{1}x+c_{2}x^2)sin(kx+\omega t)

 在公式中,c_{1},c_{2}分别表示鱼体摆动的一次与二次波振幅包络(wave amplitude envelop),k=\frac{2\pi}{\lambda },\lambda分布表示鱼体波动数与鱼体波动长度,\omega表示鱼体波动角速度。上图中鱼体行进的角度\Phi

在原文中采用的是绳驱式(wire-driven)机器鱼,鱼尾的摆动主要依靠拉绳的伸长与缩短。其结构可如下图所示。

其中需要注意的是图(c),这是两个关节之间的最基本结构。N为关节数,d为两侧拉绳的距离,H为关节的高度,h_{0}为两关节之间的距离,根据这个视图,\frac{\Phi }{N}表示该关节的弯曲角度,w_{l}w_{r}分布表示两侧拉绳的长度。根据这个结构的几何分析,可得到拉绳长度变化与该关节弯曲角度的关系(左边长右边就短):

\Delta w_{l} = -\left [ d\sin(\frac{\Phi }{2N})+2h_{0}\sin^2(\frac{\Phi }{4N}) \right ]

\Delta w_{r} = d\sin(\frac{\Phi }{2N})-2h_{0}\sin^2(\frac{\Phi }{4N})

由于该关节的弯曲角度非常小,所以上述公式可以进一步简化为

\left | \Delta w_{l} \right |=\left | \Delta w_{r} \right |=d\sin (\frac{\Phi }{2N})

 进一步,可得舵机的旋转角度\alpha与鱼体活动关节的旋转角度\Phi的关系为

\Phi =2Nsin^{-1}(\frac{\alpha r}{Nd})

第i个关节在XOY坐标系的位置可以表示为

x_{i}(t)=\sum_{j=1}^{i}((H+h_{0})\cos (\frac{j\Phi }{N}))

y_{i}(t)=\sum_{j=1}^{i}((H+h_{0})\sin (\frac{j\Phi }{N}))

机器鱼的控制方法

在该论文中,采用CPG的控制方法,由于绳驱动模式,只需要一个电机进行控制,故没有神经元之间的相互影响。改进后的CPG公式如下:

\ddot{b}=k_{b}(0.25k_{b}(B-b)-\dot{b})

\ddot{m}=k_{m}(0.25k_{m}(M-m)-\dot{m})

\dot{\phi }=\left [ \frac{(1+R)^2}{4R}-\frac{R^2-1}{4R}sgn(\sin \phi )) \right ]\omega

\alpha =b+m\cos(\phi )

\beta =b+m\sin (\phi)

在CPG公式组中,存在四个控制参数:(M,\omega ,B, R)\alpha为舵机的输出信号,设定有上下限幅-60°~60°。

仿真实验

根据论文所给的鱼体机构的参数,设置有N=5,d=36mm,r=33mm。只需要设置上述所提到的四个控制参数,就可以控制鱼体进行前进与转弯,当需要鱼体转弯时,设置CPG的参数(M,\omega ,B, R)=(30,2\pi,0,1)

采用matlab进行仿真,代码如下,

M = 30
w = 2*pi
B = 0
R = 1

Kb = 10
Km = 10
N = 5
d = 36
r = 33
b = 0
first_b = 0
second_b = 0

m = 0
first_m = 0
second_m = 0

fai = 0
first_fai = 0

alpha = 0
beta = 0
bending_angle = 0

alpha_array = []
beta_array = []
T_array = []
bending_angle_array = []

T = 0.05

for t = 0:T:5
    second_b = Kb * (0.25 * Kb * (B - b) - first_b)
    second_m = Km * (0.25 * Km * (M - m) - first_m)
    first_fai = (((1 + R)^2)/(4 * R) - ((R^2 - 1)/(4 * R)) * sign(sin(fai))) * w
    
    fai = fai + T * first_fai
    first_b = first_b + T * second_b
    b = b + T * first_b
    
    first_m = first_m + T * second_m
    m = m + T * first_m
    
    alpha = b + m * cos(fai)
    beta = b + m * sin(fai)
    
    if alpha > 60
        alpha = 60
    end
    if alpha < -60
        alpha = -60
    end
    bending_angle = 2 * N * asind((deg2rad(alpha) * r)/(N * d))
    
    alpha_array = [alpha_array; alpha]
    beta_array = [beta_array; beta]
    T_array = [T_array; t]
    bending_angle_array = [bending_angle_array; bending_angle]
end

figure
plot(T_array, alpha_array, T_array, bending_angle_array)
xlabel('Times (s)')
ylabel('Angel (°)')
title('The CPG control signals for cruising mode')
legend('The rotational angle of servomotor', 'Bending angle')

最终,仿真的结果如图,与论文结果相符合

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要模拟的运动,你可以使用 Unity 的 Rigidbody2D 组件和一些基本的物理原理。下面是一个简单的示例代码,展示了如何利用代码模拟的运动: ```C# using UnityEngine; public class Fish : MonoBehaviour { public float speed = 5f; // 的移动速度 private Rigidbody2D rb; private void Start() { rb = GetComponent<Rigidbody2D>(); // 设置初始的随机移动方向 Vector2 randomDirection = Random.insideUnitCircle.normalized; rb.velocity = randomDirection * speed; } private void Update() { // 如果的速度小于一定阈值,重新选择随机移动方向 if (rb.velocity.magnitude < 0.1f) { Vector2 randomDirection = Random.insideUnitCircle.normalized; rb.velocity = randomDirection * speed; } // 让的头部朝向移动方向 transform.up = rb.velocity.normalized; } } ``` 在这个示例代码中,的运动由 Rigidbody2D 控制。在 Start 方法中,我们为设置了一个随机的初始移动方向,并根据速度确定初始的移动速度。然后,在 Update 方法中,我们检查的速度是否小于一个阈值,如果是,则重新选择一个随机移动方向。最后,我们使用 transform.up 将的头部朝向当前的移动方向。 请将此脚本附加到的游戏对象上,并根据你的需求调整参数,如速度等。这样,就会以一定的速度在场景中随机移动,并且头部朝向移动方向。你可以根据需要进一步扩展代码,添加更多的行为和交互。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶点读机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值