An open API service indexing awesome lists of open source software.

https://github.com/timschneeb/robomastercheatsheet

Robomaster Python API Cheatsheet
https://github.com/timschneeb/robomastercheatsheet

dji python robomaster

Last synced: 9 months ago
JSON representation

Robomaster Python API Cheatsheet

Awesome Lists containing this project

README

          


Robomaster Cheatsheet




Verbindungsaufbau
Chassis
Robotic arm
Gripper
Sensor
Vision
LED

## Verbindungsaufbau

```python
from robomaster import robot

if __name__ == '__main__':
robot = robot.Robot()
robot.initialize(conn_type="sta", sn="3JKDH2T001ULTD")
# [...]
robot.close()
```

## Schnittstellen

### Chassis API

Kommentierte Beispielskripte:
* [Einfache Bewegungen](chassis/chassis.py)
* [Rechteck mit Drehung](chassis/rechteck.py)

| 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 |

### Robotic arm API

| Funktion | Beschreibung |
| -------------- | ----------------------------------- |
| `move(x, y)` | Relative Armbewegung; `x`, `y` = mm |
| `moveto(x, y)` | Absolute Armbewegung; `x`, `y` = mm |
| `recenter()` | Arm zur Mitte zurückbewegen |

### Gripper API

Kommentiertes Beispielskript:
* [Objekt greifen, transportieren und ablegen](gripper/gripper.py)

| Funktion | Beschreibung |
| -------------- | ------------------------------------ |
| `open(power)` | Öffne Gripper; `power` = [1, 100] |
| `close(power)` | Schließe Gripper; `power` = [1, 100] |
| `pause()` | Stoppe Bewegung |

### Distance sensor API

Kommentierte Beispielskripte:
* [Infrarotsensor zum Bremsen verwenden](sensor/sensor-drive.py)
* [LEDs je nach Entfernung mithilfe eines Rot-Gelb-Grün Farbverlauf färben](sensor/sensor-led.py) (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|

#### Callback

Der oben-genannte `cb`-Parameter von `sub_distance` muss eine Referenz zu einer Funktion enthalten. Sie erhält die Daten vom Sensor asynchron:
```python
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.

### Vision API

Kommentierte Beispielskripte:
* [Verhalten des Roboters (sowie die LEDs) je nach Marker ändern](vision/camera-marker.py)
* [Fahrt entlang einer blauen Linie](vision/follow-line)

| 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 |

#### Callback
Wie bei der [Distance API](#distance-sensor-api), benötigt `sub_detect_info` auch eine Referenz zu einer Callback-Funktion.

Im folgenden Beispiel wird **Linienerkennung** verwendet:

```python
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**.

#### Bildübertragung

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:
```python
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()
```
#### Linie erfassen

Details zur Linienerkennung sind auf [dieser Unterseite zu finden](vision/follow-line).

### LED API

| 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`
_________

Quelle: