Jeffrey Cross
Jeffrey Cross

Programare cu sistem de operare Robot pentru mișcarea servo-netedă

Sistemul de operare Robot (ROS) este o platformă robotică open source care ajută robotul să vizualizeze lumea, să o hartă și să navigheze și să efectueze interacțiuni fizice utilizând algoritmi de ultimă oră. Dacă doriți să construiți un robot complex, este posibil să existe deja un cod ROS care să vă ajute. Puteți utiliza cât mai puțin ROS pe cât doriți și se instalează pe mașini de la nivelul Raspberry Pi în sus.

Citiți articole din revista chiar aici Face:. Nu aveți încă un abonament? Ia unul astăzi.

Să luăm în considerare modul de a controla un servo ca o introducere la ROS. Un dezavantaj al servomotoarelor este că ei vor alerga adesea cât de repede pot pentru a se supune comenzii tale. Acest lucru poate duce la căderea robotului, deoarece brusc a început să se rotească la viteza maximă. După ce primim ROS pentru a controla servo-ul, putem adăuga un control sinusoidal ca să ne menținem robotul stabil. Puteți face acest lucru în ROS fără a schimba codul de control, sau codul care expune servo la ROS, sau hardware-ul servo în sine. Și puteți reutiliza cu ușurință codul pentru alte proiecte în viitor!

ROS are un suport foarte bun pentru instalarea pe Ubuntu sau Debian, deci nu va trebui să compilați pentru a merge. Această construcție utilizează o mașină Linux care rulează Ubuntu, un servo hobby, un Arduino și câteva biti de cabluri comune, cum ar fi firele de conectare. ROS va fi rulat pe Ubuntu și mesajele vor fi trimise prin USB către Arduino. Odată ce ați instalat pachetele ROS binare, informați-vă despre mediul Arduino despre bibliotecile ROS introducând următoarele comenzi într-un program de consola (cum ar fi gnome-terminal sau console): cd ~ / sketchbook / biblioteci rm -rf ros_lib rosrun rosserial_arduino make_l ibraries.py.

Programați Arduino

Fotografie de Hep Svadja

Acum putem încărca o schiță la un Arduino pentru a efectua controlul servo la nivel scăzut și pentru al controla de la mașina Linux. Aceasta va muta un servo într-o locație specificată ca procent (0,0 la 1.0) a mișcării complete pe care dorim să o permitem. Folosind un procent în loc de un unghi explicit, codul Arduino limitează unghiul exact care poate fi setat, pentru a evita în mod explicit unghiurile pe care știi că le va provoca o coliziune.

După cum puteți vedea, funcțiile normale de configurare și buclă devin destul de rare atunci când se utilizează ROS. Funcția buclă poate fi aceeași pentru orice cod Arduino care se abonează doar la date. În configurare trebuie să inițializați ROS și apoi să apelați abonamentul pentru fiecare abonat la ROS pe care îl aveți. Fiecare abonat preia RAM-ul pe Arduino, astfel încât să aveți doar 6-12 dintre ele în funcție de ce altceva trebuie să faceți schița.

#include #include #include #include #define SERVOPIN 3 servo servo; void servo_cb (const std_msgs :: Float32 & msg) {const float min = 45; const gama float = 90; float v = msg.data; dacă (v> 1) v = 1; dacă (v <0) v = 0; unghiul de plutire = min + (interval * v); servo.write (unghi); } ros :: Abonat sub ("/ cap / tilt", servo_cb); ros :: NodeHandle nh; void setup () {servo.attach (SERVOPIN); nh.initNode (); nh.subscribe (sub); } void loop () {nh.spinOnce (); întârziere (1); }

Acum trebuie să poți vorbi cu Arduino din lumea ROS. Cea mai simplă modalitate de a face acest lucru este cu un fișier de lansare a robotului. În timp ce fișierul de mai jos este foarte simplu, acestea pot include și alte fișiere de lansare, astfel încât să puteți începe în cele din urmă un robot foarte complex cu o singură comandă.

$ cat rosservo.launch $ roslaunch ./rosservo.lanch

Comanda cu platformă vă permite să vedeți unde puteți trimite mesaje ROS pe robot. După cum puteți vedea mai jos, /înclinare a capului este disponibil de la Arduino. Un mesaj poate fi trimis folosind rostopic pub, opțiunea -1 înseamnă să publicați mesajul doar o singură dată și dorim să vorbim /înclinare a capului trimiterea unui singur număr cu virgulă mobilă.

$ lista rotativă / diagnostice / cap / tilt / rosout / rosout_agg $ pub-ul cu platformă -1 / cap / tilt std_msgs / Float32 0.4 $

În acest stadiu, orice lucru care știe cum să publicați un număr în ROS poate fi folosit pentru a controla servo-ul. Dacă ne mișcăm de la 0 la 1, servo va rula la viteză maximă, ceea ce este bine în sine, dar am putea dori ca motorul să accelereze la viteză maximă și apoi încetiniți când se apropie de poziția de destinație. Mai puțin mișcare bruscă, mai puțin mișcătoare de robot jerky, mai puțin surpriză pentru oamenii din zonă.

Smooth cu alt nod

Scriptul Python de mai jos ascultă mesajele / Cap / tilt / neted și publică multe mesaje /înclinare a capului pentru a muta servomul cu o rampă lentă și o rampă în jos când se apropie de poziția dorită. moveServo_cb este numit ori de câte ori ajunge un mesaj / Cap / tilt / neted. Apelul de apel generează apoi un număr pentru fiecare 10 grade de la -90 la +90 în matricea de unghiuri. păcat() este luată pe acele unghiuri care dau valori care variază încet de la -1 la +1. Adăugând 1 la care se face intervalul de la 0 la +2, deci o divizare cu 2 face ca rampa noastră de matrice să fie de la 0 la +1. Este o chestiune de a merge prin matricea m și de a publica un mesaj de fiecare dată, deplasându-se puțin mai departe prin intervalul r de fiecare dată, terminând la 1 * r sau întreaga gamă.

#! / usr / bin / env Python de la importul importului de timp import numpy ca np import rospy de la std_msgs.msg import Float32 currentPosition = 0.5 pub = Niciunul def moveServo_cb (data): global currentPosition, pub targetPosition = data.data r = targetPosition - Curbele tPoziția unghiurilor = np.array ((interval (1 90)) [0 :: 10]) - 90 m = (np.sin (unghiuri * np.pi / 180) + 1) / 2 pentru mi np. (0.05) currentPosition = target Poziția de imprimare "pos-e:", actualPostion pub.publish (currentPosition) def ascultător (): publicul rospy.init_node ('servoencod er', anonymous = adevărat) rospy.Subscriber ('/ had / til t / smooth', float32, moveSer vo_cb) pub = rospy.Publisher ', Float32, queue_ size = 10) rospy.spin () dacă __name__ ==' __main__ ': listener ()

Pentru a testa mișcarea servomotoarelor netede, porniți scriptul Python și publicați-vă mesajele / Cap / tilt / neted și ar trebui să vedeți o mișcare mai ușoară.

$ ./servoencoder.py $ pub-ul rostopic -1 / cap / tilt / neted std_msgs / Float32 1 $ pub-ul rostopic -1 / cap / tilt / smooth std_msgs / Float32 0

De asemenea, puteți remapa numele lucrurilor în ROS. În acest fel, puteți remapa / Cap / tilt / neted a fi /înclinare a capului iar programul care comandă servo nu va ști nici măcar că mișcarea sinusoidală este utilizată.

Mergând mai departe

M-am concentrat pe servo control simplu aici, dar ROS are suport pentru mult mai mult. Dacă doriți să știți ce vă blochează robotul în mișcare, există deja suport pentru utilizarea unui Kinect în ROS. Chiar dacă stiva de navigare folosește aceste date pentru a face cartografiere, puteți alimenta și un mic script Python care deplasează un servo pentru a urmări cel mai apropiat obiect față de robot. Da, ochii te urmăresc.

Două proiecte ROS ale mele sunt Terry și Houndbot. Terry este un robot de interior cu două Kinect-uri, unul folosit exclusiv pentru navigație, celălalt pentru cartografierea adâncimii așa cum mi se pare potrivit. Cu cei șase Arduinos, Terry poate fi controlat printr-o interfață web bazată pe ROS sau direct prin intermediul telecomenzii PS3.

Am proiectat Houndbot-ul pentru utilizare în exterior. Are o ureche RC controlată, GPS, busolă și ROS controlate. Eu lucrez la obtinerea de a folosi o camera PS4 dublu ochi pentru navigare. Nu poate folosi un Kinect deoarece soarele nu mai funcționează. Din moment ce câinele este de aproximativ 20 kg, am modernizat suspensia recent, ceea ce ma făcut să fac piese de aluminiu personalizate.

Resursele sistemului de operare pentru robot

Instalare pe Ubuntu Depuneți în lumea navigației cu ROS ROS Q & A Luați una din numeroasele cărți pe ROS Obțineți brațul robotului în mișcare cu ROS & MoveIt! Rulați NASA-GM Robonaut2 într-un simulator. ROS este acolo sus!

Acțiune

Lasa Un Comentariu