积分直接动力学形式超过 1 秒不会返回正确的结果

计算科学 数值建模
2021-12-07 08:38:10

我正在尝试在 SciLab 中模拟机器人机械手动力学。

基本上,我生成了一个阶梯函数,其中一半时间加速度恒定,另一半时间加速度相同,但加速度为负值,因此我在操纵器位置之间实现了平滑过渡。

此代码从我提到的阶跃函数生成速度和位置:

function [position,velocity,acceleration,time]=smoothTransition(initialPosition,finalPosition,resolution,timeSpan)

    a=(finalPosition-initialPosition)/((timeSpan/2)**2);//magnitud of acceleration and deceleration so I get to final position in timespan
    acceleration=[ones(1,resolution/2)*a -ones(1,resolution/2)*a];
    if modulo(resolution,2) ~= 0 then
        acceleration=[acceleration -a];//case where time resolution is odd
    end
    time=linspace(0,timeSpan,resolution);
    function dx=f(t,x)
        dx(1)=x(2);
        dx(2)=linear_interpn(t,time,acceleration);

    endfunction
    x=ode([0;0],time(1),time,f);

    velocity=x(2,:);
    position=x(1,:);
endfunction

基本上,我将 step 函数集成了两次。

获得所需扭矩的公式是:

τ=gm1s1xcos(q)+q¨m1s1x2

(这是一个简化版,只有一个链接)

在哪里g是重力大小,s1x是质心在 x 方向上的距离,m1是链接的质量,并且q是角度。

我想做的是用这个方程生成一个扭矩输入,然后进行数值积分以获得q及其衍生物(主要用于测试目的)。

所以我试图用数字解决这个问题:

q¨=τgm1s1xcos(q)m1s1x2

问题是当我整合超过 1 秒时,我没有得到相同的行为。

执行此操作的代码如下

m_1=1;
g=9.81;
s_1x=1;
[position,velocity,acceleration,time]=smoothTransition(0,%pi/2,100,10);

tau=g*m_1*s_1x*cos(position)+acceleration*m_1*s_1x**2;

function dx=f(t,x)
    torque=linear_interpn(t,time,tau);
    dx(1)=x(2);
    dx(2)=(-g*m_1*s_1x*cos(x(1))+torque)/(m_1*s_1x**2);
endfunction
q0=[0;0];
q=ode(q0,0,time,f);
plot(time,position,'r');
plot(time,q(1,:),'g');

在这段代码中,我插入τ输入并集成两次,我怀疑问题出在这部分。

使用此代码,我得到下图:

图形

其中红色曲线是预期行为,绿色曲线是获得的行为。

顺便说一句,如果我增加时间分辨率,问题仍然存在。

编辑:

我意识到当我提高分辨率(比如说 10000)时,结果曲线(绿色)确实接近正确的行为(红色)。

这里是 10000 时间分辨率的结果:

具有 10000 时间分辨率的绘图

有没有办法在没有这么多时间分辨率的情况下进行更精确的集成?

1个回答

根据本硕士论文,从牛顿欧拉方法获得的关节臂动力学模型不能通过直接施加扭矩而没有反馈来控制(如在控制理论中)。我想浮点缺乏精度足以使机器人偏离想要的行为。

这是我可以得出的最佳答案,具有控制理论和机器人知识的人可以证实这一点。