Unitate 2 / 9

Inteligența artificială în robotică și controlul mișcării

Câștiguri:

  • Abilitatea de a configura și rezolva probleme de cinematică înainte/inversă și de planificare a traiectoriei cu ajutorul AI
  • Capacitatea de a produce o orbită sigură, oferind limitelor articulației robotului, constrângerile de viteză și accelerație ca context promptului
  • Abilitatea de a verifica numeric și fizic ieșirea cinematică și a traiectoriei produse de AI

Aducerea prinderii de la capătul unui braț robot într-un anumit punct din spațiu, într-o anumită orientare; Sună simplu, dar în spate există ecuații cinematice, limite comune, singularități și planificare a traiectoriei. Aici, inginerul în mecatronică folosește împreună trigonometria, algebra liniară și teoria controlului. Inteligența artificială este un ajutor puternic în acest proces: poate stabili ecuații cinematice directe, poate sugera soluții pentru cinematica inversă, poate parametriza o traiectorie în funcție de constrângerile de viteză/accelerație. Cu toate acestea, robotica este unul dintre domeniile din mecatronică cu cel mai mare risc fizic; Dacă o secvență de unghi generată de AI este trimisă robotului fără verificare, brațul se poate lovi pe sine, mediul sau operatorul. În această unitate vom vedea cum să setăm și să verificăm cinematica și planificarea traiectoriei cu AI.

Cinematica directă și inversă

Cinematica directă (FK): Găsirea poziției și orientării efectorului final dacă unghiurile de îmbinare sunt cunoscute. Există o singură soluție, este directă.

Cinematică inversă (IK): Dacă se cunoaște poziția dorită a funcției de capăt, găsirea unghiurilor de îmbinare care vor asigura aceasta. Are de obicei mai multe soluții (cum ar fi cotul sus/jos), uneori nu are soluții (punct de neatins), alteori are soluții infinite (singularitate).

concept

intrare

ieșire

Numărul de soluții

Cinematica înainte

unghiurile de îmbinare

Poziție/orientare extremă

singur

Cinematică inversă

Poziție/orientare extremă

unghiurile de îmbinare

Multiplu/niciunul/infinit

Pentru un braț plan cu două articulații, cinematica inversă poate fi configurată în AI și verificată manual după cum urmează:

import numpy as npdef inverse_kinematik_2r(x, y, L1, L2): """IK pentru brațul plan cu 2 articulații. Returnează unghiuri în radiani (soluție cot în jos).""" r2 = x**2 + y**2 # Verificare accesibilitate: este punctul în spațiul de lucru? dacă np.sqrt(r2) > (L1 + L2) sau np.sqrt(r2) < abs(L1 - L2): ridicați ValueError("Punctul se află în afara spațiului de lucru accesibil") cos_t2 = (r2 - L1**2 - L2**2) / (2 * L1 * L2) cos_t2 = np.clip.0._2, numeric #2, clip. = np.arccos(cos_t2) # cot în jos t1 = np.arctan2(y, x) - np.arctan2(L2*np.sin(t2), L1 + L2*np.cos(t2)) return np.degrees(t1), np.degrees(t2)# Validare: L1, țintă = L1=L2 degreesprint(inverse_kinematik_2r(1.0, 1.0, 1.0, 1.0)) # ~ (0.0, 90.0)

Liniile critice aici sunt unde AI omite adesea: verificarea accesibilității (este punctul din spațiul de lucru) și `np.clip` (previne intrarea arccos să depășească ±1 din cauza erorii de rotunjire). Fără aceste două protecții, codul va produce NaN sau se va prăbuși într-un punct nevalid.

Sfat: Când cereți rezoluția IK, spuneți clar AI „să adauge controlul accesibilității și să limiteze intrarea arccos la decupare”. Aceste două rânduri previn erorile silențioase care provoacă cele mai multe bătăi de cap în domeniu.

Limite comune, singularitate și soluții multiple

Fiecare articulație a unui robot real are un interval de unghi (de exemplu, de la -170° la +170°), o limită de viteză și o limită de accelerație. Chiar dacă IK oferă un unghi valid din punct de vedere matematic, nu poate fi utilizat dacă acel unghi se află în afara domeniului fizic al articulației. În plus, robotul intră în singularitate în unele configurații: două axe sunt aliniate, se pierde un grad de libertate și vitezele articulațiilor încearcă să meargă la infinit pentru o mișcare mică a vârfului.

De aceea soluția de resurse umane nu este suficientă; Fiecare soluție trebuie să treacă un filtru de acceptabilitate:

def solution_gecerli_mi(acilar_deg, limits_deg): """pains: [t1,t2,...], limits: [(min,max),...]""" for pain, (amin, amax) in zip(acilar_deg, limits_deg): if not (amine <= pain <= amax): return False:1 f: depășit: depain limit. ({amine},{amax}) cu excepția" returnează Adevărat, "OK"limits = [(-170, 170), (-120, 120)]print(cozum_valid_mi([0.0, 90.0], limits)) # (Adevărat, 'OK')print(cozum_valid_mi([0.0.0.0, #] limită([0.0.0.0], limite)) „Limita comună depășită...”)

AI poate da soluția „matematică” a IK; dar limitele comune și evitarea singularității sunt specifice sistemului dvs. și trebuie date ca context promptului.

Planificarea orbitei

A duce robotul din punctul A în punctul B nu înseamnă să trasezi o linie dreaptă între două unghiuri. Schimbarea bruscă a vitezei creează șocuri mecanice și vibrații. În schimb, se folosesc profile moi: profil de viteză trapezoidal (accelerare constantă-viteză constantă-decelerare constantă) sau curbă în S (mai netedă, unde accelerația este și ea limitată). Când faci ca AI să genereze o traiectorie, trebuie să dai ținta, durata și constrângerile.

import numpy as npdef trapez_yorunge(q0, q1, v_max, a_max, dt=0.01): """Profil de viteză trapezoidală pentru o singură îmbinare. Matricea de poziții este returnată.""" distanță = abs(q1 - q0) direcție = np.sign(q1 - q0) * t_speed = v_max / a_max distanță * a_max t_speed**2 if 2 * distance_speed > distanta: # profil triunghiular (v_max nu poate fi atins) t_speed = np.sqrt(distanta / a_max) t_constant = 0.0 v_peak = a_max * t_speed else: t_constant = (distanta - 2 * distance_speed) = v_max v_max t_speak = 2 v_max v__peak + t_constant t = np.arange(0, T, dt) # ... calcul de poziție pentru fiecare t (pe baza fazelor de accelerație/constant/decelerare) return t, T, v_peak, duration, vz = trapezoidal_trajectory(0.0, 90.0, v_max=60.0, a_max=60.0, a_max=120.0, a_max = duration. s, viteza de vârf: {vz:.1f} grade/s")

Verificarea logică aici este aceasta: dacă distanța este scurtă, motorul nu va atinge niciodată v_max și profilul se va întoarce de la trapezoidal la triunghiular. Dacă AI ratează această condiție, se va calcula o durată greșită pentru mișcările scurte. Puteți verifica acest lucru testând codul cu o valoare cunoscută (de exemplu, o distanță foarte scurtă).

Solicitare slabă / Solicitare puternică

SLAB: „Scrieți o traiectorie care duce brațul robotului de la A la B.” (Fără constrângere: limită de viteză? accelerație? distanță între articulații? Ieșire oarbă.) STRONG: „Generează o traiectorie punct-la-punct în spațiul articulației pentru un robot cu 6 axe. Limita de viteză pentru fiecare articulație este de 90 de grade/s, limita de accelerație este de 180 deg, în intervalul unghiului de utilizare dat este de ^220 deg. Profilul de viteză trapezoidală, dacă distanța este mică, se încadrează într-un profil triunghiular.

Verificare: de la simulare la robot

Traiectoria generată de AI este verificată în această ordine înainte de a merge la robot:

  1. Numeric: unghiul articulației, viteza și accelerația fiecărui pas sunt în limite?
  2. Ciocnire: de-a lungul traiectoriei, brațul se ciocnește cu el însuși sau cu mediul (vizualizați/simulați dacă este posibil)?
  3. Singularitate: orbita trece printr-o regiune de singularitate (determinantul jacobian se apropie de zero)?
  4. Test hardware lent: Operați robotul la o viteză mică (de exemplu, 10%) și monitorizați-l vizual.
  5. Creșterea treptată a vitezei: Odată ce totul este verificat, viteza crește pas cu pas până la valoarea nominală.
Atenție: Când porniți un robot cu o nouă traiectorie pentru prima dată, viteza de anulare trebuie să fie întotdeauna scăzută și oprirea de urgență ar trebui să fie disponibilă. Chiar dacă ieșirea AI este „corectă din punct de vedere matematic”, un decalaj, o axă inversă sau o agățare a cablului în configurația fizică va fi dezvăluită doar cu o testare lentă.

Mini carcasă

Inginerul de automatizare Ece cere AI un cod de traiectorie în spațiul comun pentru o aplicație pick-and-place. AI produce un profil trapezoidal, dar când Ece testează o mișcare pe distanță scurtă, ea vede că timpul este negativ: codul nu a gestionat cazul profilului triunghiular în care v_max nu poate fi atins. Ece corectează acest lucru spunând promptului „dacă distanța este scurtă, cădeți în profilul triunghiular”. Apoi rulează unghiurile de îmbinare date de AI prin funcția sa de validare față de propriul său tabel de limită și constată că îmbinarea 5 dorea +125° la un moment dat, în timp ce limita era +120°. El replanifică traiectoria și o monitorizează, de data aceasta rulând robotul cu o viteză de 10%. În prima rundă, el vede că gripperul se apropie prea mult de masă și corectează decalajul Z. AI a returnat o schiță de lucru în câteva minute; dar trei validări separate (profil triunghiular, limită de îmbinare, test lent) au surprins trei probleme reale separate.

Greșeli comune

  • Utilizarea soluției IK fără limite comune și control al accesibilității.
  • Nu decupează intrările arccos/arcsin, ci produc NaN în cazul unei erori de rotunjire.
  • Solicitarea orbitei fără limitarea vitezei/accelerației și crearea unui șoc mecanic.
  • Ignorând zonele de singularitate și lăsând vitezele comune să crească vertiginos.
  • Omiterea tranziției profilului trapezoidal-triunghiular pe o distanță scurtă și calcularea timpului greșit.
  • Efectuarea primului test orbital la viteză maximă și fără acces la oprirea de urgență.

Pe scurt

  • Cinematica directă are o singură soluție; cinematica inversă poate produce soluții multiple, inexistente sau infinite.
  • Soluțiile IK sunt în mod necesar filtrate în ceea ce privește limitele comune, accesibilitatea și singularitatea.
  • Planificarea traiectoriei; Utilizează profile moi, compatibile cu limite, cum ar fi trapezoidale sau curba în S.
  • La distanta mica profilul se schimba de la trapezoidal la triunghiular; acest lucru ar trebui să fie tratat în cod.
  • AI accelerează matematica; Limitele și contextul de instalare fizică ar trebui să intre în prompt.
  • Noua traiectorie este întotdeauna rulată pentru prima dată cu un raport de viteză redus și oprire de urgență accesibilă.

Sarcina de aplicare

Selectați un model de braț cu două sau trei articulații (cu lungimi și limite de articulație reale sau imaginare). Puneți AI să genereze o funcție de cinematică inversă și un planificator de traiectorie în acest context. Apoi: (1) verificați manual ieșirea IK cu o țintă cunoscută (reduceți unghiurile înapoi și reveniți la același punct cu FK), (2) testați dacă codul le captează oferind cel puțin un punct inaccesibil și o limită comună care depășește ținta, (3) verificați dacă la o distanță scurtă timpul orbital se dovedește a fi rezonabil. Scrieți câte probleme de validare ați găsit în prima versiune a codului și ce strat a prins fiecare.