Verbindungsaufbau • Chassis • Robotic arm • Gripper • Sensor • Vision • LED
from robomaster import robot
if __name__ == '__main__':
robot = robot.Robot()
robot.initialize(conn_type="sta", sn="3JKDH2T001ULTD")
# [...]
robot.close()
Kommentierte Beispielskripte:
Funktion | Beschreibung |
---|---|
drive_speed(x, y, z, timeout) |
Fahre mit best. Geschwindigkeit; x ,y = m/s; z = °/s; timeout = s |
move(x, y, z, xy_speed, z_speed) |
Fahre best. Länge; x ,y = m; z = Grad °; xy_speed = m/s; z_speed = °/s |
drive_wheels(w1, w2, w3, w4, timeout) |
Bestimme Geschwindigkeiten der Räder; w1..w4 = rpm |
Funktion | Beschreibung |
---|---|
move(x, y) |
Relative Armbewegung; x , y = mm |
moveto(x, y) |
Absolute Armbewegung; x , y = mm |
recenter() |
Arm zur Mitte zurückbewegen |
Kommentiertes Beispielskript:
Funktion | Beschreibung |
---|---|
open(power) |
Öffne Gripper; power = [1, 100] |
close(power) |
Schließe Gripper; power = [1, 100] |
pause() |
Stoppe Bewegung |
Kommentierte Beispielskripte:
- Infrarotsensor zum Bremsen verwenden
- LEDs je nach Entfernung mithilfe eines Rot-Gelb-Grün Farbverlauf färben (verwendet
Queue
um Daten zwischen zwei Threads asynchron auszutauschen)
Funktion | Beschreibung |
---|---|
sub_distance(hz, cb) |
Entfernungsdaten abonnieren; hz = Rate, cb = Callback-Funktion (Int-Array mit je 4 Werten als Parameter) |
unsub_distance() |
Entfernungsdaten deabonnieren |
Der oben-genannte cb
-Parameter von sub_distance
muss eine Referenz zu einer Funktion enthalten. Sie erhält die Daten vom Sensor asynchron:
def cb_distance(array):
left = array[0]
right = array[1]
front = array[2]
back = array[3]
Die Funktion nimmt ein Integer-Array als Parameter an. Das Array enthält normalerweise Entfernungsdaten für alle Seiten des Roboters. Allerdings haben unsere Roboter nur einen Sensor an der linken Seite verbaut. Somit sind die anderen drei Werte im Array immer null.
Kommentierte Beispielskripte:
Funktion | Beschreibung |
---|---|
sub_detect_info(name, color, cb) |
Bilderkennungsdaten abonnieren; name = Modus (siehe Tabelle unten), color = Farbe der Marke/Linie, cb = Callback-Funktion |
unsub_detect_info(name) |
Bilderkennungsdaten deabonnieren; name = Modus |
Modus | Callback-Parameter | Beschreibung |
---|---|---|
person |
[x, y, Breite, Höhe] |
Personenerkennung |
gesture |
[x, y, Breite, Höhe] |
Gestenerkennung |
line |
[x, y, Tangentenwinkel (theta), Krümmung] |
Linienerkennung |
marker |
[x, y, Breite, Höhe, Name d. Markers] |
Markererkennung |
robot |
[x, y, Breite, Höhe] |
Robotererkennung |
Wie bei der Distance API, benötigt sub_detect_info
auch eine Referenz zu einer Callback-Funktion.
Im folgenden Beispiel wird Linienerkennung verwendet:
def cb_vision_line_update(line_data):
avg_theta = 0
avg_c = 0
points = 0
for d in line_data[-3:]:
x, y, theta, c = d
avg_theta += theta
avg_c += c
points += 1
avg_theta = avg_theta / points
avg_c = avg_c / points
line_data
ist eine Sammlung von Punkten, die eine Linie beschreiben. Jeder Punkt enthält seine x/y-Koordinaten, den Tangentenwinkel (theta) und die Krümmung (C). Der Codeauszug berechnet die Durchschnittswerte von Theta und C der letzten drei Punkte.
Zusätzlich können die Kamerabilder in Echtzeit vom Roboter heruntergeladen und angezeigt werden. Dazu kann man auch die cv2
-Bibliothek verwenden, um auf das Bild zu zeichnen. Beispiel:
import time
import cv2
from robomaster import robot
# [...]
ep_camera = ep_robot.camera
ep_camera.start_video_stream(display=False)
# 200x ein Bild vom Roboter abrufen
for r in range(200):
# Bild abrufen
img = ep_camera.read_cv2_image(strategy="newest", timeout=3)
# Das Bild hat eine Auflösung von 1280x720 Pixeln
for i in range(0,1280,30):
# Statischer Horizont (repräsentiert durch Punkte) auf Bild zeichnen
cv2.circle(img, [int(i), int(720/2)], 3, [255, 255, 255], -1)
# Fertiges Bild als Fenster anzeigen bzw. aktualisieren
cv2.imshow("Linie", img)
cv2.waitKey(1)
# 100ms warten
time.sleep(0.1)
# Videostream beenden
ep_camera.stop_video_stream()
Details zur Linienerkennung sind auf dieser Unterseite zu finden.
Funktion | Beschreibung |
---|---|
set_led(comp, r, g, b, effect, freq) |
Setze LED-Farbe; comp = Bereich, r,g,b = Farbe; effect = Lichteffekt; freq = Frequenz für flash -Effekt |
Mögliche Bereiche: all, top_all, top_right, top_left, bottom_all, bottom_front, bottom_back, bottom_left, bottom_right
Mögliche Effekte: on, off, flash, breath, scrolling