CoppeliaSim(vrep)弹簧模型

方法一:使用内建关节控制器实现简单弹簧

1、首先要添加一个“prismatic”关节

(1)设置关节属性如下:
 mode:Torque/force mode
Motor enable 打钩
Control loop enable 打钩(这个是built-in 的关节控制器,实现类似于伺服电机的功能)
选择 Position control (PID)
设置PID参数(1,0,0)

(2)要实现弹簧的功能,首先要知道弹簧的原理:根据胡克定律,F=k*x,弹簧力由位移和刚度共同决定。在V-rep中,“prismatic”关节就像一个滑台,有最大、最小位置,和初始位置。类似的,我们也要设置好弹簧的工作范围,为了避免现实中弹簧“触底”的情况发生,要设置范围大于弹簧的振动范围。注意:Position[m]为+1,没显示全,为了能看到这个关节。

(3)根据PID控制,关节控制器的算法公式如下
PID控制=x*P+integratedErrors*I+(x-previous_x)*D
设置P=1,其余为0,公式变为ctrl=x*P
所以F=x*P*maxForce,(maxForce是电机的最大驱动力)

(4)所以,实际意义上的K值=P*maxForce,因为P=1,maxForce就是我们需要的弹簧刚度值

2、增加Cylinder和Cylinder0 是两个圆柱,Cylinder要把Body is dynamic 不勾选,否则将会被弹飞,Cylinder0要把Body is dynamic 勾选。结构框架如下图所示:
 

3、增加Graph,监测物体Cylinder0的Z方向的位置。

4、仿真,查看结果。正常来说,波形应该为标准的正弦波,如图,存在一定误差,要求严格的地方,不推荐使用。

方法二:使用sim.addForceAndTorque命令,模拟将弹力施加到Cylinder0.

(1)在方法一的基础上,增加新建一个threaded child script 输入如下内容:

function sysCall_threadmain()
sim.setThreadAutomaticSwitch(false)
cyhandle=sim.getObjectHandle('Cylinder')
cyhandle0=sim.getObjectHandle('Cylinder0')
initPosition=sim.getObjectPosition(cyhandle,cyhandle0)
k=100
while sim.getSimulationState()~=sim.simulation_advancing_abouttostop do
tempPosition=sim.getObjectPosition(cyhandle,cyhandle0)
distance=tempPosition[3]-initPosition[3]
print(distance)
lastforce=distance*k
sim.addForceAndTorque(cyhandle0,{0,0,distance*k},{0,0,0})
sim.switchThread() -- resume in next simulation step
end
end

(2)取消关节 Motor enabled  的勾选

(3)仿真,观察结果。波形已经非常接近正弦波形,误差很小。

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小蜗牛,大大梦想

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

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

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

打赏作者

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

抵扣说明:

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

余额充值