Wenn Sie mit dem Erlernen von ROS beginnen, möchten Sie normalerweise mit physischen Plattformen arbeiten und nicht mit Modellen in einem Simulator. In der Tat reicht Gazebo aus, um nur Bewegungsalgorithmen zu studieren oder ROS selbst zu lehren, aber die Arbeit mit einer realen Plattform ermöglicht es sofort, alle Probleme mit der Radbewegung in der Praxis zu verstehen. Nun, und oft wird die Plattform einfach als Voraussetzung fĂŒr das Projekt benötigt.
FĂŒr die Zukunft ist es besser, mit einer Runde zu beginnen, weil Aus offensichtlichen GrĂŒnden kann sich eine solche Konfiguration um die Achse drehen, ohne die GröĂe des hervorstehenden Teils zu berĂŒcksichtigen. Das U-Turn-Rechteck ist zum Beispiel in engen Korridoren viel weniger praktisch - manchmal ist es notwendig, drei oder mehr Tricks zu entfalten, denke ich, dass Autofahrer verstehen werden.
Fertige Plattformen kaufen
Es gibt nicht viele vorgefertigte Plattformen auf dem Markt, sie sind auf der ROS-Website aufgefĂŒhrt .
Gleichzeitig sind ihre Kosten in Russland hoch genug, um mit der Arbeit zu beginnen. Die billigste Option ist Turtlebot Burger 3 - 549 US-Dollar. Wir haben WiederverkĂ€ufer direkt in Russland fĂŒr etwa 90.000 Rubel gefunden.
In China können Sie fĂŒr 45-50 tr ... In jedem Fall handelt es sich um Plattformen mit geringer GröĂe und TragfĂ€higkeit, die nicht in der Lage sind, echte Aufgaben auszufĂŒhren.
Sie können die Plattform selbst erstellen, es gibt viele verschiedene Anleitungen und Konfigurationen. Aber im Durchschnitt stellt sich heraus, dass:
- Lidar der Klasse Slamtech A1-A2
- Billige RĂ€der basierend auf Kollektormotoren mit Getriebe
- , PWM , UART + rosserial.
- Single Board Computer â Raspberry, Jetson Nano
- 2
- gmapping + amcl/rosbot_ekf + move_base
Die Kollektormotoren haben uns nicht gefallen, weil sie laut sind, einen hohen Verbrauch haben und ein Getriebe benötigt wird. Hier muss ich sagen, dass die Plattformen als ziemlich schwer angesehen werden - d. H. Verriegelte Getriebe + Motoren, so etwas wie der Motor auf dem Foto, funktionieren nicht.
Dementsprechend wurden BLDC-Radmotoren als Beweger ausgewĂ€hlt. Die derzeit gĂŒnstigste Option sind die 6,5-Hoverboard-RĂ€der. Es bleibt nur, sie von ROS aus zu verwalten.
Aber dann tauchte ein Problem auf: Selbst bei der Arbeit mit Golfrobotern wurde ein erhebliches Problem bei der Drehung einer solchen Plattform mit niedriger Geschwindigkeit festgestellt - der Roboter drehte sich ziemlich ruckartig um.
Die GrĂŒnde fĂŒr dieses Verhalten sind einfach: GleitreibungskrĂ€fte spielen eine wichtige Rolle fĂŒr den Bewegungswiderstand in der Kurve. Und sie haben eine Besonderheit - der Widerstand hĂ€ngt von der Masse und der Art der OberflĂ€chen selbst ab - deshalb hĂ€lt ein kleiner Bolzen bei den ersten 2-3 Umdrehungen groĂe Strukturen.
Daher wird es ziemlich sinnlos, die RĂ€der in der Mitte schmal zu machen, so dass sie sich drehen - der Widerstand Ă€ndert sich nur sehr wenig. Das Gummirad reibt an Gras und Boden, die ĂŒberhaupt nicht gleichmĂ€Ăig sind und die Kraft kann sich dramatisch Ă€ndern. Infolgedessen wurde so etwas wie ein Getriebe hergestellt - bei niedriger Geschwindigkeit steuern wir den Moment am Rad und bei direkter Bewegung die Geschwindigkeit selbst.
Es scheint, dass beim Fahren auf Parkett oder Linoleum die Situation besser sein sollte, aber leider ist der Reibungskoeffizient fast der gleiche (denken Sie daran, dass rutschfeste Schuhe ebenfalls aus Gummi bestehen).
Infolgedessen beginnt sich ein Roboter mit einem Gewicht von 10 bis 15 Kilogramm bereits mit spĂŒrbaren Rucken zu entfalten.
Der zweite Teil des Problems wird durch das ROS diff_drive-Paket in Kombination mit eher schwachen SBC-Karten hinzugefĂŒgt.
Hier ist eine Liste von dem, was ich verstanden habe
Die Verwaltung erfolgt mithilfe einer Echtzeitimplementierung, berĂŒcksichtigt jedoch nicht, dass andere Pakete diesen Ansatz bei der Arbeit mit der Verwaltung erwarten sollten.
Hier mĂŒssen wir uns daran erinnern, dass Echtzeit keine sofortige Reaktion auf ein Ereignis ist, sondern eine Garantie dafĂŒr, dass das Ereignis in garantierten Intervallen physischer Zeit verarbeitet wird. Jene. Das bedingte Wasserkraftwerk, das jede Minute (notwendigerweise jede) geregelt wird, ist ebenfalls ein Echtzeitsystem.
Es besteht die Möglichkeit, dass Nachrichten die Themen des Routenplaners verstopfen. Bei Subsystemen zur Positionierung und Routenplanung fĂŒhrt dieses Verhalten normalerweise dazu, dass der Fluss entweder gestoppt und neu gestartet wird oder versucht wird, den Prozess im laufenden Betrieb anzupassen.
Infolgedessen tritt bei schwachen SBCs eine Situation mit einer kontinuierlichen Neuberechnung des Pfades aufoder die Suche nach Lokalisierung beansprucht eine ziemlich groĂe Prozessorzeit - und je mehr Versuche unternommen werden, mit der RT-Komponente Schritt zu halten, desto mehr Zeit lĂ€uft an. In seiner reinen Form positives Feedback, das in diesem Fall ĂŒberhaupt nicht benötigt wird.
DarĂŒber hinaus funktioniert das Gmapping bei abrupten Ănderungen der Plattformposition nicht sehr schnell, und es wurden schwache Lidar-Pausen von bis zu einer halben Sekunde beobachtet, was den Routenplaner ebenfalls sehr verwirrt.
Die Motoren werden separat gesteuert, sodass bei Verwendung von SBC und naiver Implementierung von Treibern die RÀder mit einer gewissen Verzögerung gesteuert werden.
Hier ist das Problem noch einfacher - wir mĂŒssen 2-4 RĂ€der ĂŒber den Kommunikationskanal steuern, der. Dementsprechend richten sich Steuersignale aus und beginnen nacheinander zu ĂŒbertragen - linkes Rad, rechtes Rad, linkes Rad, rechtes Rad.
Infolgedessen tragen die RĂ€der selbst und noch schlimmer die Positionen der RĂ€der von den Encodern zur Bildung des PIC zwischen der Planung des Pfades und der Steuerung der Motoren bei.
Die eingebaute KilometerzÀhler sind sehr einfach.
Da wir nicht nach einer einfachen Möglichkeit suchten, den Befehl und die RĂŒckkehr der KilometerzĂ€hler zu synchronisieren, konnten wir ihn nicht finden. Die Synchronisierung ist immer mit dem Warten auf einige Befehle am Eingang verbunden, diese sind jedoch nicht regelmĂ€Ăig und daher beginnt die KilometerzĂ€hler am Ausgang zu verweilen. Vielleicht schlagen die Leser einen einfachen Weg vor - hier betrachten wir uns nicht als Guru in ROS.
Es ist uns nicht gelungen, sicherzustellen, dass sich eine solche Versammlung gut verhÀlt. Genauer gesagt konnte die Beschleunigung der Verschiebung auf 0,05-0,1 m / s ^ 2 und die Winkelgeschwindigkeit auf 0,03 rad / s unterschÀtzt werden.
Ich dachte, es wÀre schön zu haben:
- GĂŒnstige Plattform
- Synchrone Radlenkung
- KilometerzÀhlerberechnung basierend auf Radverhalten und Handling
- Drehbewegungsmodi mit verschiedenen Bedienelementen
- Unterschiedliche EinschrÀnkungen in verschiedenen Modi
Was ist am Ende passiert
Die Steuerung wurde von den Kreisel-Roller-Brettern genommen und die Radsteuerung wurde so geschrieben, dass beim Starten der Bewegung und beim Drehen eine Drehmomentsteuerung verwendet wurde. Und wenn der Wagen geradeaus fĂ€hrt und auf eine bestimmte Geschwindigkeit beschleunigt, wird der Geschwindigkeitsregelungsmodus aktiviert. In beiden Modi werden die Daten von den Codierern innerhalb der Steuerung unter BerĂŒcksichtigung der Geschwindigkeit und des Modus verarbeitet, und die Daten werden mit einer Vorhersage vor 10-15 ms ausgegeben.
Encoder werden immer in der Steuerung eingelesen, sammeln sich in einem Puffer von 2-3 Elementen und werden verzögert ĂŒbertragen. Die Quintessenz ist, dass beim Empfang der Steuerung die Antwort erst nach AusfĂŒhrung des Befehls erfolgt - d. H. Der Puffer wird blockiert, bevor die geĂ€nderten Geberwerte eintreffen. Die KilometerzĂ€hler werden jedoch ausgegeben, sie verwenden nur den zuletzt bereits ĂŒbertragenen Wert.
weil Alle oben genannten Probleme waren darauf zurĂŒckzufĂŒhren, dass es auf jeden Fall erforderlich ist, die Steuerung beim synchronen Empfang und Senden vom UART-Port zu synchronisieren. Daher hielten wir es fĂŒr unangemessen, einen erzwungenen Synchronisierer in das diff_drive-Paket einzufĂŒhren, und haben daher unser eigenes Steuerungspaket geschrieben.
Es befindet sich hier github.com/Shadowru/hoverboard_driver und wird derzeit aktiv finalisiert:
Das Paket ist in der Startdatei enthalten als:
<node name="hoverboard_driver" pkg="hoverboard_driver" type="node" output="screen">
<param name="uart" value="{ }"/>
<param name="baudrate" value="115200"/>
<param name="wheel_radius" value="0.116"/>
<param name="base_widthâ value="0.43"/>
<param name="odom_frameâ value="odom"/>
<param name="base_frameâ value="base_link"/>
</node>
Der uart-Port selbst muss ĂŒber die entsprechenden Zugriffsrechte verfĂŒgen. Auf einigen Plattformen hat er nicht immer Zugriff fĂŒr den Benutzer. Als Beispiel: FĂŒr den Jetson Nano im Verzeichnis hoverboard_driver / scripts / jetson_nano_serial.sh wird ein Skript angehĂ€ngt, das die Rechte beim Start des Betriebssystems festlegt.
Das Paket selbst enthÀlt das Lesen des Datenstroms von der Steuerung und das Ausgeben der relevanten Informationen zu den Themen:
hoverboard_driver / hoverboard_msg mit einem Paket wie hoverboard_msg.
Die Nachrichtenstruktur lautet wie folgt:
int16 state1 - interne Informationen zu Rad 1
int16 state2 - interne Informationen zu Rad 2
int16 speed1 - momentane Geschwindigkeit von Rad 1
int16 speed2 - momentane Geschwindigkeit von Rad 2
int16 batVoltage - Batteriespannung
int16 boardTemp - Reglertemperatur
int16 Fehler1 - Rad 1 Fehler
int16 Fehler2 - Rad 2 Fehler
int32 ImpulszÀhler1 - Rad 1
GeberzÀhler int32 ImpulszÀhler2 - Rad 2 GeberzÀhler
ZusÀtzlich erhÀlt das Thema hoverboard_driver / odometry eine typische Meldung nav_msgs :: Odometry Die
Position wird wie folgt berechnet:
Basierend auf den Parametern Radradius - Radius RĂ€der in Metern, base_width - Der Abstand zwischen den Radmitten. Wir berechnen, wie viel sich jedes Rad in der Zeit zwischen der vorherigen und der gelesenen Position bewegt hat.
double curr_wheel_L_ang_pos = getAngularPos((double) feedback.pulseCount1); double curr_wheel_R_ang_pos = getAngularPos((double) feedback.pulseCount2); double dtime = (current_time - last_time).toSec(); double delta_L_ang_pos = curr_wheel_L_ang_pos - raw_wheel_L_ang_pos; double delta_R_ang_pos = -1.0 * (curr_wheel_R_ang_pos - raw_wheel_R_ang_pos);
Dann berechnen wir die Beschleunigung jedes der RĂ€der
wheel_L_ang_vel = delta_L_ang_pos / (dtime); wheel_R_ang_vel = delta_R_ang_pos / (dtime);
Als nÀchstes berechnen wir die lineare Beschleunigung des Roboters entlang jeder der Achsen
robot_angular_vel = (((wheel_R_ang_pos - wheel_L_ang_pos) * wheel_radius / base_width) - robot_angular_pos) / dtime; robot_angular_pos = (wheel_R_ang_pos - wheel_L_ang_pos) * wheel_radius / base_width; robot_x_vel = ((wheel_L_ang_vel * wheel_radius + robot_angular_vel * (base_width / 2.0)) * cos(robot_angular_pos)); robot_y_vel = ((wheel_L_ang_vel * wheel_radius + robot_angular_vel * (base_width / 2.0)) * sin(robot_angular_pos));
Als Ergebnis wird ein vollstÀndiger Satz erhalten - Linearbeschleunigung, Winkelbeschleunigung und Multiplikation mit der Zeit - die Verschiebung der Position des Roboters.
robot_x_pos = robot_x_pos + robot_x_vel * dtime; robot_y_pos = robot_y_pos + robot_y_vel * dtime;
Danach wird die KilometerzĂ€hler-Nachricht sowie eine Ăbersetzung zwischen dem KilometerzĂ€hler-Frame und der Basis gesendet.
Die Steuerung am Eingang wird von einem Paket mit 2 Parametern gesteuert - Geschwindigkeit und Drehung, das Paket wird fast nativ von der Verdrehung ĂŒbertragen - die Geschwindigkeit wird durch den Umfang geteilt und es werden Windungen erhalten.
double v = vel.linear.x;
double rps = v / rpm_per_meter;
double rpm = rps * 60;
int16_t speed = static_cast(rpm);
und die Winkelbeschleunigung wird in Form der Multiplikation mit einem Koeffizienten in die Differenz der Raddrehzahlen umgewandelt, wobei eine weitere Neuberechnung unter BerĂŒcksichtigung des Radstandes hinzugefĂŒgt wird, dies ist jedoch in der Praxis nur fĂŒr ausreichend groĂe und schwere Roboter erforderlich.
double w = vel.angular.z;
int16_t steer = static_cast<int>(-1 * w * 30);
Dadurch konnte mit billigen Bauteilen eine sehr stabile Wagensteuerung erreicht werden.
Wir schaffen Roboter, wie die groĂe Mehrheit von Ihnen. Wir haben unser Hauptprodukt, das wir aktiv entwickeln. Pilot getestet und bereit fĂŒr die Produktion. Dies ist ein Roboter zum Sammeln von GolfbĂ€llen.
Wir entwickeln kundenspezifische Roboter und abgeleitete Lösungen. Manchmal ist dies Arbeit von der technischen Aufgabe und Skizze bis zum fertigen Produkt, manchmal Teil der Arbeit.
In den meisten FĂ€llen benötigt der Roboter RĂ€der, um mit der AuĂenwelt zu interagieren. Meistens handelt es sich dabei um bĂŒrstenlose Motoren, da Geschwindigkeit und Position genau gesteuert werden können.
Bei kleinen Robotern werden hĂ€ufig Hoverboard-RĂ€der verwendet, was aufgrund der Massenproduktion und des Preises dieser Lösung gerechtfertigt ist. Jeder, der die Preisliste fĂŒr russische Motoren gesehen hat, versteht die Bedeutung der Massenproduktion.
Bei der Steuerung handelt es sich meistens um Modelle esc, vesc, odrive, BLD-300B oder selbst erstellte Lösungen.
FĂŒr den einfachen Einstieg in die Herstellung echter Roboter und die Aufhebung des Gazebo-Fluches benötigen die meisten Entwickler einen Wal fĂŒr den einfachen Einstieg. Vieles in der realen Welt unterscheidet sich vom Ideal.
Manchmal passieren unvorhersehbare Dinge, Sensoren sind verrauscht, Echtzeit, PufferĂŒberlĂ€ufe. In diesem Video das GerĂ€t, das wir zuvor mit einem SchĂŒtz und einem entfernten Kilswitch getestet haben.
Wir bieten etwas, das uns helfen wĂŒrde, rechtzeitig Nerven zu sparen. Dies ist ein Kit fĂŒr die Montage des GehĂ€uses (Parallelepiped und Zylinder), zwei MotorrĂ€der, eine Batterie, ein LadegerĂ€t und eine blinkende Steuerung, die KilometerzĂ€hler liefert und mit unserem ROS-Paket sofort funktioniert 19.000 reiben. Es ist billiger als das FrĂ€sen, die Kosten fĂŒr Verbundwerkstoffe, Befestigungselemente und ein gepolstertes Schwenkrad.
Rufen Sie uns an oder beantragen Sie eine Plattform fĂŒr ROS online . Lassen Sie uns gemeinsam Roboter bauen. Wir werden Ihnen beim Treffen des Roboterbetriebssystems am 5. Dezember
mehr ĂŒber die Plattform erzĂ€hlen. Die Anmeldung fĂŒr die Teilnehmer ist bereits offen.
â Registrierung fĂŒr Zuschauer