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は、角度が 0 から 2 pi の間で報告され、回転とともに角度が増加することを前提としています。角度が異なる動作をする場合は、この補正を調整する必要があります。

次に、 と を計算する前にVoltXVoltY現在の角速度の推定値を使用して、修正された を予測できます。Angle = Angle + est_omega * dt;ここdtで、フィードバック ループの遅延を推測します。経験的にそれを選択できます。est_omegaを計算し、Angle修正するだけif length(omega) == nです。median空のリストのを計算したくありません。

atan(sin(Angle))また、いくつかのまたはからそれぞれx 電圧と y 電圧を計算しているのがわかりますatan(cos(Angle))。それが正しいかどうかはわかりません。sin(Angle)これらの電圧は、印加されているかどうかcos(Angle)に比例する必要があると思いますatan

この解決策はうまく機能すると思いますが、ここで行っていることには、より洗練された方法で問題を解決できる制御理論が多数あります。

于 2013-02-07T20:39:49.470 に答える