exponenta event banner

Многоконтурное управление PI роботизированной руки

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

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

С 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 настраивает только цикл обратной связи и не «видит» компонент прямой связи. Это может быть подтверждено проверкой того, что$b$ параметры ПИ контроллеров остаются установленными на их начальное значение ($b=1$тип 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: Отклик с точной настройкой.

См. также

| | |

Связанные темы