Многоконтурное управление ПИ-контроллером роботизированной руки

В этом примере показано, как использовать looptune для настройки мультицикла для 6-DOF манипулятора с роботизированными рычагами.

Модель и контроллер роботизированной руки

Этот пример использует роботизированную руку с шестью степенями свободы, показанную ниже. Эта рука состоит из шести соединений, маркированных от основы до чаевых: «Turntable», «Bicep», «Forearm», «Wrist», «Hand» и «Gripper». Каждое соединение приводится в действие двигателем постоянного тока, за исключением соединения Бисепа, которое использует два двигателя постоянного тока совместно.

Фигура 1: Манипулятор руки робота.

Файл «cst_robotarm.slx» содержит модель Simulink электрических и механических компонентов этой системы.

Фигура 2: Simulink модель роботизированной руки.

Подсистема «Контроллера» состоит из шести цифровых ПИ-контроллеров (по одному на соединение). Каждое ПИ-контроллер реализовано с помощью блока «2-DOF PID Controller» из библиотеки Simulink (см. ПИД Настройка для отслеживания уставки и Подавления помех пример для мотивации). Время контрольного расчета составляет Ts = 0,1 (10 Гц).

Фигура 3: Структура контроллера.

Обычно такие многоконтурные контроллеры настраиваются последовательно путем настройки по одному циклу ПИД за раз и циклически по циклам до тех пор, пока общее поведение не будет удовлетворительным. Этот процесс может быть длительным и не гарантированно сходиться к лучшему общему настройке. Также можно использовать systune или looptune совместная настройка всех шести циклов PI с учетом уровня системы требований, таких как время отклика и минимальное сцепление.

В этом примере рычаг должен двигаться к определенному строению примерно за 1 секунду с плавным угловым движением в каждом соединении. Рычаг запускается в полностью выдвинутом вертикальном положении со всеми углами поворота шарнира в нуле, кроме угла Бикепа в девяносто степенях. Конечное строение определяется угловыми положениями: Поворотный стол = 60 o, Bicep = 80 o, Предплечье = 60 o, Запястье = 90 o, Рука = 90 o и Захват = 60 o.

Нажмите кнопку «Play» в модели Simulink, чтобы симулировать угловые траектории для значений усиления PI, заданных в модели. Можно сначала дважды кликнуть по синей кнопке, чтобы также показать 3D анимацию руки робота. Угловые отклики и 3D анимация появляются ниже. Очевидно, что реакция слишком медленная и неточная.

Фигура 4: Untuned response.

Линеаризация объекта

Динамика руки робота нелинейна. Чтобы понять, можно ли управлять рукой с помощью одного набора усилений PI, линеаризируйте объект в различных точках (время моментального снимка) по интересующей траектории. Здесь «объект» относится к динамике между управляющими сигналами (выходами блоков ПИД) и сигналами измерения (выходом блока «6 DOF Robot Arm»).

SnapshotTimes = 0:1:5;
% Plant is from PID outputs to Robot Arm outputs
LinIOs = [...
   linio('cst_robotarm/Controller/turntablePID',1,'openinput'),...
   linio('cst_robotarm/Controller/bicepPID',1,'openinput'),...
   linio('cst_robotarm/Controller/forearmPID',1,'openinput'),...
   linio('cst_robotarm/Controller/wristPID',1,'openinput'),...
   linio('cst_robotarm/Controller/handPID',1,'openinput'),...
   linio('cst_robotarm/Controller/gripperPID',1,'openinput'),...
   linio('cst_robotarm/6 DOF Robot Arm',1,'output')];
LinOpt = linearizeOptions('SampleTime',0);  % seek continuous-time model
G = linearize('cst_robotarm',LinIOs,SnapshotTimes,LinOpt);

size(G)
6x1 array of state-space models.
Each model has 6 outputs, 6 inputs, and 19 states.

Постройте график зазора между линеаризированными моделями на t = 0,1,2,3,4 секунд и конечной моделью на t = 5 секунд.

G5 = G(:,:,end);  % t=5
G5.SamplingGrid = [];
sigma(G5,G(:,:,2:5)-G5,{1e-3,1e3}), grid
title('Variation of linearized dynamics along trajectory')
legend('Linearization at t=5 s','Absolute variation',...
       'location','SouthWest')

Хотя динамика значительно изменяется при низкой и высокой частоте, изменение падает до менее чем 10% около 10 рад/с, что примерно является желаемой пропускной способностью управления. Небольшие изменения объекта вблизи целевой частоты среза усиления позволяют предположить, что мы можем управлять рукой с одним набором усилений PI и не должны прибегать к табличному управлению.

Настройка ПИ-контроллеров с помощью LOOPTUNE

С looptune, можно непосредственно настроить все шесть циклов PI, чтобы достичь желаемого времени отклика с минимальным взаимодействием цикла и адекватными запасами устойчивости MIMO. Контроллер настраивается за непрерывное время и автоматически дискретизируется при записи добавок ПИ в Simulink. Используйте slTuner интерфейс для определения блоков, которые должны быть настроены, и определения местоположения контура объекта/контроллера.

% Linearize the plant at t=3s
tLinearize = 3;

% Create slTuner interface
TunedBlocks = {'turntablePID','bicepPID','forearmPID',...
               'wristPID','handPID','gripperPID'};
ST0 = slTuner('cst_robotarm',TunedBlocks,tLinearize);

% Mark outputs of PID blocks as plant inputs
addPoint(ST0,TunedBlocks)

% Mark joint angles as plant outputs
addPoint(ST0,'6 DOF Robot Arm')

% Mark reference signals
RefSignals = {...
   'ref Select/tREF',...
   'ref Select/bREF',...
   'ref Select/fREF',...
   'ref Select/wREF',...
   'ref Select/hREF',...
   'ref Select/gREF'};
addPoint(ST0,RefSignals)

В простейшем использовании looptune необходимо знать только целевую управляющую полосу, которая должна быть как минимум в два раза больше, чем требуемое время отклика. Здесь желаемое время отклика составляет 1 секунду, поэтому попробуйте целевую полосу 3 рад/с (принимая во внимание, что динамика объекта изменяется как минимум около 10 рад/с).

wc = 3;  % target gain crossover frequency
Controls = TunedBlocks;      % actuator commands
Measurements = '6 DOF Robot Arm';  % joint angle measurements
ST1 = looptune(ST0,Controls,Measurements,wc);
Final: Peak gain = 0.957, Iterations = 10
Achieved target gain value TargetGain=1.

Окончательное значение около или ниже 1 указывает, что looptune достигается требуемая пропускная способность. Сравните отклики на команду step в угловом положении для начального и настроенного контроллеров.

T0 = getIOTransfer(ST0,RefSignals,Measurements);
T1 = getIOTransfer(ST1,RefSignals,Measurements);

opt = timeoptions; opt.IOGrouping = 'all'; opt.Grid = 'on';
stepplot(T0,'b--',T1,'r',4,opt)
legend('Initial','Tuned','location','SouthEast')

Шесть кривых, оседающих вблизи y = 1, представляют переходные реакции каждого соединения, а кривые, оседающие вблизи y = 0, представляют условия перекрестного взаимодействия. Настроенный контроллер является явным улучшением, но есть некоторое перерегулирование, и реакция Bicep занимает много времени, чтобы осесть.

Использование второй степени свободы

У 2-DOF ПИ-контроллеров быть компонент feedforward и обратной связи.

Фигура 5: Два ПИД-регулятора степени свободы.

По умолчанию looptune настраивает только цикл обратной связи и не «видит» компонент feedforward. Это может быть подтверждено путем проверки того, что$b$ параметры ПИ-контроллеров остаются установленными на их начальное значение ($b=1$тип showTunable(ST1) для просмотра настроенных значений). Чтобы воспользоваться преимуществами действия с feedforward и уменьшить перерегулирование, замените цель полосы пропускания явным требованием отслеживания шага от ссылок до углов поворота шарнира.

TR = TuningGoal.StepTracking(RefSignals,Measurements,0.5);
ST2 = looptune(ST0,Controls,Measurements,TR);
Final: Peak gain = 0.766, Iterations = 13
Achieved target gain value TargetGain=1.

Настройка 2-DOF устраняет перерегулирование и улучшает ответ Bicep.

T2 = getIOTransfer(ST2,RefSignals,Measurements);
stepplot(T1,'r--',T2,'g',4,opt)
legend('1-DOF tuning','2-DOF tuning','location','SouthEast')

Валидация настроенного контроллера

Настроенные линейные отклики выглядят удовлетворительно, поэтому запишите настроенные значения усилений PI обратно в блоки Simulink и симулируйте полный маневр. Эти результаты симуляции появляются в Фигуру 6.

writeBlockValue(ST2)

Фигура 6: Настроенные угловые отклики.

Нелинейная реакция соединения Бисепа заметно снижается. Дальнейшее расследование предполагает двух возможных виновников. Во-первых, ПИ-контроллеры слишком агрессивны и насыщают двигатели (вход напряжение ограничен ± 5 В).

Фигура 7: Входное напряжение для двигателей постоянного тока (сигнал управления).

Во-вторых, эффекты перекрестного связывания между запястьем и бицепсом, когда они доводятся до шкалы, оказывают значительное и длительное влияние на ответ Бицепа. Чтобы увидеть это, постройте график переходной характеристики этих трех соединений для фактических изменений шага, происходящих во время маневра (-10 ° для соединения Бисепа и 90 степеней для соединения запястья).

H2 = T2([2 4],[2 4]) * diag([-10 90]);  % scale by step amplitude
H2.u = {'Bicep','Wrist'};
H2.y = {'Bicep','Wrist'};
step(H2,5), grid

Уточнение проекта

Чтобы улучшить реакцию Бисепа для этого конкретного маневра руки, мы должны сохранить эффекты поперечных связей маленькими относительно конечных угловых перемещений в каждом соединении. Для этого масштабируйте условия поперечной связи в требовании отслеживания шага по ссылкам угла.

JointDisp = [60 10 60 90 90 60];  % commanded angular displacements, in degrees
TR.InputScaling = JointDisp;

Для уменьшения насыщенности приводов ограничьте коэффициент усиления от опорных сигналов до управляющих сигналов.

UR = TuningGoal.Gain(RefSignals,Controls,6);

Перемонтируйте контроллер с этими уточненными целями настройки.

ST3 = looptune(ST0,Controls,Measurements,TR,UR);
Final: Peak gain = 1.14, Iterations = 185

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

T2s = diag(1./JointDisp) * T2 * diag(JointDisp);
T3s = diag(1./JointDisp) * getIOTransfer(ST3,RefSignals,Measurements) * diag(JointDisp);
stepplot(T2s,'g--',T3s,'m',4,opt)
legend('Initial 2-DOF','Refined 2-DOF','location','SouthEast')

Переместите измененные значения в Simulink для дальнейшей валидации.

writeBlockValue(ST3)

Эти результаты симуляции появляются в Фигуру 8. Реакция Bicep теперь находится на одном уровне с другими соединениями с точки зрения времени урегулирования и плавности переходного процесса, и существует меньше насыщение привода, чем в предыдущих проектах.

Фигура 8: Угловые положения и сигналы управления с уточненным контроллером.

Анимация 3D подтверждает, что рука теперь быстро и точно переходит к нужному строению.

Фигура 9: Тонкая настройка отклика.

См. также

| | |

Похожие темы