Table of Contents
Motivation
Nachdem wir bereits erfolgreich ROS2 auf dem Raspberry installiert, die Kamera zum laufen gebracht und auch schon einen Blobdetektor geschrieben haben, widmen wir uns nun der Steuerung des Ball Chaser Roboters mit einem Gamepad.
Gamepad
Ich verwende hier das Logitech Gamepad F710.
Verbinde dein F710 per USB-Dongle, schalte es auf den Direct Input-Modus (Schalter auf “D”).
Wenn du sehen willst, ob das Gamepad richtig erkannt wird, gib
lsusb | grep Logitech
in das Terminal ein. Wenn Du
Bus 003 Device 005: ID 046d:c219 Logitech, Inc. F710 Gamepad [DirectInput Mode]
siehst, wurde es korrekt erkannt.
Den Roboter steuern
Um den Roboter mit einem Gamepad zu steuern, benötigen wir das Paket teleop_twist_joy
. Dieses Paket wandelt die Eingaben des Gamepads in Twist
Nachrichten um und
veröffentlicht diese auf einem bestimmten ROS 2 Topic, in der Regel /cmd_vel
.
Es werden dazu zwei nodes gestartet, der joy_node und der teleop_node.
Installation
Wie bei ROS üblich werden Pakete über apt installiert:
sudo apt install ros-humble-teleop-twist-joy
Wurde das Gamepad korrekt erkannt?
Um zu schauen, ob das Gamepad richtig erkannt wird, kannst du folgenden Befehl verwenden:
ros2 run joy joy_enumerate_devices
Es sollte eine Ausgabe wie diese erscheinen:
ID : GUID : GamePad : Mapped : Joystick Device Name
-------------------------------------------------------------------------------
0 : 030000006d0400001fc2000005030000 : true : true : Logitech F710 Gamepad (XInput)
Joy Node starten
Im ersten Schritt müssen wir den Joy Node starten.
ros2 run joy joy_node
Der joy node veröffentlicht die Daten des Gamepads auf dem Topic /joy
.
Um zu sehen, ob der Node richtig gestartet wurde, kannst du folgenden Befehl verwenden:
ros2 topic echo /joy
Die Ausgabe sieht so aus:
header:
stamp:
sec: 1739217047
nanosec: 710310619
frame_id: joy
axes:
- -0.0
- -0.0
- -0.0
- -0.0
- 0.0
- 0.0
buttons:
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
---
Button-Zuordnung
Achsen
- 0: Left Stick Horizontal (-1.0..1.0)
- 1: Left Stick Vertical (-1.0..1.0)
- 2: Right Stick Horizontal (-1.0..1.0)
- 3: Right Stick Vertical (-1.0..1.0)
- 4: Cross key Horizontal (-1.0..1.0)
- 5: Cross key Vertical (-1.0..1.0)
Buttons
- 0: X
- 1: A
- 2: B
- 3: Y
- 4: LB
- 5: RB
- 6: LT
- 7: RT
- 8: BACK
- 9: START
- 10: Left Stick Button
- 11: Right Stick Button
Teleop
Im nächsten Schritt starten wir den Node teleop_node
. Dieser Node abonniert die Daten des Gamepads und veröffentlicht die Twist
Nachrichten auf dem Topic /cmd_vel
.
Öffne ein weiteres Terminal und starte den Node mit folgendem Befehl:
ros2 run teleop_twist_joy teleop_node
Konfiguration
Die Konfiguration des Gamepads erfolgt in der Datei twist_joy.yaml
.
joy_node:
ros__parameters:
device_id: 0
deadzone: 0.05
autorepeat_rate: 20.0
teleop_node:
ros__parameters:
axis_linear:
x: 1
scale_linear:
x: 0.5
scale_linear_turbo:
x: 1.0
axis_angular:
yaw: 0
scale_angular:
yaw: 0.5
scale_angular_turbo:
yaw: 1.0
enable_button: 6
enable_turbo_button: 7
require_enable_button: true
Launch File
Um die zwei Nodes nicht per Hand smarten zu müssen, kannst du ein Launch File verwenden.
Erstelle eine Datei teleop_twist_joy.launch.py
im Ordner launch deines Paketes.
from launch import LaunchDescription
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
import os
def generate_launch_description():
ld = LaunchDescription()
package_path = get_package_share_directory('ball_tracker')
twist_joy_config_file_path = os.path.join(package_path, 'config', 'twist_joy.yaml')
joy_node = Node(
package='joy',
executable='joy_node',
name='joy_node',
output='screen'
)
teleop_twist_joy = Node(
package='teleop_twist_joy',
executable='teleop_node',
output='screen',
remappings=[
('/cmd_vel', '/turtle1/cmd_vel')
],
parameters=[twist_joy_config_file_path]
)
ld.add_action(joy_node)
ld.add_action(teleop_twist_joy)
return ld
Hier mappen wir cmd_vel auf trutle1/cmd_vel
Turtlesim starten
ros2 run turtlesim turtlesim_node