Отслеживать объект вращения с кодировщиком с Matlab

Я пытаюсь отслеживать вращающийся объект с помощью кодера с использованием 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! Спасибо!!!

1
Было бы полезно, если бы вы могли уточнить, как выглядит ваша установка, где находится лазер относительно вращающегося объекта, как X- и Y-напряжение влияют на цель вашего лазера?
добавлено автор s.bandara, источник
Лазер должен следовать по круговой траектории на плоскости, перпендикулярной оси лазера. Напряжения перемещают два зеркала, которые посылают лазер, где я хочу (круговой путь в моем случае). Итак, я прочитал угловое положение моего объекта из кодировщика, вычисляю значения напряжения и посылаю их на лазер ... проблема в том, что лазер позади объекта с кодом, который я написал, потому что я не дать любую информацию о скорости или о времени. Я бы добавил их, но я не знаю, где именно в коде!
добавлено автор Sibillady, источник

1 ответы

Как насчет того, что вы отслеживаете предыдущие угловые скорости 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 предполагает, что угол указывается между нулем и двумя пи и что угол увеличивается с вращением. Вы должны отрегулировать эту коррекцию, если ваши углы ведут себя иначе.

Затем, прежде чем вы вычисляете VoltX и VoltY , вы можете использовать свою оценку для текущей угловой скорости, чтобы предсказать скорректированный Angle = Angle + est_omega * dt; , где dt - это ваше предположение о задержке цикла обратной связи. Вы можете выбрать это эмпирически. est_omega должен быть вычислен, а Angle исправить только , если длина (omega) == n . Вы не хотите вычислять медианный пустой список.

Кроме того, я вижу, что вы вычисляете x- и y-напряжения из некоторого atan (sin (Angle)) или atan (cos (Angle)) , соответственно. Я не уверен, что это правильно. Я считаю, что эти напряжения должны быть пропорциональны sin (Angle) или cos (Angle) без применения atan .

Я бы предположил, что это решение будет работать красиво, но для того, что вы здесь делаете, существует большая теория управления, чтобы извлечь из этого проблему, которая может решить вашу проблему более сложным образом.

0
добавлено
Ага, спасибо за разъяснение о том, как вы контролируете зеркала. Удачи.
добавлено автор s.bandara, источник
О напряжениях правильно подсчитать таким образом, потому что они пропорциональны углам thetaX и tethaY, которые являются углами зеркала (они не пропорциональны непосредственно sin и cos).
добавлено автор Sibillady, источник