1. Вступ
Ряд кінематичних модулів підтримують перемикання кінематичних розрахунків. Ці модулі підтримують стандартний кінематичний метод (тип 0), другий вбудований метод (тип 1) і (опціонально) кінематичний метод, наданий користувачем (тип 2). Для методу типу 1 зазвичай використовується ідентична кінематика.
Функціональність switchkins може використовуватися для верстатів, де під час налаштування необхідне управління суглобами після повернення в початкове положення або для уникнення руху поблизу сингулярностей з G-коду. Такі верстати використовують специфічні кінематичні розрахунки для більшості операцій, але можуть перемикатися на ідентичну кінематику для управління окремими суглобами після повернення в початкове положення.
Тип кінематики вибирається за допомогою контакту модуля руху HAL, який можна оновити за допомогою програми G-коду або інтерактивних команд MDI. Функції halui для активації команд MDI можна використовувати для вибору типу кінематики за допомогою апаратних елементів керування або віртуальної панелі (PyVCP, GladeVCP тощо).
При зміні типу кінематики G-код також повинен видавати команди для примусової синхронізації інтерпретатора та рухомих частин LinuxCNC. Зазвичай для примусової синхронізації відразу після зміни керуючого контакту HAL використовується команда «читання» контакту HAL (M66 E0 L0).
2. Перемикані кінематичні модулі
Наступні кінематичні модулі підтримують перемикану кінематику:
-
xyzac-trt-kins (type0:xyzac-trt-kins type1:identity)
-
xyzbc-trt-kins (type0:xyzbc-trt-kins type1:identity)
-
genhexkins (type0:genhexkins type1:identity)
-
genserkins (type0:genserkins type1:identity) (puma560 example)
-
pumakins (type0:pumakins type1:identity)
-
three21kins (type0:three21kins type1:identity)
-
scarakins (type0:scarakins type1:identity)
-
5axiskins (type0:5axiskins type1:identity) (bridgemill)
Модулі xyz[ab]c-trt-kins за замовчуванням використовують type0==xyz[ab]c-trt-kins для зворотної сумісності. Надані конфігурації sim змінюють угоду type0/type1, примусово застосовуючи type0==identity kinematics за допомогою параметра модуля sparm з налаштуванням INI-файлу, наприклад:
[KINS]
KINEMATICS = xyzac-trt-kins sparm=identityfirst
# ...
2.1. Призначення ідентифікаційних листів
Під час використання кінематики типу identity параметр модуля coordinates може бути використаний для призначення літер суглобам у довільному порядку з набору дозволених літер координат. Приклади:
[KINS]
JOINTS = 6
# звичайне впорядкування тотожності: joint0==x, joint1==y, ...
KINEMATICS = genhexkins coordinates=xyzabc
# замовлення індивідуальних ідентифікаційних даних: joint0==c, joint1==b, ...
# KINEMATICS = genhexkins coordinates=cbazyx
|
Note
|
Якщо параметр coordinates= пропущено, призначення ідентифікаторів літер за замовчуванням буде joint0==x,joint1=y,… |
Спільні завдання, передбачені для кінематики identity при використанні параметра координат, ідентичні тим, що передбачені для модуля trivkins. Однак дублювання літер осей для призначення декількох з’єднань для літери координати, як правило, не застосовується для послідовної або паралельної кінематики (такої як genserkins, pumakins, genhexkins тощо), де немає простого взаємозв’язку між з’єднаннями та координатами.
Дублювання літер координат осей підтримується в кінематичних модулях xyzac-trt-kins, xyzbc-trt-kins та 5axiskins (bridgemill). Типовими застосуваннями для дублювання координат є портальні верстати, де два двигуни (з’єднання) використовуються для поперечної осі.
2.2. Зворотна сумісність
Перемикається кінематика ініціалізується з motion.switchkins-type==0, реалізуючи однойменний метод кінематики. Якщо контакт motion.switchkins-type не підключений, як у старих конфігураціях, доступний тільки тип кінематики за замовчуванням.
3. Піни HAL
Перемикання кінематики контролюється вхідним контактом HAL модуля руху motion.switchkins-type. Значення контакту з плаваючою комою обрізається до цілого числа і використовується для вибору одного з наданих типів кінематики. Нульове значення запуску вибирає тип кінематики за замовчуванням type0.
|
Note
|
Вхідний контакт motion.switchkins-type є плаваючим, щоб полегшити підключення до вихідних контактів модуля руху, таких як motion.analog-out-0n, які можна керувати за допомогою стандартних M-кодів (зазвичай M68EnL0). |
Вихідні контакти HAL призначені для інформування графічних інтерфейсів користувача про поточний тип кінематики. Ці контакти також можуть бути підключені до цифрових входів, які зчитуються програмами G-коду, щоб увімкнути або вимкнути поведінку програми відповідно до активного типу кінематики.
3.1. Зведення про піни HAL
-
motion.switchkins-type Input (float)
-
kinstype.is-0 Output (bit)
-
kinstype.is-1 Output (bit)
-
kinstype.is-2 Output (bit)
A module providing more than three kinematics types has one kinstype.is-N pin per type.
4. Застосування
4.1. З’єднання HAL
Функціональність Switchkins активується виводом motion.switchkins-type. Зазвичай цей вивід живиться від аналогового вихідного виводу, такого як motion.analog-out-03, тому його можна встановити командами M68. Наприклад:
net :kinstype-select <= motion.analog-out-03
net :kinstype-select => motion.switchkins-type
4.2. Команди G-/M-кодів
Вибір типу роду здійснюється за допомогою послідовностей G-коду, таких як:
...
M68 E3 Q1 ;оновлення analog-out-03 для вибору kinstype 1
M66 E0 L0 ;синхронізація interp-motion...
...
;G-код користувача...
M68 E3 Q0 ;оновлення analog-out-03 для вибору kinstype 0
M66 E0 L0 ;синхронізація interp-motion
...
|
Note
|
Команда M66 «wait-on-input» оновлює змінну #5399. Якщо поточне значення цієї змінної потрібне для подальших цілей, його слід скопіювати до додаткової змінної перед викликом M66. |
Ці послідовності команд G-коду зазвичай реалізуються в підпрограмах G-коду як перепризначені M-коди або за допомогою звичайних скриптів M-коду.
Рекомендовані коди (як використовуються в конфігураціях SIM-карти):
Звичайні M-коди користувача:
-
M128 Виберіть тип кінематики 0 (запуск за замовчуванням)
-
M129 Виберіть тип кінематики 1 (зазвичай ідентична кінематика)
-
M130 Виберіть тип кінематики 2 (кінематика, задана користувачем)
Перепризначені M-коди:
-
M428 Виберіть кінематику 0 (кінематика запуску за замовчуванням)
-
M429 Виберіть тип кінематики 1 (зазвичай ідентична кінематика)
-
M430 Виберіть тип кінематики 2 (кінематика, задана користувачем)
|
Note
|
Звичайні M-коди користувача (в діапазоні M100-M199) знаходяться в модальній групі 10. Перепризначені M-коди (в діапазоні M200-M999) можуть вказувати модальну групу. Додаткову інформацію див. в документації щодо перепризначення. |
4.3. Налаштування обмежень для INI-файлів
Планування траєкторії LinuxCNC використовує обмеження для положення (min, max), швидкості та прискорення для кожної відповідної літери координати, зазначеної в конфігураційному файлі INI. Приклад для літери L (у наборі «XYZABCUVW»):
[AXIS_L]
MIN_LIMIT =
MAX_LIMIT =
MAX_VELOCITY =
MIN_ACCELERATION =
Вказані обмеження файлу INI застосовуються до типу кінематики за замовчуванням типу 0, який активується під час запуску. Ці обмеження можуть не застосовуватися при переході на альтернативну кінематику. Однак, оскільки при переході на іншу кінематику необхідна синхронізація інтерпретатора та руху, для налаштування обмежень для очікуваного типу кінематики можна використовувати контакти INI-HAL.
|
Note
|
Виводи INI-HAL зазвичай не розпізнаються під час виконання G-коду, якщо не видано команду синхронізації (вимкнення черги). Див. сторінку довідки milltask для отримання додаткової інформації ($ man milltask). |
Відповідні контакти INI-HAL для номера з’єднання (N):
ini.N.min_limit
ini.N.max_limit
ini.N.max_acceleration
ini.N.max_velocity
Відповідні контакти INI-HAL для координати осі (L):
ini.L.min_limit
ini.L.max_limit
ini.L.max_velocity
ini.L.max_acceleration
|
Note
|
Загалом, між номерами суглобів і літерами координат осей немає фіксованих відповідників. Для деяких кінематичних модулів, особливо тих, що реалізують ідентичну кінематику (trivkins), можуть існувати специфічні відповідники. Докладнішу інформацію див. на сторінці довідки kins ($ man kins). |
M-код, наданий користувачем, може змінювати будь-які або всі межі координат осей перед зміною руху.switchkins-type pin і синхронізацією інтерпретатора та частин руху LinuxCNC. Наприклад, скрипт bash, що викликає halcmd, може бути «жорстко закодований» для встановлення будь-якої кількості контактів HAL:
#!/bin/bash halcmd -f <<EOF setp ini.x.min_limit -100 setp ini.x.max_limit 100 # ... повторіть для інших граничних параметрів EOF
Такі скрипти можна викликати як M-код користувача і використовувати до M-коду перемикання kins, який оновлює HAL-контакт motion.switchkins-type і примусово виконує синхронізацію interp-motion. Зазвичай для кожного типу kinstype (0,1,2) використовуються окремі скрипти.
Коли кінематика ідентичності надається як засіб управління окремими шарнірами, може бути зручно встановити або відновити обмеження, як зазначено в системному файлі INI. Наприклад, робот починає роботу зі складною (неідентичною) кінематикою (тип 0) після повернення в початкове положення. Система налаштована таким чином, що її можна переключити на ідентичну кінематику (тип 1) для маніпулювання окремими суглобами за допомогою звичайних літер з набору «XYZABCUVW». Налаштування файлу INI ([AXIS_L]) не застосовуються при роботі з ідентичною кінематикою (тип 1). Для вирішення цього випадку використання скрипти M-коду користувача можна розробити наступним чином:
M129 (Switch to identity type1)
-
читати та аналізувати INI-файл
-
HAL: встановити граничні контакти INI-HAL для кожної літери осі ([AXIS_L]) відповідно до налаштування INI-файлу номера з’єднання, на яке посилаються з ідентифікатором ([JOINT_N])
-
HAL:
setp motion.switchkins-type 1 -
MDI: виконати синхронізуючий G-код (M66E0L0)
M128 (restore robot default kinematics type 0)
-
читати та аналізувати INI-файл
-
HAL: встановити граничні контакти INI-HAL для кожної літери осі ([AXIS_L]) згідно з відповідним налаштуванням INI-файлу ([AXIS_L])
-
HAL:
setp motion.switchkins-type 0 -
MDI: виконати синхронізуючий G-код (M66E0L0)
|
Note
|
Конфігурації симуляції vismach для робота puma демонструють сценарії M-коду (M128, M129, M130) для цього прикладу використання. |
4.4. Міркування щодо зміщення системи координат
Як і налаштування обмежень файлу INI, зміщення координатної системи (G92, G10L2, G10L20, G43 тощо) зазвичай застосовуються лише для типу кінематики за замовчуванням 0. При перемиканні типів кінематики може бути важливо або скинути всі зміщення перед перемиканням, або оновити зміщення відповідно до вимог конкретної системи.
4.5. Міркування щодо зовнішнього зміщення
Зовнішні зміщення (встановлені на вісь (L) через axis.L.eoffset-request) зберігаються під час перемикання кінематики. Коли зміщення активне на осі перед перемиканням (видиме в axis.L.eoffset), планувальник траєкторії зберігає те саме зміщення після перемикання, подібно до того, як він зберігає задане положення з G-коду. Це забезпечує стабільну роботу машини незалежно від активної кінематики.
Якщо підтримка зміщення буде проблемою через зміни обмежень осей або інші проблеми, обов’язково очистіть і, можливо, вимкніть eoffset, перш ніж перемикати кінематику.
5. Конфігурації симуляції
Конфігурації симуляції (що не потребують апаратного забезпечення) надаються з ілюстративними дисплеями vismach у підкаталогах configs/sim/axis/vismach/.
-
5axis/table-rotary-tilting/xyzac-trt.ini (xyzac-trt-kins)
-
5axis/table-rotary-tilting/xyzbc-trt.ini (xyzac-trt-kins)
-
5axis/bridgemill/5axis.ini (5axiskins)
-
scara/scara.ini (scarakins)
-
puma/puma560.ini (genserkins)
-
puma/puma.ini (pumakins)
-
hexapod-sim/hexapod.ini (genhexkins)
6. Положення щодо кінематики користувача
Настроювана кінематика може бути закодована і протестована на збірках Run-In-Place («RIP»). У дистрибутиві надається файл-шаблон src/emc/kinematics/userkfuncs.c. Цей файл можна скопіювати/перейменувати в каталог користувача і відредагувати, щоб надати настроювану кінематику з kinstype==2.
Файл користувацької кінематики можна скомпілювати з позадеревних джерел для реалізацій rt-preempt або шляхом заміни шаблонного файлу в дереві (src/emc/kinematics/userkfuncs.c) для систем rtai.
Приклад створення Preempt-rt:
$ userkfuncs=/home/myname/kins/mykins.c make && sudo make setuid
7. Попередження
Неочікувана поведінка може виникнути, якщо програму G-коду випадково запустити з несумісним типом кінематики. Небажаної поведінки в програмах G-коду можна уникнути шляхом:
-
Підключення відповідних контактів HAL kintype.is.N до контактів цифрового входу (наприклад, motion.digital-in-0m).
-
Зчитування цифрового вхідного виводу (M66 E0 Pm) на початку програми G-коду
-
Переривання (M2) програми G-коду з повідомленням (DEBUG, problem_message), якщо тип роду не підходить.
Під час інтерактивного використання засобів бігової роботи або команд MDI оператору потрібна обережність. GuiDesign повинен містити індикатори для відображення поточного типу кінематики.
|
Note
|
Зміна кінематики може спричинити істотні операційні зміни, що вимагають ретельного проектування, тестування та навчання для впровадження. Управління зміщеннями координат, компенсацією інструменту та обмеженнями файлів INI може вимагати складних і нестандартних операційних протоколів. |
8. Примітки до коду
Кінематичні модулі, що забезпечують функціональність switchkins, пов’язані з об’єктом switchkins.o (switchkins.c), який забезпечує роботу головної програми модуля (rtapi_app_main()) та пов’язаних з нею функцій. Ця головна програма зчитує (опціональні) параметри командного рядка модуля (координати, sparm) і передає їх до функції switchkinsSetup(), що надається модулем.
Функція switchkinsSetup() визначає специфічні для kintype процедури налаштування та функції для прямого оберненого обчислення для кожного kintype (0,1,2) і встановлює ряд параметрів конфігурації.
A module can provide further kinstypes by calling switchkinsRegister() from within switchkinsSetup(), once per kinstype:
int switchkinsRegister(int ktype, KS kset, KF kfwd, KI kinv);
ktype runs from 0 to SWITCHKINS_MAX_TYPES-1 (defined in switchkins.h). A kinstype has to come from one route or the other, so registering one that switchkinsSetup() has already filled in is an error, and so is leaving a gap below the highest kinstype provided. Either mistake fails the module load and says which kinstype is at fault.
Each kinstype gets its own kinstype.is-N pin, so a module providing the usual three keeps the pin names it always had.
After calling switchkinsSetup(), rtapi_app_main() checks the supplied parameters, creates a HAL component, and then invokes the setup routine identified for each kinstype.
Each kinstype setup routine can (optionally) create HAL pins and set them to default values. A setup routine is called once per kinstype it is registered for, so a routine used for two kinstypes must not create the same pin twice. When all setup routines finish, rtapi_app_main() issues hal_ready() for the component to complete creation of the module.
8.1. Outline
The two routes in one switchkinsSetup(), with the kinematics itself left out. Types 0 to 2 are filled in through the pointer arguments as they always were, and a fourth is registered:
int switchkinsSetup(kparms* kp,
KS* kset0, KS* kset1, KS* kset2,
KF* kfwd0, KF* kfwd1, KF* kfwd2,
KI* kinv0, KI* kinv1, KI* kinv2
)
{
kp->kinsname = "mykins"; // must agree with the filename
kp->halprefix = "mykins"; // hal pin names
kp->required_coordinates = "xyzab";
kp->max_joints = strlen(kp->required_coordinates);
// remaining kparms fields
*kset0 = identityKinematicsSetup; // kinstype 0 is the startup default
*kfwd0 = identityKinematicsForward;
*kinv0 = identityKinematicsInverse;
*kset1 = myKinematicsSetup;
*kfwd1 = myKinematicsForward;
*kinv1 = myKinematicsInverse;
*kset2 = userkKinematicsSetup;
*kfwd2 = userkKinematicsForward;
*kinv2 = userkKinematicsInverse;
// any further kinstype comes from switchkinsRegister(), and the
// numbering carries on from the three above with no gaps
if (switchkinsRegister(3, myOtherKinematicsSetup,
myOtherKinematicsForward,
myOtherKinematicsInverse)) { return -1; }
return 0;
} // switchkinsSetup()
A module wanting fewer than three kinstypes leaves the unused pointer arguments alone and starts registering at the first free number.
For the surrounding shape, the in-tree switchkinsSetup() routines are in src/emc/kinematics: 5axiskins.c, xyzac-trt-kins.c, genserkins.c, scarakins.c and the others listed at the top of this document. None of them registers a fourth kinstype yet, so the call above has no in-tree example to copy.