Navigation eines FTF mit ROS2: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(35 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 13: Zeile 13:


== Aufgabenstellung ==
== Aufgabenstellung ==
* Einarbeitung in ROS 2 und die FTF Hardware
# Einarbeitung in ROS 2 und die FTF Hardware
* Optimierung der Navigation in der WeBots Simulation
# Optimierung der Navigation in der WeBots Simulation
* Inbetriebnahme der FTF Sensoren
# Inbetriebnahme der FTF Sensoren
* Sicherer Betriebszustand und Notaus
# Sicherer Betriebszustand und Notaus
* Ansteuerung der FTF Aktoren
# Ansteuerung der FTF Aktoren
* Schnittstelle ROS2 zum FTF herstellen
# Schnittstelle ROS2 zum FTF herstellen
* Navigation des FTF in einer realen Umgebung
# Navigation des FTF in einer realen Umgebung
* Ausblick auf Optimierungspotential
# Ausblick auf Optimierungspotential
* Dokumentation der Erkenntnisse in einem Wiki Artikel
# Dokumentation der Erkenntnisse in einem Wiki Artikel


== Anforderungen an die Projektarbeit ==
* Wissenschaftliche Vorgehensweise (Projektplan, etc.), nützlicher Artikel: [[Gantt-Diagramm| Gantt Diagramm erstellen]]
* Zweiwöchentlicher Fortschrittsberichte (informativ)
* Projektvorstellung im Wiki
*[[Software_Versionsverwaltung_mit_SVN|Regeln zum Umgang mit SVN]]
*[[Studentische_Arbeiten_bei_Prof._Schneider|Studentische Arbeiten bei Prof. Schneider]]
*[[Anforderungen_an_eine_wissenschaftlich_Arbeit| Anforderungen an eine wissenschaftlich Arbeit]]
== Projektplan ==
[[Datei:Schmidt FTF Projektplan.png]]
== Notwendige ROS2 Bibliotheken==
=== Kartografierung ===
* cartographer_node
* occupancy_grid_node
* RP_Lidar
* map_server
=== Lokalisierung ===
* nav2_amcl
=== Pfad Planung ===
* nav2_planner
* nav2_controller
* nav2_bt_navigator
* nav2_recoveries
=== Aktorsteuerung ===
* ros2_canopen
=== Objektumgehung===
* nav2_coastmap
== Inberiebnahme der Simulation ==
Die Simulationsdateien sind im Projektordner unter "trunk\Projekte\FTF_Hanning\FTS\" gespeichert. <br>
Die Simulationsumgebung wurde anfangs auf der ROS-Version „Foxy“ entwickelt und musste nach einigen updatebedingten Problemen auf „Galactic“ umgeschrieben werden. Zudem wurde eine aktualisierte Variante in einem „Docker-Container“, einer virtuellen Umgebung eingepflegt, um zukünftige Updateprobleme zu verhindern, welche jedoch aufgrund von Speichermangel am Testrechner nicht weiterverfolgt wurde.
Zur Inbetriebnahme der Simulation müssen zunächst die abhängigen Pakete, wie unter anderem „navigation2“, „turtlebot3“ sowie „WeBots-ros2“ installiert werden.
Das erfolgt einfach mit folgendem Kommandozeilenbefehl, bei dem einfach alle Pakete aneinander geschrieben werden:


== Anforderungen an die Projektarbeit ==
<code> sudo apt install ros-${ROS_DISTRO}-navigation2 ros-${ROS_DISTRO}-nav2-bringup '~ros-${ROS_DISTRO}-turtlebot3-.*' ros-${ROS_DISTRO}-laser-geometry ros-${ROS_DISTRO}-webots-ros2  </code>
#[[Studentische_Arbeiten_bei_Prof._Schneider|Studentische Arbeiten bei Prof. Schneider]]
 
#[[Anforderungen_an_eine_wissenschaftlich_Arbeit| Anforderungen an eine wissenschaftlich Arbeit]]
Danach erfolgt eine Installation der „WeBots“ Simulationsumgebung von:
[https://cyberbotics.com/doc/guide/installation-procedure#installing-the-debian-package-with-the-advanced-packaging-tool-apt Webots]
 
<code> wget -qO- https://cyberbotics.com/Cyberbotics.asc | sudo apt-key add - </code><br>
<code> sudo apt-add-repository 'deb https://cyberbotics.com/debian/ binary-amd64/'</code><br>
<code> sudo apt-get update </code><br>
<code> sudo apt-get install webots </code><br>
 
Nach Installation aller notwenigen Pakete kann mit dem Befehl
 
<code> colcon build --packages-select hewagv_simulation openslam_gmapping slam_gmapping </code>
 
die Simulationsumgebung gebaut werden und mit dem Befehl
 
<code> source install/local-setup.bash </code>


die gebauten Pakete verlinked werden.


== Projektplan ==
Der Simulationsstart erfolgt dann über den Befehl:


<code> ros2 launch hewagv_simulation full_system_launch.py </code>


== BOM ==
Hier wird erst das Paket „hewagv_simulation“ angewählt und die enthaltene Startdatei „full_system_launch.py“ gestartet.


== Inbetriebnahme der FTF Sensoren ==
=== Lidar ===
Das RPLidar ist mit dem rplidar_ros2 Paket ansteuerbar.
<pre>
rplidar_node = Node(
        <nowiki>name='rplidar_composition',
        package='rplidar_ros',
        executable='rplidar_composition',
        output='screen',
        parameters=[{
            'serial_port': '/dev/RPLidar',
            'serial_baudrate': 115200,  # A2
            'frame_id': 'base_scan',
            'inverted': False,
            'angle_compensate': True,
        }],</nowiki>
    )
</pre>
=== 9-Achsen Gyroskop ===
Die Bosch IMU BNO055 ist mit dem bno055 Paket ansteuerbar.
<pre>
imu_node = Node(
        name='bno055',
        package='bno055',
        executable='bno055',
        parameters=[{
            'uart_port': '/dev/FTDI_1',
            'uart_baudrate': 115200,
            'frame_id': 'imu_link',
        }],
    )
</pre>


== Ansteuerung der FTF Aktoren ==
== Ansteuerung der FTF Aktoren ==
=== CANopenLinux ===
Zur Ansteuerung der Motoren wird eine CANopen Node mit der ID=3 eröffnet. <br>
Um den PCAN Treiber zu laden muss folgender Befehl ausgeführt werden: <br>
<code> sudo modprobe pcan </code> <br>
Dazu muss zunächst die CAN Schnittstelle zugewiesen werden: <br>
<code> sudo ip link set up can0 type can bitrate 250000 </code> <br>


=== Motoren ===
Anschließend wird die Node erstellt: <br>
* Installation von CANopenLinux
<code> canopend can0 -i 3 -c "local-/tmp/CO_command_socket" </code> <br>
 
Der CANBus kann mit <code> candump can0 </code> ausgelesen werden. <br>
 
Mit <code> cocomm "<node> <r/w> <index> <subindex> <datatype> <value>"</code> können Befehle gesendet/ausgelesen werden. <br>
<br>
 
Peak CANController Setup für ros2_canopen: <br>
<code>sudo modprobe peak_usb</code> <br>
<code>sudo ip link set can0 up type can bitrate 250000</code> <br>
<code>sudo ip link set can0 txqueuelen 250</code> <br>
<code>sudo ip link set up can0</code> <br>
 
=== Nützliche Befehle ===
==== Motorsetup ====
'''0x6040 ControlWord'''<br>
Das ControlWord dient zur Bewegungssteuerung <br>
* Data Type: UNSIGNED16
* Access Type:  write only
 
{| class="wikitable"
|+ ControlWord Bits
! 15 !! 11 !! 10 !! 9 !! 8 !! 7 !! 6 !! 4 !! 3 !! 2 !! 1 !! 0
|-
|colspan="2"| Manufacturer Specific
|colspan="2"| Reserved
| Halt
| Fault Reset
|colspan="2"| Operation Mode Specific
| Enable Operation
| Quick Stop
| Enable Voltage
| Switch on
|-
|}
<br>
'''0x6060 Modes_of_operation'''<br>
Schalter zur Auswahl des Operationsmodus.<br>
* Data Type: INTEGER8
* Access Type: write only
 
{| class="wikitable"
! Mode of Operation !! Action
|-
| -2 || SYNC Q Mode
|-
| -1 || Normal Q Mode
|-
| 1 || Profile Position Mode
|-
| 3 || Profile Velocity Mode
|-
| 4 || Torque Profile Mode
|-
| 6 || Homing Mode
|}
Der Operationsmodus steht in '''0x6061'''. <br>
 
'''0x6083/0x6084 profile_acceleration/deceleration'''<br>
Profil Beschleunigungs/Verzögerungsgeschwindigkeit in 100 rps/s.<br>
* Data Type: UNSIGNED32
* Access Type: read/write
<br>
 
 
'''0x6081 P2P_profile_velocity'''<br>
Maximale Geschwindigkeit.<br>
* Data Type: UNSIGNED32
* Access Type: read/write
<br>
 
==== Bewegungssteuerung ====
'''0x607A target_position'''<br>
Zielposition für den Profile Position Mode.<br>
* Data Type: INTEGER32
* Access Type: read/write
'''ControlWord''' Bit 6 setzen:
* 0 für absolute Position
* 1 für relative Position
<br>
 
'''0x60FF profile_velocity'''<br>
Zielgeschwindigkeit in Umdrehungen/Sekunde.<br>
Wert muss mit 240 multipliziert werden.<br>
* Data Type: INTEGER32
* Access Type: read/write
 
==== Motorwerte ====
 
'''0x6064 Position_value_calculated'''<br>
Zeigt die errechnete Encoderposition.<br>
* Data Type: INTEGER32
* Access Type: read only
<br>
 
'''0x6064 position_actual_value'''<br>
Zeigt die echte Encoderposition.<br>
* Data Type: INTEGER32
* Access Type: read only
<br>
 
'''0x606C Velocity_value_calaculated'''<br>
Zeigt die errechnete Geschwindigkeit in Umdrehungen/Sekunde.<br>
Wert muss mit 240 dividiert werden.<br>
* Data Type: INTEGER32
* Access Type: read only
<br>
 
'''0x7009 velocity_actual_value'''<br>
Zeigt die echte Geschwindigkeit in Umdrehungen/Sekunde.<br>
Wert muss mit 240 dividiert werden.<br>
* Data Type: UNSIGNED16
* Access Type: read only
<br>
 
== Inbetriebnahme ==
Abhängigkeiten überprüfen<br>
<code>sudo rosdep init</code><br>
<code>rosdep update</code><br>
<code>rosdep install --from-paths src -y --ignore-src</code><br>
 
Pakete bauen<br>
 
* Hinweis: erst canopen_interfaces mit <code>colcon build --merge-install --packages-select canopen_interfaces</code> bauen<br>
Dann mit <code>colcon build --merge-install</code> alles bauen.<br>
 
Pakete sourcen<br>
<code>source install/local_setup.bash</code><br>
 
 
 
=== 1. Interface auf dem Raspberry Pi starten ===
Als erstes wird das ros2_canopen Interface gestartet: <br>
<code>ros2 launch ftf_motor_controller bring_up.launch.py</code><br>
Dann die Differentialantrieb Controller und die Sensoren:<br>
<code>ros2 launch hewagv_bringup hewagv_drives_only_launch.py</code><br>
 
 
=== 2. Navigation starten ===
Auf dem Hauptrechner wird dann die Navigation gestartet. <br>
Für die Kartografierung mit SLAM-Algorithmus: <br>
<code>ros2 launch hewagv_bringup hewagv_loc_launch.py</code><br>
Für die Navigation auf einer bestehenden Karte:<br>
<code>ros2 launch hewagv_bringup hewagv_nav_launch.py</code><br>


== Ergebnis ==
== Ergebnis ==
[[Datei:SLAM_Regelungstechnik_Raum.jpg|thumb|left| Karte des Regelungstechnikraums]]


<br clear=all>


== Zusammenfassung ==
== Zusammenfassung ==
Zeile 48: Zeile 286:


=== Lessons Learned ===
=== Lessons Learned ===
Theoretische Erkenntnisse:
* CANopen-Protokoll
* ROS2-Umgebung
* ROS2-Navigation
* ROS2-Controller


 
Praktische Erkenntnisse:
* Schrittweise Inbetriebnahme von Systemkomponenten
* Fehlersuche
* Hardwareumbauten


== Projektunterlagen ==
== Projektunterlagen ==
Link zu dem SVN_Ordner des Projekt.  
Link zu den SVN-Ordnern des Projekt:<br>
https://svn.hshl.de/svn/Robotik_und_Autonome-Systeme/trunk/Mitgliederordner/2022_Yannick_Schmidt/<br>
https://svn.hshl.de/svn/Robotik_und_Autonome-Systeme/branches/2022_10_Schmidt_FTF_ws/


== YouTube Video ==
== YouTube Video ==
Das Video von diesem Projekt finden Sie auf Youtube unter dem Link:
Das Video von diesem Projekt finden Sie auf Youtube unter dem Link:
{{#ev:youtube|https://youtu.be/ys_7Qq66JGI|450px|left}}
<br clear=all>


== Weblinks ==
== Weblinks ==

Aktuelle Version vom 19. November 2023, 22:31 Uhr

Autor: Yannick Schmidt
Art: Projektarbeit
Dauer: April - September 2022
Betreuer: Prof. Schneider


Thema

Das Thema der Projektarbeit ist es das Fahrerlose Transportfahrzeug mit ROS2 zu navigieren

Aufgabenstellung

  1. Einarbeitung in ROS 2 und die FTF Hardware
  2. Optimierung der Navigation in der WeBots Simulation
  3. Inbetriebnahme der FTF Sensoren
  4. Sicherer Betriebszustand und Notaus
  5. Ansteuerung der FTF Aktoren
  6. Schnittstelle ROS2 zum FTF herstellen
  7. Navigation des FTF in einer realen Umgebung
  8. Ausblick auf Optimierungspotential
  9. Dokumentation der Erkenntnisse in einem Wiki Artikel

Anforderungen an die Projektarbeit

Projektplan

Notwendige ROS2 Bibliotheken

Kartografierung

  • cartographer_node
  • occupancy_grid_node
  • RP_Lidar
  • map_server

Lokalisierung

  • nav2_amcl

Pfad Planung

  • nav2_planner
  • nav2_controller
  • nav2_bt_navigator
  • nav2_recoveries

Aktorsteuerung

  • ros2_canopen

Objektumgehung

  • nav2_coastmap

Inberiebnahme der Simulation

Die Simulationsdateien sind im Projektordner unter "trunk\Projekte\FTF_Hanning\FTS\" gespeichert.
Die Simulationsumgebung wurde anfangs auf der ROS-Version „Foxy“ entwickelt und musste nach einigen updatebedingten Problemen auf „Galactic“ umgeschrieben werden. Zudem wurde eine aktualisierte Variante in einem „Docker-Container“, einer virtuellen Umgebung eingepflegt, um zukünftige Updateprobleme zu verhindern, welche jedoch aufgrund von Speichermangel am Testrechner nicht weiterverfolgt wurde. Zur Inbetriebnahme der Simulation müssen zunächst die abhängigen Pakete, wie unter anderem „navigation2“, „turtlebot3“ sowie „WeBots-ros2“ installiert werden. Das erfolgt einfach mit folgendem Kommandozeilenbefehl, bei dem einfach alle Pakete aneinander geschrieben werden:

sudo apt install ros-${ROS_DISTRO}-navigation2 ros-${ROS_DISTRO}-nav2-bringup '~ros-${ROS_DISTRO}-turtlebot3-.*' ros-${ROS_DISTRO}-laser-geometry ros-${ROS_DISTRO}-webots-ros2

Danach erfolgt eine Installation der „WeBots“ Simulationsumgebung von: Webots

wget -qO- https://cyberbotics.com/Cyberbotics.asc | sudo apt-key add -
sudo apt-add-repository 'deb https://cyberbotics.com/debian/ binary-amd64/'
sudo apt-get update
sudo apt-get install webots

Nach Installation aller notwenigen Pakete kann mit dem Befehl

colcon build --packages-select hewagv_simulation openslam_gmapping slam_gmapping

die Simulationsumgebung gebaut werden und mit dem Befehl

source install/local-setup.bash

die gebauten Pakete verlinked werden.

Der Simulationsstart erfolgt dann über den Befehl:

ros2 launch hewagv_simulation full_system_launch.py

Hier wird erst das Paket „hewagv_simulation“ angewählt und die enthaltene Startdatei „full_system_launch.py“ gestartet.

Inbetriebnahme der FTF Sensoren

Lidar

Das RPLidar ist mit dem rplidar_ros2 Paket ansteuerbar.

 rplidar_node = Node(
        name='rplidar_composition',
        package='rplidar_ros',
        executable='rplidar_composition',
        output='screen',
        parameters=[{
            'serial_port': '/dev/RPLidar',
            'serial_baudrate': 115200,  # A2
            'frame_id': 'base_scan',
            'inverted': False,
            'angle_compensate': True,
        }],
    )

9-Achsen Gyroskop

Die Bosch IMU BNO055 ist mit dem bno055 Paket ansteuerbar.

imu_node = Node(
        name='bno055',
        package='bno055',
        executable='bno055',
        parameters=[{
            'uart_port': '/dev/FTDI_1',
            'uart_baudrate': 115200,
            'frame_id': 'imu_link',
        }],
    )

Ansteuerung der FTF Aktoren

CANopenLinux

Zur Ansteuerung der Motoren wird eine CANopen Node mit der ID=3 eröffnet.
Um den PCAN Treiber zu laden muss folgender Befehl ausgeführt werden:
sudo modprobe pcan
Dazu muss zunächst die CAN Schnittstelle zugewiesen werden:
sudo ip link set up can0 type can bitrate 250000

Anschließend wird die Node erstellt:
canopend can0 -i 3 -c "local-/tmp/CO_command_socket"

Der CANBus kann mit candump can0 ausgelesen werden.

Mit cocomm "<node> <r/w> <index> <subindex> <datatype> <value>" können Befehle gesendet/ausgelesen werden.

Peak CANController Setup für ros2_canopen:
sudo modprobe peak_usb
sudo ip link set can0 up type can bitrate 250000
sudo ip link set can0 txqueuelen 250
sudo ip link set up can0

Nützliche Befehle

Motorsetup

0x6040 ControlWord
Das ControlWord dient zur Bewegungssteuerung

  • Data Type: UNSIGNED16
  • Access Type: write only
ControlWord Bits
15 11 10 9 8 7 6 4 3 2 1 0
Manufacturer Specific Reserved Halt Fault Reset Operation Mode Specific Enable Operation Quick Stop Enable Voltage Switch on


0x6060 Modes_of_operation
Schalter zur Auswahl des Operationsmodus.

  • Data Type: INTEGER8
  • Access Type: write only
Mode of Operation Action
-2 SYNC Q Mode
-1 Normal Q Mode
1 Profile Position Mode
3 Profile Velocity Mode
4 Torque Profile Mode
6 Homing Mode

Der Operationsmodus steht in 0x6061.

0x6083/0x6084 profile_acceleration/deceleration
Profil Beschleunigungs/Verzögerungsgeschwindigkeit in 100 rps/s.

  • Data Type: UNSIGNED32
  • Access Type: read/write



0x6081 P2P_profile_velocity
Maximale Geschwindigkeit.

  • Data Type: UNSIGNED32
  • Access Type: read/write


Bewegungssteuerung

0x607A target_position
Zielposition für den Profile Position Mode.

  • Data Type: INTEGER32
  • Access Type: read/write

ControlWord Bit 6 setzen:

  • 0 für absolute Position
  • 1 für relative Position


0x60FF profile_velocity
Zielgeschwindigkeit in Umdrehungen/Sekunde.
Wert muss mit 240 multipliziert werden.

  • Data Type: INTEGER32
  • Access Type: read/write

Motorwerte

0x6064 Position_value_calculated
Zeigt die errechnete Encoderposition.

  • Data Type: INTEGER32
  • Access Type: read only


0x6064 position_actual_value
Zeigt die echte Encoderposition.

  • Data Type: INTEGER32
  • Access Type: read only


0x606C Velocity_value_calaculated
Zeigt die errechnete Geschwindigkeit in Umdrehungen/Sekunde.
Wert muss mit 240 dividiert werden.

  • Data Type: INTEGER32
  • Access Type: read only


0x7009 velocity_actual_value
Zeigt die echte Geschwindigkeit in Umdrehungen/Sekunde.
Wert muss mit 240 dividiert werden.

  • Data Type: UNSIGNED16
  • Access Type: read only


Inbetriebnahme

Abhängigkeiten überprüfen
sudo rosdep init
rosdep update
rosdep install --from-paths src -y --ignore-src

Pakete bauen

  • Hinweis: erst canopen_interfaces mit colcon build --merge-install --packages-select canopen_interfaces bauen

Dann mit colcon build --merge-install alles bauen.

Pakete sourcen
source install/local_setup.bash


1. Interface auf dem Raspberry Pi starten

Als erstes wird das ros2_canopen Interface gestartet:
ros2 launch ftf_motor_controller bring_up.launch.py
Dann die Differentialantrieb Controller und die Sensoren:
ros2 launch hewagv_bringup hewagv_drives_only_launch.py


2. Navigation starten

Auf dem Hauptrechner wird dann die Navigation gestartet.
Für die Kartografierung mit SLAM-Algorithmus:
ros2 launch hewagv_bringup hewagv_loc_launch.py
Für die Navigation auf einer bestehenden Karte:
ros2 launch hewagv_bringup hewagv_nav_launch.py

Ergebnis

Karte des Regelungstechnikraums


Zusammenfassung

Lessons Learned

Theoretische Erkenntnisse:

  • CANopen-Protokoll
  • ROS2-Umgebung
  • ROS2-Navigation
  • ROS2-Controller

Praktische Erkenntnisse:

  • Schrittweise Inbetriebnahme von Systemkomponenten
  • Fehlersuche
  • Hardwareumbauten

Projektunterlagen

Link zu den SVN-Ordnern des Projekt:
https://svn.hshl.de/svn/Robotik_und_Autonome-Systeme/trunk/Mitgliederordner/2022_Yannick_Schmidt/
https://svn.hshl.de/svn/Robotik_und_Autonome-Systeme/branches/2022_10_Schmidt_FTF_ws/

YouTube Video

Das Video von diesem Projekt finden Sie auf Youtube unter dem Link:


Weblinks


Literatur


→ zurück zum Hauptartikel: Studentische Arbeiten