Wichtige Punkte zur Implementierung von SLAM in kostengünstigen mobilen Robotern
Hardwareauswahl
Software-Einrichtung
Algorithmusimplementierung
Lokalisierung und Navigation
Praktische Tipps

SLAM verständlich erklärt: Warum Kartierung und Lokalisierung für selbstgebaute Bots so wichtig sind
Der Budget-Build: Hardwareauswahl für Ihre kostengünstige SLAM-Plattform
Das Gehirn: Die Wahl des richtigen Mikrocontrollers/SBC
Kostengünstige Sensoroptionen: Lidar vs. Visual SLAM
Chassis- und Motorsteuerung
|
Komponente
|
Empfohlen
|
Preisklasse
|
Warum SLAM?
|
|
SBC
|
Raspberry Pi 4
|
35-75 $
|
Unterstützt ROS und grundlegende Open-Source-SLAM-Funktionen.
|
|
Sensor
|
RPLIDAR A1
|
99 $
|
Zuverlässiges Lidar für Kartierung und Lokalisierung
|
|
Chassis
|
Differentialantriebssatz
|
30-50 US-Dollar
|
Einfache Kinematik für kostengünstige mobile Roboter
|
|
Motortreiber
|
L298N
|
5 US-Dollar
|
Einfache Integration mit ROS
|
Die Grundlage: Einrichten der ROS-Umgebung für SLAM
ROS-Installation und Kinematik-Einrichtung
-
ROS-Repository hinzufügen:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" \ > /etc/apt/sources.list.d/ros-latest.list' sudo apt install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc \ | sudo apt-key add - sudo apt update -
Desktop-Version installieren:
sudo apt install ros-noetic-desktop-full -
Einrichtungsumgebung:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc
<robot name="my_robot">
<link name="base_link"/>
<joint name="lidar_joint" type="fixed">
<parent link="base_link"/>
<child link="lidar_link"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
</joint>
<link name="lidar_link"/>
</robot>
Verwenden Sieroslaunch urdf_tutorial display.launch model:='$(find my_package)/urdf/my_robot.urdf'um die Visualisierung durchzuführen. Dadurch wird ROS für die SLAM-Implementierung eingerichtet .
Sensor-Treiber-Integration
-
RPLIDAR-Paket klonen:
cd ~/catkin_ws/src git clone https://github.com/Slamtec/rplidar_ros.git cd .. catkin_make
-
Berechtigungen festlegen und starten:
sudo chmod 666 /dev/ttyUSB0
roslaunch rplidar_ros rplidar.launch
-
Visualisieren in RViz:
rosrun rviz rviz
/scan hinzu. Dies bestätigt den Datenfluss für Open-Source-SLAM in Ihrem kostengünstigen mobilen Roboter.Kernimplementierung: Open-Source-SLAM-Algorithmen in der Praxis
Die Wahl des richtigen Algorithmus: Gmapping vs. Cartographer
-
Vorteile: Einfache Einrichtung, geringe CPU-Auslastung auf dem Raspberry Pi.
-
Nachteile: Schwächer in dynamischen Umgebungen.
-
Vorteile: Hervorragende Kartenqualität.
-
Nachteile: Benötigt mehr Leistung, wie z. B. Jetson Nano.
Detaillierte Analyse der Konfigurationsdatei
sudo apt install ros-noetic-gmapping
<launch>
<arg name="scan_topic" default="/scan" />
<arg name="base_frame" default="base_link"/>
<arg name="odom_frame" default="odom"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<param name="base_frame" value="$(arg base_frame)"/>
<param name="odom_frame" value="$(arg odom_frame)"/>
<param name="map_update_interval" value="5.0"/>
<param name="maxUrange" value="5.5"/> <!-- Matches RPLIDAR A1 -->
<param name="maxRange" value="6.0"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/>
<param name="minimumScore" value="200"/>
<param name="srr" value="0.01"/>
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<param name="linearUpdate" value="0.5"/>
<param name="angularUpdate" value="0.436"/>
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="80"/> <!-- Ausgewogen für kostengünstige SBCs -->
<param name="xmin" value="-50.0"/>
<param name="ymin" value="-50.0"/>
<param name="xmax" value="50.0"/>
<param name="ymax" value="50.0"/>
<param name="delta" value="0.05"/> <!-- Kartenauflösung -->
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
<remap from="scan" to="$(arg scan_topic)"/>
</node>
</launch>
-
maxUrange und maxRange: Begrenzung auf die Leistungsfähigkeit von RPLIDAR (5,5-6 m) für genaue Messwerte.
-
Eine Partikelanzahl von 80 bietet eine gute Genauigkeit, ohne die CPU des Raspberry Pi zu überlasten.
-
Delta: Eine Auflösung von 0,05 m bietet ein ausgewogenes Verhältnis zwischen Detailgenauigkeit und Leistung.
-
map_update_interval: 5s reduziert die Belastung kostengünstiger Hardware.
-
xmin/ymin/xmax/ymax: Legen Sie die Grenzen auf die erwartete Umgebungsgröße fest; kleinere Werte sparen Speicherplatz.
| Parameter | Standard | Anpassung für niedrige Kosten | Auswirkungen auf SLAM |
| Delta | 0,05 | 0,1 | Gröbere Karte, schneller auf Raspberry Pi |
| Partikel | 30 | 50-80 | Bessere Genauigkeit ohne Überlastung |
| maxUrange | 16 | 5,5 | Passt zu RPLIDAR für präzise Kartierung |
| Kartenaktualisierungsintervall | 5 | 10 | Verringert die Verarbeitungsfrequenz |
| linearUpdate | 1 | 0,5 | Löst Aktualisierungen bei kleineren Bewegungen aus |
roslaunch my_package gmapping.launch .Kartengenerierung (Kartierung)
-
Gewährleisten Sie eine korrekte Odometrie: Testen Sie mit rostopic echo /odom – ungenaue Raddaten verursachen Drift. Fügen Sie bei Bedarf Encoder hinzu.
-
TF überprüfen: Führen Sie rosrun tf tf_monitor aus, um die Frames (map → odom → base_link → lidar_link) zu bestätigen.
-
Lidar allein testen: Objekte platzieren und /scan auf korrekte Entfernungen prüfen.
-
ROS-Kern starten:
roscore
-
Lidar ausführen:
roslaunch rplidar_ros rplidar.launch
-
Gmapping starten (mithilfe Ihrer Startdatei):Gmapping initialisiert Partikel und abonniert /scan und /tf. Die Terminalausgabe zeigt Aktualisierungen wie „Scan verarbeitet“ oder Partikel-Resampling an.
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
-
RViz starten:
roslaunch gmapping slam_gmapping.launch
-
Fester Rahmen: Karte
-
Karte hinzufügen (/map): Zeigt einen Gebäudeplan an.
-
LaserScan hinzufügen (/scan): Zeigt die Rohstrahlen an.
-
PoseArray hinzufügen (/particlecloud): Visualisiert die Lokalisierungsunsicherheit.
-
Fernbedienung:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
-
Bewegen Sie sich langsam (0,1-0,3 m/s), um eine genaue Integration zu ermöglichen.
-
Strategie: Beginnen Sie im offenen Bereich und bewegen Sie sich in Achterfiguren oder Schleifen, um Schleifen zu schließen (reduziert Fehler).
-
Kanten abdecken und Stellen erneut anfahren – Gmapping verfeinert durch überlappende Scans.
-
In RViz: Die Karte beginnt leer und dehnt sich dann aus. Weiß = frei, schwarz = belegt, grau = unbekannt. Die Partikel konvergieren mit zunehmender Konfidenz.
-
Karte speichern
mkdir -p ~/catkin_ws/src/my_package/maps
cd ~/catkin_ws/src/my_package/maps
rosrun map_server map_saver -f my_map
-
Erzeugt my_map.pgm (Bild) und my_map.yaml (Konfiguration mit Auflösung ~0,05 m, Ursprung).
-
PGM in einem Bildbearbeitungsprogramm anzeigen; bei Bedarf manuell bearbeiten (z. B. Lücken füllen) mit Werkzeugen wie GIMP.
-
Gespeicherte Karte laden: rosrun map_server map_server my_map.yaml
-
Test: RViz neu starten – die Karte sollte statisch erscheinen.
-
Falls die Daten verzerrt sind, führen Sie die Messung mit einer besseren Odometrie erneut durch oder wechseln Sie zum Cartographer-Modus für eine erweiterte Schleifenschließung.
-
Karte kann nicht erstellt werden: Überprüfen Sie die Remaps (Scan-Topic-Fehler). Verwenden Sie rostopic info /scan.
-
Drift/Verzerrung: Räder kalibrieren; IMU für Fusion hinzufügen. Geschwindigkeit reduzieren – RPLIDAR hat in großen/offenen Gebieten eine geringe Reichweite (6 m).
-
Hohe CPU-Auslastung: Partikelanzahl auf 50 reduzieren; temporalUpdate erhöhen.
-
Kein geschlossener Kreislauf: Bereiche erneut überprüfen; für gleichmäßige Beleuchtung/Oberflächen sorgen.
-
Fehler wie „Verlorene Nachrichten“: Erhöhen Sie die Warteschlangengrößen beim Start.
| Ausgabe | Ursache | Fix |
| Keine Kartenaktualisierungen | Themenkonflikt | Remap scan:=/scan; check rostopic |
| Drift | Schlechte Odometrie | Encoder hinzufügen; langsamer fahren |
| Unvollständige Karte | Unzureichende Erkundung | Systematische Pfade verwenden; Schleifen zum Abschluss nutzen. |
| CPU-Überlastung | Hohe Partikel | Reduzierung auf 50-60; größeres Aktualisierungsintervall |
Über die Kartierung hinaus: Echtzeit-Lokalisierung und Navigation
AMCL für die Lokalisierung implementieren
sudo apt install ros-noetic-amcl
-
Karte laden:
rosrun map_server map_server my_map.yaml
-
AMCL ausführen:
<node pkg="amcl" type="amcl" name="amcl">
<param name="min_particles" value="500"/>
<param name="max_particles" value="3000"/>
<param name="kld_err" value="0.02"/>
</node>
-
Fügen Sie in RViz ein PoseArray für Partikel hinzu. Legen Sie die Anfangspose mit dem 2D-Pose-Schätzungswerkzeug fest. AMCL verfeinert die Lokalisierung während der Roboterbewegung.
Behebung häufiger SLAM-Fehler
map_update_interval für dynamische Räume; Hinzufügen einer IMU für mehr Stabilität in DIY-Robotikprojekten.|
Ausgabe
|
Ursache
|
Fix
|
|
Drift
|
Sensorrauschen
|
AMCL-Partikel optimieren; Encoder hinzufügen
|
|
Schleifenschluss fehlgeschlagen
|
Große Gebiete
|
Kartograf verwenden; langsame Bewegung
|
|
Lokalisierungsverlust
|
Schnelle Kurven
|
Geschwindigkeit verringern; Lidar-Halterung verbessern
|
Nächste Schritte: Wegplanung
sudo apt install ros-noetic-navigation


