robotic-arm

Projekt: robotická paže – manipulátor

Robotická paže, robotické rameno, robotický manipulátor. To všechno jsou názvy zařízení, jehož možnosti a využití už asi nemusíme podrobněji vysvětlovat. V celé řadě továren patří podobné stoje k běžnému vybavení (v některých provozech automobilek dokonce nahradily více než 90% zaměstnanců).
Většina „českých“ robotů se uplatňuje v oblasti zpracovatelského průmyslu – podle dat ČSÚ v roce 2021 používalo průmyslové roboty neboli manipulátory již více než 65 % velkých podniků v tomto odvětví, nejčastěji v metalurgickém a automobilovém průmyslu.

Profesionální zařízení (v cenách miliónů Kč) si domů ani do kroužku nepořídíme, ale pro základní seznámení, výuku nebo s cílem si jen tak pohrát máme možnost využít dostupných levnějších robotických ramen s klasickými modelářskými servy. Ve specializovaných obchodech lze zakoupit jak levnější (cca 1500 Kč) plastové verze serva tak i dražší (3 – 8 tisíc Kč) kovová provedení.

Pro našeho partnera – společnost Postav robota, který nám robota poskytl, jsme vyvinuli podle požadavku jedné střední odborné školy ovládací systém po sériové lince (485) z PLC nebo jiného řídícího modulu.

Robotické rameno s číslováním jednotlivých serv (s1 – natočení základny až po s6 – úchopový mechanismus).

Blokové zapojení zobrazuje princip napájení a datových přenosů. UART/485 pro vzdálené řízení nebo I2C expander 16 kanálů PWM, ze kterých využíváme kanál 1 – 6 (číslo odpovídá označení příslušného serva s1 až s6).
Napájení ze zdroje 5V (doporučujeme minimálně 3A, lépe 5A) přivádíme do modulu expanderu, ze kterého se vede dál do ESP (využíváme k tomu nepoužitý kanál s0, kde jsou použitelné piny 5V i GND. Modul 485 pak napájíme z ESP (požadovanými 3V).

Modul PCA9685

Je důležité počítat s tím, že každé servo s dorazem má omezený rozsah (například se využívá 30-330 stupňů – s rezervou), ale v zapojení robotického ramene se tyto rozsahy ještě zmenší. Pro robotické rameno proto definujeme výchozí polohy, rozsahy a případné korekce pro každé servo zvlášť.


Pro ovládání serv pomocí i2c PWM vícekanálového expanderu PCA9685 využíváme speciální knihovnu pca9685. V následující ukázce je fragment funkčního kódu, který natočí servo 1 na 30 stupňů.

from machine import Pin, UART, I2C
from utils.pinout import set_pinout 
from pca9685.servo import Servos  

pins = set_pinout() 
i2c = I2C(1, sda=Pin(pins.I2C_SDA_PIN), scl=Pin(pins.I2C_SCL_PIN), freq=1000000)
servo = Servos(i2c) 
 
# for servo 1 the angle is set to 30 deg.
servo.position(1, 30)  # servo.position(servo_id, angle) 
Dokumenace:
https://docs.octopuslab.cz/basicdoc/#servo

OctopusLAB 59
Robotické rameno – druhá část

Robotické rameno máme propojeno po sériové lince s modulem „485 (pár diferenciálních linek A a B), což nám umožní mít řídící jednotku vzdálenu podle potřeby i několik desítek metrů s možností řídit několik kooperujících robotických ramen zároveň.

K ESP32 (deska www.octopuslab.cz/doit-adapter) je připojen modrý modul 485 čtyřžilovým plochým kabelem (napájecí napětí +3V, GND a datové linky TX, RX). Vzdálené propojení pak máme realizováno dvojicí kabelů (černý a hnědý).

Inicializace sériové linky pro UART-485 v Micropythonu je jednoduchá. V projektech s ESP32 se využívá UART2 (UART1 slouží k programování i jako výstup na terminál). UART2 je ve výchozím stavu na pinech 4 a 36. Rychlost komunikace volíme podle potřeby – nejčastěji 9600 nebo 115200 Bd.
Bd (Baud) je jednotka modulační rychlosti (také symbolová nebo znaková rychlost, anglicky baud rate) udávající počet změn stavu přenosového média za jednu sekundu.

# UART2 init:
UART_BAUD = 115200
UART_2, UART_TxD,  UART_RxD  = 2, 4, 36
u2 = UART(UART_2, UART_BAUD, tx = UART_TxD, rx = UART_RxD) 

Komunikační protokol je založen na jednoduchém textovém řetězci, který je „human readable“, čili je čitelný (srozumitelný) i pro člověka. Jelikož z jednoho řídícího centra může být ovládáno hned několik robotických ramen a jsme omezeni přenosovou rychlostí sériové linky, je vhodné, aby byl co nejstručnější.

"""
Text based protocol 7 chars: Sassddd\n 
example: 'S301050\n' - set arm ID 3, Servo 1, 50 degrees 
'S' char S - start byte 
'0..9' - a - Arm address, 0 is broadcast
'00..99' - sss - fixed 2 char number of servo 
'000..999' - ddd - fixed 3 char degree
\n - 'new line char 0x10'
"""

Každé robotické rameno má šest serv, která jsme se při sestavování snažili dávat do nulové nebo středové polohy (podle potřeby). Definujeme pak ještě programově výchozí úhly (natočení serv), aby byl robot po zapnutí v žádané základní pozici (vzpřímený, s otevřeným úchopovým „klepetem“). Protože se samotné nastavení může pro každého robota lišit, nejsou inicializační data součástí programu, ale jsou uložena v externím souboru.
Externí nastavování vám usnadní třída u Config z Octopus framework. V adresáři /config je uložen json soubor, do (ze) kterého se ukládají (načítají) data (hodnoty nastavení). Podrobněji na 🡒 /basicdoc/config.

Kofigurační soubor základního nastavení lze snadno vytvořit i naplnit z Micropython terminálu:

       >>> from config import Config
       >>> conf = Config("robotic_arm")
       >>> conf.set("arm_id",3)
       >>> conf.set("s1",50)
       >>> conf.set("s2",30)
       ...
       >>> conf.set("s6",75)
       >>> conf.save()
       Writing new config item to file config/robotic_arm.json         

Vznikne tak json konfigurační soubor config/robotic_arm.json, ve kterém je uloženo individuální nastavení pro každé robotické rameno. Jedna z možností jak si soubor prohlédnout a zkontrolovat, je využití emulátoru Linuxového shellu: uPyShell.

>>> shell()
uPyShell:~/$ cd config
uPyShell:~/config$ cat robotic_arm.json
{"arm_id": 3, "s1":50, "s2": 30,  .....}
uPyShell:~/config$ exit
>>>         

gihub:
https://github.com/octopuslab-cz/robotic-arm

další připravované moduly:
https://github.com/octopusengine/octopuslab/blob/master/esp32-micropython/utils/transform.py
(inversní kinematika)


OctopusLAB 60
Robotické rameno – inversní kinematika

V minulých dvou dílech jsme popisovali základní princip jednoduchého robotického ramene. Pomocí několika servomotorů, které se natáčejí do různých úhlů, se dá docílit požadované pozice úchopného mechanismu.
Pokud bychom mohli měnit každý úhel natočení pomocí posuvného potenciometru, celé zařízení se pak ovládá podobně jako stavební bagr, u kterého soustava ovládacích pák určuje posun hydraulických pístů. (Novější stroje už jsou také z části elektronické a do jisté míry autonomní.)
V naší elektronické verzi bychom měnili posuvným jezdcem odpor, čímž by se měnilo napětí, které umíme AD převodníkem konvertovat na číselnou hodnotu. A pak už jen stačí převést toto číslo na hodnotu pro PWM, která odpovídá určitému úhlu. Manipulátor by tak bylo možno ovládat i manuálně, ale naším cílem je automatické zařízení, které nepotřebuje lidskou obsluhu. U složitějších manipulátorů (robotické rameno v naší ukázce mělo šest servomotorů!) je ovládání poměrně náročné a nepřesné. A programování složitějších sekvencí bylo velmi zdlouhavé, protože se provádělo metodou „pokus omyl“.

Inverzní kinematická úloha je metoda nebo proces využívaný v oblasti robotiky. V případě, že je známa poloha manipulátoru na konci robotického ramena a je zadána nová požadovaná poloha, je třeba pohnout různými klouby v robotickém rameni. Princip inverzní kinematické úlohy je dopočítání úhlu natočení jednotlivých kloubů ze stávající polohy a následné dopočítání, jak musí být klouby natočeny v požadované pozici. Po tomto procesu se může vykonat úloha zadaná operátorem robota. (Wikipedie)

Pro bod v prostoru (x, y, z) počítáme natočení všech pěti serv (úhly a1 až a5, a6 je otevírání klepeta). Celá úloha inversní kinematiky však spočívá ve výpočtu úhlů po celé dráze přesunu z bodu 1 do bodu 2. Tato dráha nemusí být lineární, může mít i složitý tvar. Někdy je důležité se při přesunu vyhnout nějakému místu nebo je dráha určená danou úlohou (například svařování či lakování části karosérie automobilu v případě robota na lince v automobilce).

Pro naše pokusy jsme začali vytvářet samostatnou knihovnu, která by se věnovala celé problematice transformací v inversní kinematice. Opět je pro ESP32, v Micropythonu a dostupná na Githubu.
https://github.com/octopusengine/octopuslab/blob/master/esp32-micropython/utils/transform.py

Napsat knihovnu pro pět úhlů je poměrně složitý úkol, proto jsme provedli některá zjednodušení. Pro jednoduchý manipulátor v prostoru si vystačíme se třemi řízenými servy. Zbývající dvě mají nastavený fixní úhel natočení a tvoří pak jen „zahnuté“ rameno. A pro pochopení principu a odvození matematických vztahů jsme začali dokonce pouze ve 2D. I pro zařízení v rovině (zmiňované dvourozměrné 2D) máme několik projektů. Například kreslítko nebo směrování laserového paprsku.

Na obrázku proto přesun z bodu x1,y1,z1 do bodu x2,y2,z2 zjednodušujeme na pohyb z x1,y1 do x2,y2. (V popisu je z zachováno šedě).


Abychom si ověřili funkčnost transformací, vytvořili jsme v Pythonu aplikaci, kterou jsme testovali pro množinu bodů (xi,yi) úhly natočení (alfa a beta). Tato simulace pro každý bod (celkem jich je 100), vypočte úhly natočení ramen a koncový bod se musí shodovat se zadáním. Koncové body jsou na obrázku červené, vnitřní body natočení prvního ramena jsou modré. Někdy existují dvě řešení (vnitřní body mohou překlápět zlomení ramene „sem-tam“). Na to je potřeba brát ohled při výpočtu trajektorie, aby se rameno v nějakém bodě skokově nelámalo. Z obrázku je také patrna pracovní oblast, kterou robotické rameno ve 2D může obsáhnout.
https://github.com/octopuslab-cz/inverse_kinematics

Pro základní převedení do 3D otáčíme celou 2D rovinou xy kolem osy y do prostoru. Úhel natočení odpovídá úhlu a1 (angle). Jednoduchou transformací průmětu roviny xz z polární soustavy do kartézské dopočítáme výsledný bod xyz v prostoru. Více je patrno z rozpracované knihovny, zde na to asi nemáme prostor.