В этом примере показано, как использовать looptune настройка многоконтурного контроллера для 6-DOF роботизированного манипулятора руки.
В этом примере используется шесть роботизированных манипуляторов со степенью свободы, показанных ниже. Эта рука состоит из шести суставов с маркировкой от основания до кончика: «Поворотник», «Бицепс», «Предплечье», «Запястье», «Рука» и «Захватчик». Каждое соединение приводится в действие двигателем постоянного тока, за исключением соединения Bicep, в котором используются два двигателя постоянного тока в тандеме.

Рисунок 1: Манипулятор роботизированной руки.
Файл «cst_robotarm.slx» содержит модель Simulink электрических и механических компонентов этой системы.

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

Рис. 3: Структура контроллера.
Обычно такие контроллеры с несколькими контурами настраиваются последовательно путем настройки одного ПИД-контура за один раз и циклического прохождения по контурам до тех пор, пока общее поведение не будет удовлетворительным. Этот процесс может занять много времени и не может сойтись с лучшей общей настройкой. Кроме того, можно использовать systune или looptune совместная настройка всех шести контуров PI в соответствии с требованиями системного уровня, такими как время отклика и минимальное кросс-соединение.
В этом примере рука должна перемещаться к определенной конфигурации примерно за 1 секунду с плавным угловым движением в каждом соединении. Рука начинается в полностью вытянутом вертикальном положении со всеми углами соединения на нуле, за исключением угла Бицепса на девяносто градусов. Концевая конфигурация задается угловыми положениями: Поворотный = 60 °, Бицепс = 80 °, Предплечье = 60 °, Запястье = 90 °, Рука = 90 °, и Захват = 60 °.
Нажмите кнопку «Play» в модели Simulink, чтобы смоделировать угловые траектории для значений коэффициента усиления PI, указанных в модели. Можно сначала дважды щелкнуть синюю кнопку, чтобы показать 3D анимацию роботизированной руки. Угловые отклики и анимация 3D отображаются ниже. Очевидно, что реакция слишком вялая и неточная.


Рис. 4: Не настроенный ответ.
Динамика рук робота нелинейна. Чтобы понять, можно ли управлять рукой с помощью одного набора коэффициентов 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. Контроллер настраивается в непрерывное время и автоматически дискретизируется при записи PI получает обратно в 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 достигнута запрошенная полоса пропускания. Сравните ответы на команду шага в угловом положении для начального и настроенного контроллеров.
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 PI имеют компонент обратной связи и обратной связи.

Рис. 5: Два контроллера PID степени свободы.
По умолчанию looptune настраивает только цикл обратной связи и не «видит» компонент прямой связи. Это может быть подтверждено проверкой того, что
параметры ПИ контроллеров остаются установленными на их начальное значение (
тип showTunable(ST1) для просмотра настроенных значений). Чтобы воспользоваться преимуществами прямого действия и уменьшить перегрузку, замените цель полосы пропускания на явное требование пошагового отслеживания от опорных углов к углам соединения.
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: Настроенные угловые отклики.
Нелинейный отклик бицепсовского сустава заметно подпрыгивает. Дальнейшее расследование предполагает двух возможных виновников. Во-первых, контроллеры PI слишком агрессивны и насыщают двигатели (входное напряжение ограничено ± 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

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