Trolley Robot 2.0. Teil 1. Autonome Navigation eines Heimroboters basierend auf ROS

Das Projekt wurde auf der Grundlage eines anderen in seinen Kreisen bekannten Projekts erstellt - Linorobot (linorobot.org), wobei Komponenten verwendet wurden, die einem einfachen Laien zur Verfügung stehen. Die gesetzten Ziele: Autonome Bewegung des Roboters zu Hause mit kostengünstigen Komponenten zu erreichen, die Leistung von Mini-PCs für die angegebenen Zwecke zu bewerten, den Navigationsstapel so zu konfigurieren, dass er sich in den engen Räumen des Chruschtschows bewegt.



Eisen


Die Liste der Komponenten in den Festkörpern lautet wie folgt:

  • Himbeer pi 3b - 2800 r.;
  • Lidar rplidar a1 - 7500 p.;
  • Kraftbrücken l298n -2pcs - 400 rub .;
  • Radsatz mit Encodern Typ A und B - 2000 r. (210 U / min - Link )
  • Teenzy 3,2 - 2100 r.;
  • imu 9250 (entweder 9150 oder 6050) - 240 p.;
  • Power Bank bei 10000mH - 1500 r.
  • 3 Batterien 18650 und Halter -600 p.
  • Abwärtswandler DC-DC C 5V bis 3,3V - 20p.
  • ein Stück Sperrholz, Parkett -? reiben.

Gesamt: 17160 p.

* Die Kosten können reduziert werden, indem Teenzy durch Arduino Mega 2560 (600 S.) und Lidar durch Ersetzen von Kinect v.1 (1000 S.) ersetzt



werden. Es ist jedoch zu beachten, dass der erste Kinect eine minimale Sichtbarkeit (blinder Bereich) von 0,5 m hat. Dies kann die Navigation unter beengten Bedingungen negativ beeinflussen und ist ziemlich sperrig. Der Lidar hat eine Blindzone von weniger als 0,2 m. Kinect v.2 passt nicht zu Himbeere 3b (es hat keinen USB 3.0). Arduino Mega ist der Größe (und einigen Eigenschaften) unterlegen, außerdem müssen Sie den Code leicht überarbeiten.

Im Allgemeinen sieht das „Design“ so aus:





Hier gibt es natürlich keine Schönheit, aber es geht nicht darum.

Zusätzlich zum Roboter selbst ist es äußerst wünschenswert, einen externen PC zu haben, auf dem grafische Hüllen zur Visualisierung der Aktionen des Roboters (rviz, Pavillon) gestartet werden.

Robotermontage


Es ist detailliert auf der Projektwebsite dargestellt - ein Link . Lassen Sie uns also auf die Punkte eingehen , die Schwierigkeiten verursachen. Zuerst müssen Sie berücksichtigen, dass die Encoder am Radsatz mit 3,3 V betrieben werden und bei Anlegen von 5 V einwandfrei ausfallen.

Das Linorobot-Installationsskript wurde erfolgreich auf Ubuntu 16.04, Ubuntu 18.04 installiert. ROS-Versionen: ROS kinetisch oder ROS melodisch. Auf Himbeere 3b müssen Sie zuerst eine Auslagerungsdatei erstellen.

Der wichtigste Teenzy-Code ist unterwegs:

roscd linorobot/teensy/firmware/lib/config
nano lino_base_config.h

Und mit dem Befehl hineingegossen:

roscd linorobot/teensy/firmware
platformio run --target upload

Die oben genannten Befehlsbündel werden häufig verwendet, daher ist es sinnvoll, sie zu Aliasnamen hinzuzufügen.

Aufgrund der Schwierigkeiten bei der Montage des Roboters kann die korrekte Korrelation der verbundenen Kontakte von l298n zu teenzy problematisch sein. Trotz des äußerst klaren Anschlussdiagramms können sich die Räder unterschiedlich verhalten und müssen experimentieren, indem sie die richtige Pinbelegung im Code auswählen.

In meinem Fall stellte sich Folgendes heraus:

/// ENCODER PINS
#define MOTOR1_ENCODER_A 14
#define MOTOR1_ENCODER_B 15 

#define MOTOR2_ENCODER_A 11
#define MOTOR2_ENCODER_B 12 
//MOTOR PINS
#ifdef USE_L298_DRIVER
  #define MOTOR_DRIVER L298

  #define MOTOR1_PWM 21
  #define MOTOR1_IN_A 1
  #define MOTOR1_IN_B 20

  #define MOTOR2_PWM 5
  #define MOTOR2_IN_A 8
  #define MOTOR2_IN_B 6

Der zweite Punkt besteht darin, die Spezifikation der Roboterräder vorzuschreiben:

//define your robot' specs here
#define MAX_RPM 210               // motor's maximum RPM
#define COUNTS_PER_REV 1365       // wheel encoder's no of ticks per rev
#define WHEEL_DIAMETER 0.065       // wheel's diameter in meters
#define PWM_BITS 8                // PWM Resolution of the microcontroller
#define LR_WHEELS_DISTANCE 0.235  // distance between left and right wheels
#define FR_WHEELS_DISTANCE 0.30   // distance between front and rear wheels. Ignore this if you're on 2WD/ACKERMANN
#define MAX_STEERING_ANGLE 0.415  // max steering angle. This only applies to Ackermann st

Die Drehzahl ist in der Radspezifikation angegeben, aber CPR (COUNTS_PER_REV) ist der berechnete Wert.
CPR = PPR x 4. PPR unserer Räder 341.

* PPR kann entweder in der Spezifikation angezeigt werden oder der Code auf dem Roslaunch Linorobot Minimal.Starten Sie den Roboter und drehen Sie das Rad um 360 Grad. PPR entspricht dem numerischen Wert, der nach der Raddrehung auf dem Bildschirm angezeigt wird:



* PPR = abs (RECENT_COUNT - INITIAL_COUNT).

CPR = 1364. Sie müssen außerdem WHEEL_DIAMETER und LR_WHEELS_DISTANCE in Metern festlegen. Darüber hinaus ist LR_WHEELS_DISTANCE der Abstand zwischen den Mittelachsen der Räder und nicht von Kante zu Kante. Andere Anzeigen können ignoriert werden, wenn der Roboter ein zweirädriges Differential ist (nicht omni).

Der dritte Punkt, der Schwierigkeiten verursachen kann - die Imu-Kalibrierung. Dazu muss der Roboter gemäß den Anweisungen in bestimmten Positionen fixiert werden. Die Hinweise befinden sich im Code, wenn das Skript rosrun imu_calib do_calib ausgeführt wird :



Nach Abschluss wird imu_calib.yaml mit Einstellungen generiert.

Es ist besser, eine Kalibrierung durchzuführen, obwohl es eine Standarddatei mit IMU-Einstellungen gibt.
* Außerdem stellte sich heraus, dass die Imu-Kalibrierung die Bewegungsrichtung des Roboters durch Teleop beeinflussen kann (links statt rechts und umgekehrt, während die Hin- und Herbewegung korrekt war). Die Situation wurde nicht durch Neuanordnung der Pins im Code gelöst. Imu selbst wurde fixiert und mit umgedrehten Klammern kalibriert auf der Rückseite der Roboterbasis befestigt. Sein (imu) weiterer Flip ohne Neukalibrierung löste das Problem.

Vierter Punkt - PID-Kalibrierung.

Auf der Projektwebsite wird das Verfahren zur Durchführung der Anpassung ausführlich beschrieben - Link .

Für Anfänger wird es jedoch schwierig sein, herauszufinden, was es ist und wie man damit arbeitet. Im Allgemeinen ist eine PID-Regulierung erforderlich, um sicherzustellen, dass sich der Roboter gleichmäßig bewegt, ohne zu ruckeln / plötzlich zu bremsen. Dafür sind drei Parameter verantwortlich: p, i, d. Ihre Werte sind im Hauptcode enthalten, der auf teenzy hochgeladen wurde:

#define K_P 2.0 // P constant angle
#define K_I 0.3 // I constant
#define K_D 0.1 // D constant

Sie können mit ihnen experimentieren, indem Sie auf dem Roboter laufen:

roslaunch linorobot minimal.launch

Weiter auf dem externen PC in drei verschiedenen Terminals:

rosrun lino_pid pid_configure
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
rqt

Durch Bewegen der Schieberegler p, d, i im rqt-Terminal und anschließendes Steuern des Roboters im teleop_twist_keyboard-Terminal können Sie die erforderlichen Ergebnisse erzielen, ohne den Code jedes Mal in teenzy mit den neuen pid-Parametern herunterladen zu müssen:



Das heißt, alles geschieht im laufenden Betrieb und zu diesem Zeitpunkt in der Firmware Teenzy kann völlig unterschiedliche Bedeutungen haben. * Sie können sich nicht auf Diagramme konzentrieren, weil visuell, und so wird verstanden, wie der Roboter fährt.

Sie empfehlen, mit der Einstellung der Werte p = 1,0, d = 0,1, i = 0,1 zu beginnen. In unserem Fall sind die Werte wie folgt (experimentell erhalten) p = 2,0, i = 0,3, d = 0,1.

Als nächstes müssen diese Werte im Code festgelegt und in Teenzy gefüllt werden.

Vergessen Sie auch nicht, den Code einzugeben (DEBUG 0 anstelle von DEBUG 1):

#define DEBUG 0

Kilometerzähler


Zur Orientierung des Roboters und zur anschließenden Navigation werden Lidar-Daten, IMU- und Radgeberdaten verwendet. Wenn die IMU-Kalibrierung korrekt durchgeführt wird, das Lidar korrekt installiert ist und die Encoderwerte korrekt sind, sollte es keine Probleme mit der Kilometerzähler geben.

Um die Richtigkeit der Kilometerzähler zu überprüfen, müssen Sie ein wenig über Teleop auf dem Roboter fahren und die Werte im Thema Kilometerzähler sehen. Dies steht auf der Projektseite - Link .

Schauen Sie sich auch die visuelle Hülle von rviz an:



Eine Zelle in rviz ist 1 m groß. Daher ist es ratsam, dass der Roboter dieses Messgerät sowohl im visuellen Editor als auch in Form von Sachleistungen passiert.

Zusätzlich wird die zurückgelegte Strecke in der Anzeige w angezeigt:



Sie sollte auch zu 1 m tendieren.

Gleiches gilt für die Drehwinkel des Roboters:



* In rviz und live muss sich der Roboter im gleichen Winkel drehen.

Die Kilometerzähler von einem Lidar werden auf ähnliche Weise definiert - eine Verbindung: Der Abstand vom Lidar zur nächsten Wand, sowohl live als auch in rviz, sollte übereinstimmen.

TF


In ROS wird besonderes Augenmerk auf Transformationen gelegt - tf. Im Allgemeinen beschreibt dieses Konzept die Korrelation von Objekten relativ zueinander im Raum. Damit Objekte nicht in der Luft hängen und das Programm versteht, wie sie relativ zueinander dargestellt werden, muss auf die Einstellung tf geachtet werden.

Im Projekt sind alle tf-Verbindungen bereits relativ zueinander konfiguriert, und Sie müssen nur die Anzeigen anpassen, um beispielsweise anzuzeigen, wie sich das Lidar befindet. Dies ist notwendig, damit der Roboter versteht, dass das Hindernis nicht direkt vor ihm entstanden ist, sondern vor dem Lidar, der in einem bestimmten Abstand von der Mitte des Roboters getrennt ist.

Gehen wir zum entsprechenden Verzeichnis:

roscd linorobot/launch
nano bringup.launch

Die Basis selbst befindet sich in einem Abstand von 0,065 m vom Boden:

<node pkg="tf_ros" type="static_transform_publisher" name="base_footprint_to_base_link" args="0 0 0.065 0 0 0  /base_footprint /base_link "/>

In laser.launch müssen Sie die Position des Lidars relativ zur Mitte der Roboterbasis festlegen:

roscd linorobot/launch/include
nano laser.launch

In meinem Fall ist der Lidar entlang der x-Achse verschoben: -0,08, y: 0,04 und "steigt" über die Basis (z-Achse): 0,08 m:

<node pkg="tf2_ros" type="static_transform_publisher" name="base_link_to_laser"
args="-0.08 0.04 0.08 0 0 0  /base_link /laser "/>

In rviz kann dieser Ort visuell beobachtet werden:



Obwohl er nicht weit vom Lidar entfernt ist, passen wir seine Frequenz so an, dass mehr Punkte ausgegeben werden (standardmäßig 4 KB ). Dies hilft beim Erstellen der Karte:

cd linorobot/launch/include/lidar
nano rplidar.launch

Parameter hinzufügen:

<param name="scan_mode"  type="string" value="Boost"/>

und ändern

<param name="angle_compensate"    type="bool"   value="false"/>

Jetzt stehen uns 8k zur Verfügung: Die



physische Position des Lidars auf dem Roboter ist ebenfalls wichtig:



Erstellen einer 2D-Raumkarte


Auf der Projektwebsite wird vorgeschlagen, eine Raumkarte zu erstellen, indem zwei Terminals gestartet werden:

roslaunch linorobot bringup.launch
roslaunch linorobot slam.launch

Die Praxis hat jedoch gezeigt, dass Slam, das standardmäßig mit dem Projekt geliefert wird, nicht funktioniert, wenn der Lidar-Modus 8 KB beträgt:



Im 4 KB-Modus sind die Karten nicht sehr erfolgreich, sie sind jedoch sehr laut.

Daher ist es besser, einen anderen Slam zu verwenden - Hector-Slam.

Wie installiert man es angezeigt ist hier .

Nach der Installation ist das Verfahren zum Erstellen einer Karte dieselbe, aber anstelle von roslaunch linorobot slam.launch führen Sie roslaunch my_hector_mapping my_launch.launch aus.

Maps sind sauberer. Sie können sie jedoch besser in einem grafischen Editor ändern und unnötige Karten entfernen, insbesondere wenn der Lidar beim Erstellen der Karte mit Spiegeln kollidiert :



Vergessen Sie nicht, die Raumkarte zu speichern:

rosrun map_server map_saver -f my-map

* Karten werden besser in einer angenehmen Dämmerung erhalten, dies wird das Beste aus dem Budget-Lidar herausholen.

Fortsetzung folgt.

All Articles