В этом примере показано, как использовать 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
, можно непосредственно настроить все шесть циклов 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. Это может быть подтверждено путем проверки того, что параметры ПИ-контроллеров остаются установленными на их начальное значение (тип 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: Тонкая настройка отклика.
systune
| TuningGoal.MaxLoopGain
| TuningGoal.MinLoopGain
| TuningGoal.Tracking