[PYTHON] ROS Kurs 105 Betriebstio mit ROS

Umgebung

Dieser Artikel funktioniert in der folgenden Umgebung.

Artikel Wert
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic

Informationen zur Installation finden Sie unter ROS-Kurs 02-Installation. Das Programm in diesem Artikel wurde ebenfalls auf github hochgeladen. Weitere Informationen finden Sie im ROS Lecture 11 Git Repository.

Überblick

Ein Spielzeug namens toio wurde von SIE veröffentlicht. Das größte Merkmal davon ist, dass Sie die Position und den Winkel von Toios Kernwürfel auf der Spielmatte erhalten können. Es gibt heutzutage viele Spielzeuge, die Reifen haben und alleine laufen, aber es kommt selten vor, dass sie ihre eigene Position einnehmen können. Darüber hinaus wurde Technische Daten veröffentlicht, damit es mit Scratch betrieben werden kann. Ich kann nur ROS verwenden, also machen wir es möglich, von ROS aus zu arbeiten.

Über Bluetooth (Basic)

toio kommuniziert mit Bluetooth Low Energy (BLE). Ich werde kurz das Grundwissen für die Kommunikation aufschreiben.

Zunächst wurde Bluetooth von Bluetooth Basic Rate / Enhanced Data Rate (BR / EDR) und ver4 hinzugefügt. Es gibt zwei Arten: Bluetooth Low Energy (LE). Diese beiden Typen unterscheiden sich mit der Ausnahme, dass die drahtlose Hardware üblich ist. Die meisten herkömmlichen Geräte wie drahtlose Kopfhörer verwenden das ER / EDR-Protokoll. Andererseits wird LE für Anwendungen wie toio verwendet, die zeitweise relativ kleine Daten senden.

BLE (Bluetooth Low Energy) verfügt über zwei Netzwerkkonfigurationen: Broadcast und Verbindung. Broadcast wird für die Kommunikation mit einer nicht festgelegten Anzahl von Sendern und Empfängern verwendet, z. B. Beacon. Eine Verbindung kommuniziert mit mehreren Peripheriegeräten, die mit einer Zentrale verbunden sind. Jedes Bluetooth-Gerät hat eine eindeutige HW-Adresse. Der Bluetooth-Dongle ist ebenfalls an toio angeschlossen und wird zur Angabe eines bestimmten Bluetooth-Geräts verwendet. Dies sind 6 Bytes und wird als "11: 22: 33: 44: 55: 66" geschrieben.

BLE-Peripheriegeräte verfügen über mehrere Dienste, von denen einige charakteristisch sind. Beispielsweise verfügt toio Core Cube über einen Dienst mit der Dienst-UUID "10B20100-5B3B-4571-9508-CF3EFCD7BBAE". Es gibt. In diesem Dienst verfügt der Lesesensor über eine charakteristische UUID mit der Bezeichnung "10B20101-5B3B-4571-9508-CF3EFCD7BBAE".

Es gibt nur drei Arten des BLE-Datenzugriffs

Die Daten hier sind ein Array von uint8.

Zusammenfassung Damit Ubuntu und Toio miteinander kommunizieren können

Es wird zum Verfahren.

Über Bluetooth (Übung)

Lassen Sie uns das oben genannte tun.

Bestätigung des Bluetooth-Dongles

Diesmal hat der Bluetooth-Dongle dies verwendet. In einigen Fällen kann BR / EDR verwendet werden, BLE kann jedoch nicht mit dem eingebauten PC verwendet werden. Es ist gut, einen optionalen Dongle zu kaufen. hciconfig zeigt die Bluetooth-Geräteliste an. Hier werden nur der im PC steckende Dongle und der eingebaute Bluetooth-Empfänger angezeigt.

Bestätigung des Bluetooth-Dongles


$ hciconfig
hci0:	Type: BR/EDR  Bus: USB
	BD Address: XX:XX:XX:XX:XX:XX  ACL MTU: 8192:128  SCO MTU: 64:128
	UP RUNNING 
	RX bytes:539 acl:0 sco:0 events:28 errors:0
	TX bytes:860 acl:0 sco:0 commands:28 errors:0

Scan von BLE-Geräten

Sie sehen eine Liste solcher Bluetooth-Geräte in der Nähe. Schalten Sie toio ein und führen Sie den folgenden Befehl aus. Notieren Sie sich die HW-Adresse von toio. Sie können es mit Strg + C stoppen.

Scan von BLE-Geräten


$ sudo hcitool -i hci0 lescan
LE Scan ...
XX:XX:XX:XX:XX:XX (unknown)
XX:XX:XX:XX:XX:XX toio Core Cube
...
(Fortsetzung unten)

Wenn hier "Scan-Parameter einstellen fehlgeschlagen: Eingabe- / Ausgabefehler" angezeigt wird, unterstützt das Gerät BLE nicht. Root-Berechtigungen sind nur erforderlich, wenn Geräte auf diese Weise gescannt werden.

Verbinde dich mit toio

Wir verwenden gatttool, ein Tool, das Daten mit BLE austauscht. Beginnen Sie zunächst mit dem folgenden Befehl. Geben Sie für XX: XX: XX: XX: XX: XX die von lescan oben angegebene HW-Adresse von toio ein.

Verbinde dich mit toio


$ gatttool -b XX:XX:XX:XX:XX:XX -t random -I
[XX:XX:XX:XX:XX:XX][LE]> 

connect Stellen Sie die eigentliche Verbindung her. Wenn es normal ist, hören Sie einen Verbindungston von toio.

Verbinde dich mit toio


[XX:XX:XX:XX:XX:XX][LE]> connect
[XX:XX:XX:XX:XX:XX][LE]>            # <-Die Farbe wird blau

Erwerb von Servicecharakteristika

Holen Sie sich die Liste der Eigenschaften, die toio hat. Siehe toio-Spezifikationen, um zu sehen, welche was entspricht.

Holen Sie sich charakteristisch


[XX:XX:XX:XX:XX:XX][LE]> char-desc 0x0b000b
handle: 0x0001, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x0002, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
...
(Fortsetzung unten)

Charactualistic lesen

Lassen Sie uns den Knopf EIN / AUS als Versuch sehen. Probieren Sie es aus, während Sie die Taste an der Lampe drücken.

Charakteristische Lektüre


[XX:XX:XX:XX:XX:XX][LE]> char-read-uuid 10B20107-5B3B-4571-9508-CF3EFCD7BBAE
handle: 0x001e 	 value: 01 80 

Beim Drücken wird der zweite Wert zu "80" und beim Loslassen zu "00".

Charakteristisches Schreiben

Das charakteristische Schreiben wird im Handler wie folgt angegeben. In der Liste, die oben mit "char-desc 0x0b000b" angezeigt wird, lautet das Handle von "10B20103-5B3B-4571-9508-CF3EFCD7BBAE", das die Farbe der Lampe steuert, "0x0014". Verwenden Sie dies also. Die Lampe leuchtet mit dem folgenden Befehl weiß.

Charakteristische Lektüre


[XX:XX:XX:XX:XX:XX][LE]> char-write-cmd 0x0014 03000101808080

Trennung mit toio

Trennung mit toio


[XX:XX:XX:XX:XX:XX][LE]> disconnect

Wie benutzt man Bluepy?

Dieses Mal werden wir eine Python-Bibliothek namens bluepy verwenden.

Installation

sudo pip install bluepy

Verbindung und Lesen / Schreiben

Grundlegende Verbindung und Datenlese- / Schreibmethode.

toio_lecture/script/toio_basic1.py


#!/usr/bin/python
# -*- coding: utf-8 -*- 

from bluepy import btle
import sys

LAMP_HANDLE = 20
BATTERY_HANDLE = 34

if len(sys.argv) != 2:
    print("1 argument (mac address of toio) is nessesary")
    sys.exit( )

# connect
toio_peripheral = btle.Peripheral(sys.argv[1], btle.ADDR_TYPE_RANDOM, 1)

# read battery status
print("battery", ord(toio_peripheral.readCharacteristic(BATTERY_HANDLE)))

# write lamp
data = [3, 0, 1, 1, 200, 50, 50]
toio_peripheral.writeCharacteristic(LAMP_HANDLE, bytearray(data), True)

toio1.png

Verwendung von notify

Beim Lesen des obigen Beispiels werden die Daten zum Zeitpunkt der Programmseite gelesen, es wird jedoch mitgeteilt, dass der Wert jedes Mal vom Gerät ausgegeben wird, wenn der Wert im Gerät aktualisiert wird.

toio_lecture/script/toio_basic2.py


#!/usr/bin/python
# -*- coding: utf-8 -*- 

from bluepy import btle
import sys

BATTERY_HANDLE = 34

class MyDelegate(btle.DefaultDelegate):
    def __init__(self):
        btle.DefaultDelegate.__init__(self)
        print("set delegate")

    def handleNotification(self, cHandle, data):
        print("callback")
        if(cHandle == BATTERY_HANDLE):
            print("battery", ord(data))

if len(sys.argv) != 2:
    print("1 argument (mac address of toio) is nessesary")
    sys.exit( )

# connect
toio_peripheral = btle.Peripheral(sys.argv[1], btle.ADDR_TYPE_RANDOM, 1)

# set delegate
toio_peripheral.withDelegate(MyDelegate())

# set notify
toio_peripheral.writeCharacteristic(BATTERY_HANDLE+1, b'\x01', True)

try:
    while True:
        TIMEOUT = 0.1
        toio_peripheral.waitForNotifications(TIMEOUT)
except KeyboardInterrupt:
    None

Ergebnis


set delegate
callback
('battery', 90)
callback
('battery', 90)
callback
('battery', 90)

Verwenden Sie von Ros

Quellcode

Ich werde den Quellcode unten setzen. toio_bridge.py

Lauf

Die Mac-Adresse wird beim Start unten angegeben. Es muss neu geschrieben werden.

roslaunch toio_lecture with_kicker.launch

toio3.gif

Zum Anschluss mehrerer Geräte

Sie können eine Verbindung zu mehreren toio herstellen, indem Sie beim obigen Start mehrere toio_bridges starten. Das Phänomen der Benachrichtigung tritt jedoch immer mit einer Verzögerung von etwas weniger als einer Krankheit in dem später verbundenen Toio auf. Im Moment besteht die Problemumgehung darin, so viele Bluetooth-Dongles wie toio zu haben und jedem toio_bridge einen anderen Bluetooth-Dongle zuzuweisen. Beispielcode finden Sie unter dual.launch.

Referenz

Einführung in BLE Verwendung von ble-bezogenen Befehlen Verwendung von bluepy toio core cube-Spezifikationen

Link zur Tabellenseite

Link zum Inhaltsverzeichnis des ROS-Kurses

Recommended Posts

ROS Kurs 105 Betriebstio mit ROS
ROS Kurs 105 Betriebstio mit ROS
ROS Lecture 113 Führen Sie Aufgaben mit smach aus
Kinesis mit Python betreiben
Betreiben Sie Blender mit Python
Betreiben Sie Excel mit Python (1)
Betreiben Sie Excel mit Python (2)
Betreiben Sie Excel mit Python Open Pyxl
Betreiben Sie den Db2-Container mit Go
[Hinweis] Betreiben Sie MongoDB mit Python
Arbeiten Sie mit Websites mit Python_Webbrowser
[Python] [SQLite3] Betreiben Sie SQLite mit Python (Basic)
Betreiben Sie Nutanix mit der REST-API Teil 2
Bedienen Sie den Belegdrucker mit Python
ROS Lecture 113 Führen Sie Aufgaben mit smach aus
Versuchen Sie, Facebook mit Python zu betreiben
Betreiben Sie ECHONET Lite-Haushaltsgeräte mit Python
Betreiben Sie Maya mit OSC von vvvv
Betreiben Sie den Linux-Netzwerk-Namespace mit Go