{"id":20801751,"url":"https://github.com/timschneeb/robomastercheatsheet","last_synced_at":"2025-05-07T00:13:28.458Z","repository":{"id":39993785,"uuid":"447735190","full_name":"timschneeb/RobomasterCheatsheet","owner":"timschneeb","description":"Robomaster Python API Cheatsheet","archived":false,"fork":false,"pushed_at":"2022-05-25T16:38:46.000Z","size":1259,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-31T04:25:22.633Z","etag":null,"topics":["dji","python","robomaster"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/timschneeb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-01-13T19:59:30.000Z","updated_at":"2022-12-05T14:57:00.000Z","dependencies_parsed_at":"2022-09-05T04:02:14.468Z","dependency_job_id":null,"html_url":"https://github.com/timschneeb/RobomasterCheatsheet","commit_stats":null,"previous_names":["timschneeb/robomastercheatsheet"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timschneeb%2FRobomasterCheatsheet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timschneeb%2FRobomasterCheatsheet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timschneeb%2FRobomasterCheatsheet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timschneeb%2FRobomasterCheatsheet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/timschneeb","download_url":"https://codeload.github.com/timschneeb/RobomasterCheatsheet/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252788532,"owners_count":21804284,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dji","python","robomaster"],"created_at":"2024-11-17T18:21:03.787Z","updated_at":"2025-05-07T00:13:28.427Z","avatar_url":"https://github.com/timschneeb.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  Robomaster Cheatsheet\n  \u003cbr\u003e\n\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#verbindungsaufbau\"\u003eVerbindungsaufbau\u003c/a\u003e •\n  \u003ca href=\"#chassis-api\"\u003eChassis\u003c/a\u003e •\n  \u003ca href=\"#robotic-arm-api\"\u003eRobotic arm\u003c/a\u003e •\n  \u003ca href=\"#gripper-api\"\u003eGripper\u003c/a\u003e •\n  \u003ca href=\"#distance-sensor-api\"\u003eSensor\u003c/a\u003e •\n  \u003ca href=\"#vision-api\"\u003eVision\u003c/a\u003e •\n  \u003ca href=\"#led-api\"\u003eLED\u003c/a\u003e\n\u003c/p\u003e\n\n\n## Verbindungsaufbau\n\n```python\nfrom robomaster import robot\n\nif __name__ == '__main__':\n    robot = robot.Robot()\n    robot.initialize(conn_type=\"sta\", sn=\"3JKDH2T001ULTD\")\n\t# [...]\n    robot.close()\n```\n\n## Schnittstellen\n\n### Chassis API\n\nKommentierte Beispielskripte:\n* [Einfache Bewegungen](chassis/chassis.py)\n* [Rechteck mit Drehung](chassis/rechteck.py)\n\n| Funktion | Beschreibung |\n| ------------------------------------------------------------ | ---- |\n| `drive_speed(x, y, z, timeout)` | Fahre mit best. Geschwindigkeit; `x`,`y` = m/s; `z` = °/s; `timeout` = s |\n| `move(x, y, z, xy_speed, z_speed)` | Fahre best. Länge;  `x`,`y` = m; `z` = Grad °; `xy_speed` = m/s; `z_speed` = °/s |\n| `drive_wheels(w1, w2, w3, w4, timeout)` | Bestimme Geschwindigkeiten der Räder; `w1..w4` = rpm |\n\n### Robotic arm API\n\n| Funktion       | Beschreibung                        |\n| -------------- | ----------------------------------- |\n| `move(x, y)`   | Relative Armbewegung; `x`, `y` = mm |\n| `moveto(x, y)` | Absolute Armbewegung; `x`, `y` = mm |\n| `recenter()`   | Arm zur Mitte zurückbewegen         |\n\n### Gripper API\n\nKommentiertes Beispielskript:\n* [Objekt greifen, transportieren und ablegen](gripper/gripper.py)\n\n| Funktion       | Beschreibung                         |\n| -------------- | ------------------------------------ |\n| `open(power)`  | Öffne Gripper; `power` = [1, 100]    |\n| `close(power)` | Schließe Gripper; `power` = [1, 100] |\n| `pause()`      | Stoppe Bewegung                      |\n\n\n### Distance sensor API\n\nKommentierte Beispielskripte:\n* [Infrarotsensor zum Bremsen verwenden](sensor/sensor-drive.py)\n* [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)\n\n\n| Funktion       | Beschreibung                         |\n| -------------- | ------------------------------------ |\n| `sub_distance(hz, cb)`  | Entfernungsdaten abonnieren; `hz` = Rate, `cb` = Callback-Funktion (Int-Array mit je 4 Werten als Parameter) |\n| `unsub_distance()` | Entfernungsdaten deabonnieren|\n\n#### Callback\n\nDer oben-genannte `cb`-Parameter von `sub_distance` muss eine Referenz zu einer Funktion enthalten. Sie erhält die Daten vom Sensor asynchron:\n```python\ndef cb_distance(array):\n    left = array[0]\n    right = array[1]\n    front = array[2]\n    back = array[3]\n```\nDie 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.\n\n\n### Vision API\n\nKommentierte Beispielskripte:\n* [Verhalten des Roboters (sowie die LEDs) je nach Marker ändern](vision/camera-marker.py)\n* [Fahrt entlang einer blauen Linie](vision/follow-line)\n\n| Funktion       | Beschreibung                         |\n| -------------- | ------------------------------------ |\n| `sub_detect_info(name, color, cb)`  | Bilderkennungsdaten abonnieren; `name` = Modus (siehe Tabelle unten), `color` = Farbe der Marke/Linie, `cb` = Callback-Funktion |\n| `unsub_detect_info(name)` | Bilderkennungsdaten deabonnieren; `name` = Modus  |\n\n| Modus       | Callback-Parameter | Beschreibung                         |\n| -------------- | -------------- | ------------------------------------ |\n| `person`  | `[x, y, Breite, Höhe]` | Personenerkennung |\n| `gesture` | `[x, y, Breite, Höhe]` | Gestenerkennung |\n| `line`    | `[x, y, Tangentenwinkel (theta), Krümmung]` | Linienerkennung |\n| `marker`  | `[x, y, Breite, Höhe, Name d. Markers]` | Markererkennung |\n| `robot`  | `[x, y, Breite, Höhe]` | Robotererkennung |\n\n#### Callback\nWie bei der [Distance API](#distance-sensor-api), benötigt `sub_detect_info` auch eine Referenz zu einer Callback-Funktion.\n\nIm folgenden Beispiel wird **Linienerkennung** verwendet:\n\n```python\ndef cb_vision_line_update(line_data):\n\tavg_theta = 0\n\tavg_c = 0\n\tpoints = 0\n\tfor d in line_data[-3:]:\n\t\tx, y, theta, c = d\n\t\tavg_theta += theta\n\t\tavg_c += c\n\t\tpoints += 1\n\n\tavg_theta = avg_theta / points\n\tavg_c = avg_c / points\n```\n`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**.\n\n\n#### Bildübertragung\n\nZusä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:\n```python\nimport time\nimport cv2\nfrom robomaster import robot\n\n# [...]\n\nep_camera = ep_robot.camera\nep_camera.start_video_stream(display=False)\n\n# 200x ein Bild vom Roboter abrufen\nfor r in range(200):\n    # Bild abrufen\n    img = ep_camera.read_cv2_image(strategy=\"newest\", timeout=3)\n\n    # Das Bild hat eine Auflösung von 1280x720 Pixeln\n    for i in range(0,1280,30):\n        # Statischer Horizont (repräsentiert durch Punkte) auf Bild zeichnen\n        cv2.circle(img, [int(i), int(720/2)], 3, [255, 255, 255], -1)\n\n    # Fertiges Bild als Fenster anzeigen bzw. aktualisieren\n    cv2.imshow(\"Linie\", img)\n    cv2.waitKey(1)\n\n    # 100ms warten\n    time.sleep(0.1)\n\n# Videostream beenden\nep_camera.stop_video_stream()\n```\n#### Linie erfassen\n\nDetails zur Linienerkennung sind auf [dieser Unterseite zu finden](vision/follow-line).\n\n\n### LED API\n\n| Funktion       | Beschreibung                         |\n| -------------- | ------------------------------------ |\n| `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 |\n\nMögliche Bereiche: `all, top_all, top_right, top_left, bottom_all, bottom_front, bottom_back, bottom_left, bottom_right`\nMögliche Effekte: `on, off, flash, breath, scrolling`\n_________\n\nQuelle: \u003chttps://robomaster-dev.readthedocs.io/\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimschneeb%2Frobomastercheatsheet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimschneeb%2Frobomastercheatsheet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimschneeb%2Frobomastercheatsheet/lists"}