Anki OVERDRIVE SDK

Nachdem ich das Anki OVERDRIVE Starter Kit und die ganzen Autos und Erweiterungen ausprobiert hatte, packte mich natürlich die Neugier eines Entwicklers. Der Anki Support hat mich mit vielen Informationen versorgt. Wie ich das Ganze mit dem Raspberry Pi verbinde und was noch damit möglich ist erkläre ich in diesem Beitrag.

Die Technik von Anki OVERDRIVE

Ein YouTube Video von Anki erklärt grob „Wie funktioniert Anki OVERDRIVE?“ Weiterführende Informationen und eine tiefer-gehende Erklärung sind dort aber nicht zu entnehmen. Die folgenden Angaben habe ich im Wesentlichen durch ein paar Experimente und Dokumentationen ermitteln können. Alle Aussagen ohne Gewähr 😉

Infrarot

Werden die Streckenteile unter Infrarotlicht gehalten, lässt sich die tatsächliche Magie der Fahrzeuge entdecken. Im Infrarotlicht tauchen Linien und Barcodes auf. Diese lesen die Autos mit ihren Kameras aus (laut Video 500x/sek.). Dabei scannt die Kamera auf der Unterseite die Fahrbahn und analysiert die Codes. Hinter dem Bardcode liegen Identifikationen und Informationen darüber, wie die Autos sich verhalten sollen im Bezug auf die Geschwindigkeit.

Kommunikation

Die Kommunikation mit den Autos funktioniert mittels Bluetooth. Die Anki Macher haben dazu ein SDK erstellt. Die Anki OVERDRIVE App spricht mit anderen Teilnehmern über die W-LAN Verbindung des Smartphones. Die tatsächliche Intelligenz des Spiel ist vollständig in der App abgebildet. Das SDK erlaubt rudimentäre Befehle wie das Wechseln der Spur und Drehungen. Alle Waffen und Upgrades existieren nur virtuell in der Applikation.

SDK und Raspberry Pi

Auf GitHub stellt Anki das anki/drive-sdk Repository bereit. Der dort enthaltende Code lässt sich auf einem Raspberry Pi kompilieren. Eine kurze Anleitung ist vorhanden. Mit Hilfe der Testprogramme konnte ich die Fahrzeuge scannen. Die hinterlegten Fahrzeuge sind aus dem alten Anki Set, die neuen OVERDRIVE IDs sind noch nicht codiert.

$ sudo ~/anki/drive-sdk/build/dist/bin/hciconfig hci0 up
$ sudo ~/anki/drive-sdk/build/dist/bin/vehicle-scan
LE Scan ...
C1:4A:82:93:CE:38 Drive [v266e] (Unknown cb02)
E5:A2:3D:0C:DB:82 Drive [v266e] (Unknown d8e0)

Der Erste Code ist von „Skull“, der zweite Eintrag ist bei mir „Ground Shock“. Eine Verbindung ist leider noch nicht möglich (dies liegt aber vermutlich an meiner Bluetooth Konfigurationen).

$ sudo ~/anki/drive-sdk/build/dist/bin/vehicle-tool --adapter=hci0 --device=E5:A2:3D:0C:DB:82
[E5:A2:3D:0C:DB:82][LE]> connect
Attempting to connect to E5:A2:3D:0C:DB:82
Error: connect: Connection refused (111)

Für die Analyse habe ich mir BlueZ selber gebaut.

sudo apt-get --purge remove bluez
sudo apt-get update
sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev
sudo wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.37.tar.xz
sudo tar xvf bluez-5.37.tar
cd bluez-5.37
sudo ./configure --disable-systemd
sudo make
sudo make install
sudo cp attrib/gatttool /usr/local/bin/
sudo reboot
$ sudo /etc/init.d/bluetooth stop
$ sudo ./bluez-5.37/tools/hciconfig hci0 up
$ sudo ./bluez-5.37/tools/hciconfig hci0

$ sudo ~/bluez-5.37/tools/hcitool lescan
E5:A2:3D:0C:DB:82 (unknown)
E5:A2:3D:0C:DB:82 n&    Drive
$ sudo ~/bluez-5.37/tools/hcitool  lecc E5:A2:3D:0C:DB:82
Could not create connection: Input/output error
$ sudo ~/bluez-5.37/attrib/gatttool -i hci0 -b C1:4A:82:93:CE:38 -t random -I
[C1:4A:82:93:CE:38][LE]> connect
Attempting to connect to C1:4A:82:93:CE:38
Error: connect: Connection refused (111)

MORE: COMING SOON! In diesem Artikel 🙂

Update: Artikel aus dem Netz zu der Technologie hinter Anki. Leider gibt es die Original Blogeinträge nicht mehr.

Patente für Anki, Inc. (Skizzen)

TNW News: Anki Drive reveals ‘secret’ about the track technology which guides its AI-controlled cars

VB: Anki Overdrive will overhaul the robot battle-car racing game with customizable tracks

TEST: ToDo: Neubau mit

http://stackoverflow.com/questions/32947807/cannot-connect-to-ble-device-on-raspberry-pi
I had to disable the plugin pnat in /etc/bluetooth/main.conf -> DisablePugins=pnat. I read that it's unstable, but I don't know much about this plugin.
Anki OVERDRIVE Strecken

Anki OVERDRIVE ist wohl DAS Weihnachtsgeschenk von 2015. Der Trend ist natürlich auch an mir nicht vorbei gegangen. In dieser kleinen Reihe schreibe ich über die ersten Experiment mit dem Anki OVERDRIVE Starter Kit und später der Entwickler SDK.

Die folgenden Strecken entstammen dem Starter Kit und einigen Erweiterungen. Nach diversen Kaufrunden sind auch alle Autos mittlerweile in meinem Besitz.

Kleiner Doppelkreis
Kleiner Doppelkreis
Doppelkreis Kreuzung
Doppelkreis Kreuzung
Beule
Beule
Zwei Ebenen
Zwei Ebenen
Große Kreise
Große Kreise

PowerShell Game 02

Spiele haben oft einige statische „Seiten“, Videos oder Bildschirmanzeigen. Auf diesen wird das Intro des PowerShell Game angezeigt, die Mitarbeiter, Danksagungen oder eine Abschiedsnachricht. Zur Darstellung von einfachen Texten können solche Inhalte in Textdateien abgelegt werden. PowerShell ermöglicht dann die Ausgabe mit einer Zeile Code.

Mit Hilfe eines ASCII Text Generators (Beispiel) habe ich eine Datei „start.txt“ und eine „quit.txt“ in einen Unterordner „screens“ abgelegt. Damit PowerShell die Dateien später in dem Unterordner findet, ist das Verzeichnis auf den Skriptordner zu setzen. Ein Leeren der Konsolenausgabe für einen frischen Start empfiehlt sich ebenso für das PowerShell Game.

# Verzeichnis in den Skriptordner wechseln
Set-Location $PSScriptRoot
# Ausgabe löschen
Clear-Host

Vor der Information, das Spiel mit q zu beenden, kommt der Start Bildschirm.

# Zeige Startbildschirm
Get-Content "screens/start.txt"

Nach dem Game-Loop wird die Verabschiedung angezeigt.

# Zeige Verabschiedung 
Get-Content "screens/quit.txt"

Beispiel – Startbildschirm

    +------------------------------------------------------------------------------+
    |   ____    ____      ____           _                                         |
    |  |  _ \  / ___|    |  _ \    ___  | |_   ___                                 |
    |  | |_) | \___ \    | |_) |  / _ \ | __| / __|                                |
    |  |  __/   ___) |   |  __/  |  __/ | |_  \__ \                                |
    |  |_|     |____/    |_|      \___|  \__| |___/                                |
    |                        /\                                                    |
    |                       /  \                                                   |
    |              /\      /    \                                                  |
    |             /  \    /      \        /\                                       |
    |            /    \  /        \      /  \                                      |
    |           /      \/          \    /    \                                     |
    |          /                    \  /      \        /\                          |
    |         /                      \/        \      /  \                         |
    |        /                _-_               \    /    \                        /
    |       /              /~~   ~~\             \  /      \                      /|
    |      /            /~~         ~~\           \/        \                    / |
    |     /            {               }                     \        /\        /  |
    |    /              \  _-     -_  /                /\     \      /  \      /   |
    |   /                 ~  \\ //  ~           /\    /  \     \    /    \    /    |
    |  /               _- -   | | _- _         /  \  /    \     \  /      \  /     |
    | /                  _ -  | |   -_        /    \/      \     \/        \/      |
    |/www.spech.de           // \\           /              \   (c) Sebastian Pech |
    /-----------------------//---\\---------/----------------\---------------------+
PowerShell Game 01

Die PowerShell Game Reihe soll als Basis dienen, einige Elemente (Game-Loop, Eingabe und Ausgabe, Darstellung von Maps, …) aus einfachen Spielen zu lernen. Mit der Hilfe der Windows PowerShell zeige ich Schrittweise die Entwicklung zu einem kleinen Rollenspiel mit süßen, fangbaren Monstern.

Zuerst wird eine Datei für das Spiel angelegt. Dateien bei der PowerShell enden auf „ps1“, es bietet sich also der Name „01_spiel_basis.ps1“ für unser PowerShell Game an.

Der folgende Codeabschnitt zeigt eine Schleife die solange aktiv ist bis der Benutzer ein q eingibt. Um Klein- und Großschreibung, sowie Leerzeichen zu behandeln wird die Eingabe bereinigt und zu Kleinbuchstaben umgewandelt.

# Variable zur Prüfung ob das Spiel noch laufen soll
$runGame = $true

# Informationen für den Benutzer ausgeben
Write-Host "Enter Q to exit game!"

# Der Game-Loop
while($runGame)
{
    # Benutzereingabe abfragen
    Write-Host "> " -NoNewline
    $action = Read-Host
    # Eingabe bereinigen
    $action = $action.Trim().ToLower()

    # Auf die Eingabe von q prüfen
    if($action -eq "q")
    {
        $runGame = $false;
    }
}

Ausführung bei Fehlern

Wird die PowerShell nicht als Administrator gestartet muss vor der Ausführung noch der folgende Befehl eingegeben werden, um die Ausführung von nicht signierten Skripten zu erlauben.

Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force

Danach wird das Skript der PowerShell Game aufgerufen.

.\01_spiel_basis.ps1
Raspberry Pi 2

Bei gleichem Preis bietet der neue Raspberry Pi 2 viermal mehr Kerne als der Raspberry Pi B+.

Neu

  • Vier CPU Kerne: Vermutlich ARM Cortex A7 – 900 MHz
  • 1 GB RAM (statt 512 MB)
  • Microsoft Windows 10 als unterstütztes OS

Identisch

  • Grafikkern (Videocore IV)
  • 100-MBit-Ethernet-Port
  • USB 2.0
  • Formfaktor
  • PREIS

Laut Golem.de „soll [der Raspberry Pi 2] ab sofort erhältlich sein. Upton verspricht, dass bereits 100.000 Stück fertig sind und weitere bereits produziert werden.“

Offizielle Seite: raspberrypi.org

Quelle: Golem.de