1

我正在尝试使用 Matlab 使用编码器跟踪旋转物体。我有一个编码器,它可以给我物体的角位置,然后我将此信息传递给激光器,但是如何以与物体相同的速度移动激光器?因为现在激光比物体慢,而且跟不上!我写了这段代码,有人有什么建议吗?

Alpha=pi/2
Positions = [];

t0 = clock;                                

while etime(clock,t0)<20;

  position = data.Position;   %here I read the angular position from the encoder
  Positions = [Positions position];
  A = [floor(Positions/360)];
  angPos = position-(floor(position/360))*360;
  AngPos = [Positions - A*360];
  angRad = angPos*pi/180;
  AngRad = [AngPos*pi/180];

  Angle = angRad+Alpha;
  thetaX = atan(cos(Angle).*(r/d)); 
  thetaY = atan(sin(Angle).*(r/d));

  VoltX=-(5/20)*thetaX*180/pi; 
  VoltY=(5/20)*thetaY*180/pi;    

  VoltageLimit = 10;

  if (max(abs(VoltX))>VoltageLimit) || (max(abs(VoltY))>VoltageLimit)
error('Voltages too large');
  end           

 session.outputSingleScan([VoltX VoltY]);   %here I send the laser the angular position obtained before 

 data = motorA.ReadFromNXT();

end 

我知道我应该加上速度,所以我可以以与物体相同的速度移动激光,但我不知道如何给激光那个速度值!

sec = etime(clock,t0);
Sec = [Sec sec];

vel=(diff(Positions)/diff(Sec));
Vel = [Vel vel]; %(deg/s);

也许这是一个愚蠢的问题,但我在 Matlab 中很新!谢谢!!!

4

1 回答 1

0

您如何跟踪在进入循环之前初始化为空n = 3的某个向量中的最后一个先前的角速度。omega = []您还应该记住prev_t = []前一次迭代的时间戳以及前一个角度prev_a = [],以便执行此操作。

n在每次迭代中,您可以通过管理先前观察到的速度的向量来更新您对当前角速度的猜测

current_t = clock();
if ~isempty(prev_t)
  if length(omega) == n
    omega(1) = [];
  end
  delta_omega = Angle - prev_a;
  if delta_omega < 0
    delta_omega = delta_omega + 2 * pi; 
  end
  omega = [omega, delta_omega / etime(current_t, prev_t)];
end
prev_t = current_t;
prev_a = Angle;

对角速度的估计可能是这些n先前测量值的平均值,可能est_omega = median(omega)对异常值有些鲁棒。溢出校正delta_omega假设报告的角度在零和两个 pi 之间,并且角度随着旋转而增加。如果您的角度表现不同,您应该调整此校正。

然后,在计算VoltX和之前VoltY,您可以使用对当前角速度的估计来预测修正Angle = Angle + est_omega * dt;后的 ,dt您对反馈回路延迟的猜测在哪里。你可以凭经验选择。est_omega应该被计算,并且Angle只能被修正if length(omega) == n。您不想计算median空列表的。

另外,我看到您分别从 someatan(sin(Angle))或计算 x 和 y 电压。atan(cos(Angle))我不确定这是否正确。我相信这些电压应该与施加sin(Angle)cos(Angle)atan施加成正比。

我想这个解决方案会很好地工作,但是对于你在这里所做的事情,有大量的控制理论可以借鉴,可能会以更复杂的方式解决你的问题。

于 2013-02-07T20:39:49.470 回答