[PYTHON] Cours ROS 105 Fonctionnement toio avec ROS

environnement

Cet article fonctionne dans l'environnement suivant.

article valeur
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic

Pour l'installation, reportez-vous à ROS Course 02 Installation. Le programme de cet article a également été téléchargé sur github. Veuillez vous référer au Référentiel git du cours 11 ROS.

Aperçu

Un jouet appelé toio a été publié par le SIE. La plus grande caractéristique de ceci est que vous pouvez obtenir la position et l'angle du cube central de toio sur le tapis de jeu. De nos jours, de nombreux jouets ont des pneus et fonctionnent seuls, mais il est rare qu'ils puissent prendre leur propre position. De plus, Spécifications a été publié afin de pouvoir être utilisé avec scratch. Je ne peux utiliser que ROS, alors rendons possible le fonctionnement à partir de ROS.

À propos de Bluetooth (basique)

toio communique avec Bluetooth Low Energy (BLE). J'écrirai brièvement les connaissances de base pour la communication.

Tout d'abord, Bluetooth a été ajouté à partir de Bluetooth Basic Rate / Enhanced Data Rate (BR / EDR) et ver4. Il existe deux types: Bluetooth Low Energy (LE). Ces deux types sont différents sauf que le matériel sans fil est commun. La plupart des appareils traditionnels tels que les écouteurs sans fil utilisent le protocole ER / EDR. D'autre part, LE est utilisé pour des applications telles que toio qui envoient des données relativement petites par intermittence.

BLE (Bluetooth Low Energy) a deux configurations de réseau, diffusion et connexion. La diffusion est utilisée pour la communication avec un nombre non spécifié d'expéditeurs et de destinataires, comme la balise. Une connexion communique avec plusieurs périphériques reliés à une centrale. Chaque appareil Bluetooth a une adresse matérielle unique. Le dongle bluetooth est également attaché à toio, et il est utilisé pour spécifier un périphérique bluetooth spécifique. Cela fait 6 octets et s'écrit "11: 22: 33: 44: 55: 66".

Les périphériques BLE disposent de plusieurs services, dont certains sont caractéristiques. Par exemple, toio Core Cube a un service avec l'UUID de service "10B20100-5B3B-4571-9508-CF3EFCD7BBAE". Il y a. Dans ce service, le capteur de lecture a un UUID caractéristique appelé "10B20101-5B3B-4571-9508-CF3EFCD7BBAE".

Il n'y a que trois types d'accès aux données BLE

Les données ici sont un tableau de uint8.

Résumé Donc pour que ubuntu et toio communiquent

Cela devient la procédure.

À propos de Bluetooth (pratique)

Faisons ce qui précède.

Confirmation du dongle Bluetooth

Cette fois, le dongle Bluetooth l'a utilisé. Dans certains cas, BR / EDR peut être utilisé mais BLE ne peut pas être utilisé avec le PC intégré. Il est bon d'acheter un dongle en option. hciconfig affichera la liste des périphériques Bluetooth. Seuls le dongle coincé dans le PC et le récepteur Bluetooth intégré sont affichés ici.

Confirmation du dongle Bluetooth


$ 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 des appareils BLE

Vous verrez une liste des appareils Bluetooth à proximité comme celui-ci. Allumez toio et exécutez la commande suivante. Notez l'adresse HW de toio. Vous pouvez l'arrêter avec Ctrl + C.

Scan des appareils BLE


$ sudo hcitool -i hci0 lescan
LE Scan ...
XX:XX:XX:XX:XX:XX (unknown)
XX:XX:XX:XX:XX:XX toio Core Cube
...
(Suite ci-dessous)

Si vous obtenez ici l'option `` Set scan parameters failed: Input / output error '', l'appareil ne prend pas en charge BLE. Les privilèges root ne sont requis que lors de l'analyse des périphériques de cette manière.

Commencez à vous connecter avec toio

Nous utilisons gatttool, un outil qui échange des données avec BLE. Commencez par la commande suivante. Pour XX: XX: XX: XX: XX: XX, entrez l'adresse matérielle de toio obtenue par le lescan ci-dessus.

Commencez à vous connecter avec toio


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

connect Établissez la connexion réelle. Si c'est normal, vous entendrez un son de connexion de toio.

Commencez à vous connecter avec toio


[XX:XX:XX:XX:XX:XX][LE]> connect
[XX:XX:XX:XX:XX:XX][LE]>            # <-La couleur vire au bleu

Acquisition de service caractristique

Obtenez la liste des caractéristiques de toio. Voir spécifications toio pour voir ce qui correspond à quoi.

Obtenez la caractéristique


[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
...
(Suite ci-dessous)

Lecture charactualiste

Voyons le bouton ON / OFF comme un essai. Essayez-le en appuyant sur le bouton de la lampe.

Lecture caractéristique


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

Lorsqu'elle est enfoncée, la deuxième valeur devient «80», et lorsqu'elle est relâchée, elle devient «00».

Écriture caractéristique

L'écriture caractéristique est spécifiée dans le gestionnaire comme suit. Dans la liste qui apparaît avec char-desc 0x0b000b ci-dessus, la poignée de 10B20103-5B3B-4571-9508-CF3EFCD7BBAE qui contrôle la couleur de la lampe est 0x0014, alors utilisez ceci. La lampe devient blanche avec la commande suivante.

Lecture caractéristique


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

Déconnexion avec toio

Déconnexion avec toio


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

Comment utiliser bluepy

Cette fois, nous utiliserons une bibliothèque python appelée bluepy.

Installation

sudo pip install bluepy

Connexion et lecture / écriture

Connexion de base et méthode de lecture / écriture des données.

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

Comment utiliser notifier

Dans la lecture de l'exemple ci-dessus, les données sont lues au moment du programme, mais il est notifié que la valeur est renvoyée depuis le périphérique chaque fois que la valeur est mise à jour dans le périphérique.

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

résultat


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

Utilisation de ros

Code source

Je vais mettre le code source ci-dessous. toio_bridge.py

Courir

L'adresse mac est spécifiée dans le lancement ci-dessous. Il doit être réécrit.

roslaunch toio_lecture with_kicker.launch

toio3.gif

Pour connecter plusieurs unités

Vous pouvez vous connecter à plusieurs toio en lançant plusieurs toio_bridges lors du lancement ci-dessus. Cependant, le phénomène de notification arrive avec un retard d'un peu moins d'une maladie se produit toujours dans le toio connecté plus tard. Pour l'instant, la solution de contournement est d'avoir autant de dongle bluetooth qu'il y a de toio et d'attribuer un dongle bluetooth différent à chaque toio_bridge. Un exemple de code peut être trouvé sur dual.launch.

référence

Introduction à BLE Comment utiliser les commandes liées à ble Comment utiliser bluepy spécifications toio core cube

Lien vers la page du tableau

Lien vers la table des matières du cours ROS

Recommended Posts

Cours ROS 105 Fonctionnement toio avec ROS
Cours ROS 105 Fonctionnement toio avec ROS
Cours ROS 108 Utilisation de la base de données (mongo) avec ROS
Conférence ROS 113 Effectuer des tâches avec smach
Utiliser Kinesis avec Python
Faire fonctionner Blender avec Python
Utiliser Excel avec Python (1)
Utiliser Excel avec Python (2)
Exploitez Excel avec Python open pyxl
Faire fonctionner le conteneur Db2 avec Go
[Note] Faites fonctionner MongoDB avec Python
Travailler avec des sites Web à l'aide de Python_Webbrowser
[Python] [SQLite3] Exploiter SQLite avec Python (basique)
Utilisez Nutanix avec l'API REST, partie 2
Faites fonctionner l'imprimante de reçus avec python
Cours ROS 108 Utilisation de la base de données (mongo) avec ROS
Conférence ROS 113 Effectuer des tâches avec smach
Essayez d'exploiter Facebook avec Python
Faites fonctionner les appareils électroménagers ECHONET Lite avec Python
Exploitez Maya avec OSC depuis vvvv
Exploitez l'espace de noms réseau Linux avec Go