我正在尝试在 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 函数集成了两次。
获得所需扭矩的公式是:
(这是一个简化版,只有一个链接)
在哪里是重力大小,是质心在 x 方向上的距离,是链接的质量,并且是角度。
我想做的是用这个方程生成一个扭矩输入,然后进行数值积分以获得及其衍生物(主要用于测试目的)。
所以我试图用数字解决这个问题:
问题是当我整合超过 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 时间分辨率的结果:
有没有办法在没有这么多时间分辨率的情况下进行更精确的集成?

