Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
github.com/AIWintermuteAI/ros-moveit-arm.git
I forrige del av artikkelen har vi opprettet URDF- og XACRO -filer for vår robotarm og lansert RVIZ for å kontrollere robotarmen vår i et simulert miljø.
Denne gangen gjør vi det med den virkelige robotarmen! Vi legger til griperen, skriver en robotkontroller og (valgfritt) genererer IKfast invers kinematics solver.
Geronimo!
Trinn 1: Legge til griperen
Å legge til gripper var litt forvirrende i begynnelsen, så jeg hoppet over denne delen i forrige artikkel. Det viste seg å ikke være så vanskelig tross alt.
Du må endre URDF -filen din for å legge til gripelink og koblinger.
Den endrede URDF -filen for roboten min er vedlagt dette trinnet. I utgangspunktet følger den samme logikk som armdelen, jeg har nettopp lagt til tre nye lenker (claw_base, claw_r og claw_l) og tre nye ledd (joint5 er fast, og joint6, joint7 er revolute ledd).
Etter at du har endret URDF -filen, må du også oppdatere MoveIt -genererte pakke og xacro -fil ved å bruke MoveIt -oppsettassistent.
Start oppsettassistent med følgende kommando
roslaunch moveit_setup_assistant setup_assistant.launch
Klikk på Rediger eksisterende MoveIt -konfigurasjon og velg mappen med MoveIt -pakken.
Legg til ny planleggingsgruppegriper (med lenker og ledd for griperen) og også en endeeffektor. Mine innstillinger er i skjermbildene nedenfor. Legg merke til at du ikke velger kinematisk løsning for griperen, det er ikke nødvendig. Generer pakken og skriv over filene.
Løpe
catkin -merke
kommandoen i catkin -arbeidsområdet.
Ok, nå har vi en arm med en griper!
Trinn 2: Bygg armen
Som jeg nevnte før armen 3D -modellen er laget av Juergenlessner, takk for et fantastisk arbeid. Den detaljerte monteringsinstruksjonen finner du hvis du følger lenken.
Jeg måtte imidlertid endre kontrollsystemet. Jeg bruker Arduino Uno med sensorskjerm for kontroll av servoer. Sensorskjerm hjelper mye med å forenkle ledningene og gjør det også enkelt å levere ekstern strøm til servoer. Jeg bruker 12V 6A strømadapter kablet gjennom nedtrappningsmodul (6V) til Sensor Shield.
Et notat om servoer. Jeg bruker MG 996 HR -servoer kjøpt fra Taobao, men kvaliteten er virkelig dårlig. Det er definitivt en billig kinesisk knock-off. Den for albueleddet ga ikke nok dreiemoment og begynte til og med å røyke en gang under tung belastning. Jeg måtte bytte ut albueleddsservoen med MG 946 HR fra en produsent av bedre kvalitet.
Lang historie kort - kjøp kvalitetsserver. Hvis det kommer magisk røyk ut av servoene dine, bruk bedre servoer. 6V er en veldig sikker spenning, ikke øk den. Det øker ikke dreiemomentet, men kan skade servoene.
Kabling for servoer som følger:
base 2
skulder2 4 skulder1 3
albue 6
griper 8
håndledd 11
Endre det gjerne så lenge du også husker å endre Arduino -skissen.
Etter at du er ferdig med maskinvare, la oss se på det større bildet!
Trinn 3: MoveIt RobotCommander -grensesnitt
Så hva nå? Hvorfor trenger du MoveIt og ROS? Kan du ikke bare styre armen gjennom Arduino -koden direkte?
Ja det kan du.
Ok, hva med å bruke GUI eller Python/C ++ - kode for å gi robotposisjon å gå til? Kan Arduino gjøre det?
På en måte. For det må du skrive en invers kinematikkløser som vil ta en robotposisjon (oversettelse og rotasjonskoordinater i 3D -rom) og konvertere den til felles vinkelmeldinger for servoer.
Til tross for at du kan gjøre det selv, er det et kjempejobb å gjøre. Så, MoveIt og ROS gir et fint grensesnitt for IK (inverse kinematics) solver for å gjøre alle de tunge trigonometriske løftene for deg.
Kort svar: Ja, du kan gjøre en enkel robotarm som vil utføre en hardkodet Arduino-skisse for å gå fra en pose til en annen. Men hvis du vil gjøre roboten din mer intelligent og legge til datavisningsfunksjoner, er MoveIt og ROS veien å gå.
Jeg laget et veldig forenklet diagram som forklarer hvordan MoveIt -rammeverket fungerer. I vårt tilfelle kommer det til å bli enda enklere, siden vi ikke har tilbakemelding fra servoene våre og bruker /joint_states -emnet for å gi robotkontrolleren vinklene for servoer. Vi mangler bare en komponent som er robotkontrolleren.
Hva venter vi på? La oss skrive noen robotkontrollere, så vår robot ville være … du vet, mer kontrollerbar.
Trinn 4: Arduino -kode for robotkontroller
I vårt tilfelle vil Arduino Uno kjøre en ROS -node med rosserial som robotkontroller. Arduino -skissekoden er knyttet til dette trinnet og er også tilgjengelig på GitHub.
ROS -noden som kjører på Arduino Uno abonnerer i utgangspunktet på /JointState -emnet publisert på datamaskinen som kjører MoveIt og konverterer deretter leddvinklene fra matrisen fra radianer til grader og sender dem til servoer ved hjelp av standard Servo.h -bibliotek.
Denne løsningen er litt hacky og ikke hvordan det gjøres med industriroboter. Ideelt sett skal du publisere bevegelsesbanen på /FollowJointState -emnet og deretter motta tilbakemeldingen på /JointState -emnet. Men i vår arm kan ikke hobbyservoene gi tilbakemelding, så vi abonnerer direkte på /JointState -emnet, utgitt av FakeRobotController -noden. I utgangspunktet antar vi at uansett vinkler vi ga til servoer utføres ideelt.
For mer informasjon om hvordan rosserialet fungerer, kan du se følgende opplæringsprogrammer
wiki.ros.org/rosserial_arduino/Tutorials
Etter at du har lastet opp skissen til Arduino Uno, må du koble den med seriekabelen til datamaskinen som kjører ROS -installasjonen.
For å få frem hele systemet, utfør følgende kommandoer
roslaunch my_arm_xacro demo.launch rviz_tutorial: = true
sudo chmod -R 777 /dev /ttyUSB0
rosrun rosserial_python serial_node.py _port: =/dev/ttyUSB0 _baud: = 115200
Nå kan du bruke interaktive markører i RVIZ til å flytte robotarmen til en pose og deretter trykke på Plan og utfør for at den faktisk skal bevege seg inn i posisjonen.
Magi!
Nå er vi klare til å skrive Python -kode for rampetesten. Vel, nesten…
Trinn 5: (Valgfritt) Generering av IKfast Plug-in
Som standard foreslår MoveIt å bruke KDL kinematikkløser, som egentlig ikke fungerer med mindre enn 6 DOF -armer. Hvis du følger denne opplæringen nøye, vil du legge merke til at armmodellen i RVIZ ikke kan gå til noen stillinger som bør støttes av armkonfigurasjonen.
Den anbefalte løsningen er å lage egendefinert kinematikkløsning med OpenRave. Det er ikke så vanskelig, men du må bygge det og det er avhengigheter fra kilden eller bruke docker -beholderen, avhengig av hva du foretrekker.
Prosedyren er veldig godt dokumentert i denne opplæringen. Det er bekreftet å fungere på VM som kjører Ubuntu 16.04 og ROS Kinetic.
Jeg brukte følgende kommando for å generere løseren
openrave.py --database inversekinematikk --robot = arm.xml --iktype = translation3d --iktests = 1000
og løp deretter
rosrun moveit_kinematics create_ikfast_moveit_plugin.py test_robot arm my_arm_xacro ikfast0x1000004a. Translation3D.0_1_2_f3.cpp
for å generere MoveIt IKfast plug-in.
Hele prosedyren er litt tidkrevende, men ikke veldig vanskelig hvis du følger opplæringen nøye. Hvis du har spørsmål om denne delen, kan du kontakte meg i kommentarene eller PM.
Trinn 6: Rampetesten
Nå er vi klare til å prøve rampetesten, som vi vil utføre ved hjelp av ROS MoveIt Python API.
Python -koden er knyttet til dette trinnet og er også tilgjengelig på github -depotet. Hvis du ikke har en rampe eller vil prøve en annen test, må du endre roboten i koden. For den første utførelsen
rostopic echo/rviz_moveit_motion_planning_display/robot_interaction_interactive_marker_topic/feedback
i terminalen når du allerede kjører RVIZ og MoveIt. Flytt deretter roboten med interaktive markører til ønsket posisjon. Posisjons- og orienteringsverdiene vises i terminalen. Bare kopier dem til Python -koden.
For å utføre rampetestkjøringen
rosrun my_arm_xacro pick/pick_2.py
med RVIZ og rosserialnode som allerede kjører.
Følg med for den tredje delen av artikkelen, hvor jeg vil bruke stereokamera for gjenkjenning av objekter og utføre pick and place -rørledning for enkle objekter!