タグアーカイブ ROS

著者:yamamoto.yosuke

SwitchBot を ROS から利用する – データ取得デバイスの追加方法

本シリーズ前回の記事 SwitchBot を ROS から利用する – データ取得編 掲載以降,手元にある SwitchBot デバイスの種類が増えてきました.

そこで今回の記事では switchbot_ros でまだ対応していないデバイスのデータを取得・パブリッシュするためにコードを追加する様子を紹介します.追加例としてデバイス「SwitchBot CO2センサー(温湿度計)」のデータを取得して ROS Topic としてパブリッシュできるようにします.

SwitchBot API の確認

追加したいデバイスが SwitchBot API で対応していないと switchbot_ros 側でも対応はできないので最初に SwitchBot API のドキュメントを調べます.

SwitchBot API v1.1 ドキュメント にデバイスのリスト取得とステータス取得の項目に「Meter Pro CO2」の記述があり,これが今回追加してみたデバイス「SwitchBot CO2センサー(温湿度計)」に対応したものとなっていました.

制御コマンドの一覧には CO2 センサーらしき記述が(少なくとも本記事執筆時には)ありませんので「SwitchBot CO2センサー(温湿度計)」には取得系コマンドのみが対応していて,制御系コマンドは無いようです.

SwitchBot API ドキュメントにある「SwitchBot CO2センサー(温湿度計)」のステータス取得で返されるデータの表を下に抜粋しましたので確認してみます.

Meter Pro CO2

Key Value Type Description
deviceId String device ID
deviceType String device type. MeterPro(CO2)
hubDeviceId String device’s parent Hub ID
battery Integer the current battery level, 0-100
version String the current firmware version, e.g. V4.2
temperature Float temperature in celsius
humidity Integer humidity percentage
CO2 Integer CO2 ppm value, 0-9999

二酸化炭素濃度が単位 [ppm](百万分率)で範囲 0〜9999 の整数型データとして返されることが分かります.他は SwitchBot の温湿度計と同じように各測定値が得られるようです.

switchbot_ros への機能追加

switchbot_ros に機能追加したいデバイス「SwitchBot CO2センサー(温湿度計)」について SwitchBot API が対応していることと API により取得できる測定値が分かりましたので実装してゆきます.もう少し具体化すると「SwitchBot CO2センサー(温湿度計)」から API 経由で得られた

  • 温度
  • 湿度
  • バッテリーレベル
  • CO2濃度

の4つの値を ROS Topic としてパブリッシュします.

SwitchBot API によるデータの取得と ROS Topic のパブリッシュプロセスは switchbot_ros にある既存のルーチンをそのまま利用できますので今回新たに実装する部分は大まかには次の2つです.

  • 「SwitchBot CO2センサー(温湿度計)」に対応したメッセージ型の定義
  • 「SwitchBot CO2センサー(温湿度計)」メッセージ型に取得データを代入

先に結論としてコードの追加部分を下に記載してしまいます.ファイルとしては3点,追加箇所としては5点です.

  1. switchbot_ros / msg / MeterProCO2.msg (ファイル追加)
    • 「SwitchBot CO2センサー(温湿度計)」に対応したメッセージ型の定義
  2. switchbot_ros / CMakeLists.txt (記述追加)
    • MeterProCO2.msg の add_message_files() への追加
  3. switchbot_ros / scripts / switchbot_status_publisher.py (記述追加)
    • インポートクラス MeterProCO2 の追加
    • パブリッシャーのメッセージクラス設定においてデバイスタイプ MeterPro(CO2) の場合のメッセージクラス MeterProCO2 を追加
    • MeterProCO2 の場合のメッセージクラス各要素への取得データ代入処理の追加

追加デバイス用メッセージの定義

今回追加する「SwitchBot CO2センサー(温湿度計)」に対応したメッセージ型 MeterProCO2.msg を定義します.

パブリッシュする4つのデータ「温度」「湿度」「バッテリーレベル」「CO2濃度」のうち3つ 温度,湿度,バッテリーレベル は Meter.msg と同じなので Meter.msg を複製してファイル名を MeterProCO2.msg に変更して CO2濃度 のデータ型を追加する方法で作成しました.

switchbot_ros / msg / MeterProCO2.msg

Header  header       # timestamp

float64 temperature  # temperature in celsius
float64 humidity     # humidity percentage
float64 battery      # the current battery level, 0-100

int64   co2ppm       # CO2 ppm value, 0-9999

新しいメッセージ型を定義した場合はパッケージの CMakeLists.txt 内の add_message_files() に追記する必要があります.

switchbot_ros / CMakeLists.txt

add_message_files(
  FILES
  Device.msg
  DeviceArray.msg
  Meter.msg
  MeterProCO2.msg
  PlugMini.msg
  Hub2.msg
  Bot.msg
  StripLight.msg
)

追加デバイス対応プログラムコード更新

新しいメッセージ型 MeterProCO2.msg の準備ができましたので取得データの代入などの機能をパブリッシャーの Python のプログラムファイル switchbot_ros / scripts / switchbot_status_publisher.py に追加記述します.

追加した MeterProCO2.msg を switchbot_status_publisher.py 内で利用するためにメッセージクラス MeterProCO2import しておきます.

switchbot_ros / scripts / switchbot_status_publisher.py

#!/usr/bin/env python

import os.path
from requests import ConnectionError
import rospy
from switchbot_ros.switchbot import SwitchBotAPIClient
from switchbot_ros.switchbot import DeviceError, SwitchBotAPIError
from switchbot_ros.msg import Meter, PlugMini, Hub2, Bot, StripLight, MeterProCO2

初期化関数定義 def __init__(self): 内のパブリッシャーのメッセージクラス設定を行う部分にデバイスタイプ MeterPro(CO2) の場合の条件分岐を追加して MeterProCO2 をメッセージクラスとして設定します.

switchbot_ros / scripts / switchbot_status_publisher.py

        # Publisher Message Class for each device type
        if self.device_type == 'Remote':
            rospy.logerr('Device Type: "' + self.device_type + '" has no status in specifications.')
            return
        else:
            if self.device_type == 'Meter':
                self.msg_class = Meter
            elif self.device_type == 'MeterPlus':
                self.msg_class = Meter
            elif self.device_type == 'WoIOSensor':
                self.msg_class = Meter
            elif self.device_type == 'Hub 2':
                self.msg_class = Hub2
            elif self.device_type == 'Plug Mini (JP)':
                self.msg_class = PlugMini
            elif self.device_type == 'Plug Mini (US)':
                self.msg_class = PlugMini
            elif self.device_type == 'Bot':
                self.msg_class = Bot
            elif self.device_type == 'Strip Light':
                self.msg_class = StripLight
            elif self.device_type == 'MeterPro(CO2)':
                self.msg_class = MeterProCO2
            else:
                rospy.logerr('No publisher process for "' + self.device_type + '" in switchbot_status_publisher.py')
                return

繰り返し関数定義 def spin(self): 内のパブリッシュするメッセージクラスごとの場合分けに MeterProCO2 を追加して SwitchBot API により取得した各データを MeterProCO2 メッセージの各要素に代入します.

switchbot_ros / scripts / switchbot_status_publisher.py

                if status:
                    time = rospy.get_rostime()
                    if self.msg_class == Meter:
                        msg = Meter()
                        msg.header.stamp = time
                        msg.temperature  = status['temperature']
                        msg.humidity     = status['humidity']
                        msg.battery      = status['battery']
                    elif self.msg_class == Hub2:
                        msg = Hub2()
                        msg.header.stamp = time
                        msg.temperature  = status['temperature']
                        msg.humidity     = status['humidity']
                        msg.light_level  = status['lightLevel']
                    elif self.msg_class == PlugMini:
                        msg = PlugMini()
                        msg.header.stamp = time
                        msg.voltage      = status['voltage']
                        msg.weight       = status['weight']
                        msg.current      = status['electricCurrent']
                        msg.minutes_day  = status['electricityOfDay']
                    elif self.msg_class == Bot:
                        msg = Bot()
                        msg.header.stamp = time
                        msg.battery      = status['battery']
                        if status['power'] == 'on':
                            msg.power    = True
                        else:
                            msg.power    = False
                        msg.device_mode  = status['deviceMode']
                    elif self.msg_class == StripLight:
                        msg = StripLight()
                        msg.header.stamp = time
                        if status['power'] == 'on':
                            msg.power    = True
                        else:
                            msg.power    = False
                        msg.brightness   = status['brightness']
                        rgb_string       = status['color']
                        r, g, b = map(int, rgb_string.split(':'))
                        msg.color_r      = r
                        msg.color_g      = g
                        msg.color_b      = b
                    elif self.msg_class == MeterProCO2:
                        msg = MeterProCO2()
                        msg.header.stamp = time
                        msg.temperature  = status['temperature']
                        msg.humidity     = status['humidity']
                        msg.battery      = status['battery']
                        msg.co2ppm       = status['CO2']
                    else:
                        return

今回の「SwitchBot CO2センサー(温湿度計)」のデータ取得とその ROS Topic へのパブリッシュに関するファイルの追加・コード変更は以上です.

ビルドと環境設定

今回の変更で新しいメッセージ型を定義して導入していますのでパッケージのビルドを行い,環境設定を改めて行います.

switchbot_ros を含む jsk_3rdparty のビルド

$ source /opt/ros/noetic/setup.bash
$ cd ~/switchbot_ws
$ catkin build
$ source ~/switchbot_ws/devel/setup.bash

switchbot_ros に追加した機能の動作確認

まず利用可能な SwitchBot デバイス名リストを取得・確認してから,得られた新規追加したデバイス名を指定して SwitchBot デバイスのステータスデータの取得と ROS Topic へのパブリッシュを行い,実際にパブリッシュされているかを ROS Topic を表示して確認します.

実行方法は今回機能追加するより前の方法と同じで,launch 時にオプション指定するデバイス名を変えるだけです.

利用可能な SwitchBot デバイス名の取得

ターミナル 1 : switchbot_ros の実行

SwitchBot API 経由で今回追加した「SwitchBot CO2センサー(温湿度計)」の「デバイス名」と「デバイスタイプ」が取得できることを確認します.ユーザの SwitchBot アカウントで登録されているデバイスの「デバイス名」と「デバイスタイプ」は switchbot.launch を実行すると表示されます.

(下記 launch オプションの YOUR_TOKENYOUR_SECRET をそれぞれユーザアカウントのトークンとシークレットに置き換えて実行)

switchbot.launch 実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ roslaunch switchbot_ros switchbot.launch token:=YOUR_TOKEN secret:=YOUR_SECRET

switchbot.launch 実行出力例

... logging to /home/robotuser/.ros/log/999f113c-b07d-11ef-9b82-a11b8fd4bdd2/roslaunch-robotuser-PC-7718.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://robotuser-PC:43087/

SUMMARY
========

PARAMETERS
 * /rosdistro: noetic
 * /rosversion: 1.17.0
 * /switchbot_ros/secret: (シークレットの上位数桁が表示)...
 * /switchbot_ros/token: (トークンの上位数桁が表示)...

NODES
  /
    switchbot_ros (switchbot_ros/switchbot_ros_server.py)

auto-starting new master
process[master]: started with pid [7726]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 999f113c-b07d-11ef-9b82-a11b8fd4bdd2
process[rosout-1]: started with pid [7736]
started core service [/rosout]
process[switchbot_ros-2]: started with pid [7743]
[INFO] [1733123900.102425]: Switchbot API Client initialized.
[INFO] [1733123900.104175]: Using SwitchBot API v1.1
[INFO] [1733123900.106131]: Switchbot Device List:
9 Item(s)
deviceName: bot74a, deviceID: (固有のID番号が表示), deviceType: Bot
deviceName: cam-entrance01, deviceID: (固有のID番号が表示), deviceType: None
deviceName: co2sensor-ba1, deviceID: (固有のID番号が表示), deviceType: MeterPro(CO2)
deviceName: hub2a, deviceID: (固有のID番号が表示), deviceType: Hub 2
deviceName: plugmini7a1, deviceID: (固有のID番号が表示), deviceType: Plug Mini (JP)
deviceName: remote-button10a, deviceID: (固有のID番号が表示), deviceType: Remote
deviceName: tapelight7a1, deviceID: (固有のID番号が表示), deviceType: Strip Light
deviceName: thermo-hygrometer-f7a, deviceID: (固有のID番号が表示), deviceType: Meter
deviceName: trackcard01, deviceID: (固有のID番号が表示), deviceType: None

[INFO] [1733123900.107799]: Switchbot Remote List:
2 Item(s)
deviceName: air-conditioner, deviceID: (固有のID番号が表示), remoteType: Air Conditioner
deviceName: pendant-light, deviceID: (固有のID番号が表示), remoteType: DIY Light

[INFO] [1733123900.109488]: Switchbot Scene List:
2 Item(s)
sceneName: turnoff-all-lights, sceneID: (固有のID番号が表示)
sceneName: turnon-all-lights, sceneID: (固有のID番号が表示)

[INFO] [1733123900.139015]: Ready.

追加した「SwitchBot CO2センサー(温湿度計)」のデバイス名 co2sensor-ba1 がコンソール出力されたので一旦 Ctrl-C にて switchbot.launch を終了します.

SwitchBot デバイスのステータスデータの取得・パブリッシュ

「SwitchBot CO2センサー(温湿度計)」のステータスデータを取得してパブリッシュされている ROS Topic を表示して確認してみます.前述の switchbot.launch の実行出力例からデバイス名が co2sensor-ba1 となっています.

ステータスデータを取得する場合は switchbot.launch 実行時に次の2つのオプションを追加します.

  • pub_status:=true ステータスを取得・パブリッシュを実行するオプション true/false
  • pub_device_name:= デバイス名の指定(今回の例 co2sensor-ba1

ターミナル 1 : switchbot_ros の実行

switchbot.launch 実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ roslaunch switchbot_ros switchbot.launch token:=YOUR_TOKEN secret:=YOUR_SECRET pub_status:=true pub_device_name:=co2sensor-ba1 pub_status_rate:=0.016666
  • 注1) 上記テキストボックスの横スクロールで全 launch オプションが表示されます.
  • 注2) 各 launch オプションについて
    • YOUR_TOKENYOUR_SECRET は各々の SwitchBot アカウントのトークンとシークレットに置き換えて実行してください.
    • pub_status:=true でステータスを取得・パブリッシュを実行します.
    • pub_device_name:=co2sensor-ba1co2sensor-ba1 は各ユーザ利用のデバイス名に変更してください.
    • pub_status_rate:=0.016666 でステータスを取得・パブリッシュする周波数 [Hz] を設定します.(本例では 0.016666[Hz] = 約60秒に1回)

switchbot.launch 実行出力例

... logging to /home/robotuser/.ros/log/e454822a-b07d-11ef-9b82-a11b8fd4bdd2/roslaunch-robotuser-PC-7804.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://robotuser-PC:36557/

SUMMARY
========

PARAMETERS
 * /rosdistro: noetic
 * /rosversion: 1.17.0
 * /switchbot_ros/secret: (シークレットの上位数桁が表示)...
 * /switchbot_ros/token: (トークンの上位数桁が表示)...
 * /switchbot_status_publisher/device_name: co2sensor-ba1
 * /switchbot_status_publisher/rate: 0.016666
 * /switchbot_status_publisher/secret: (シークレットの上位数桁が表示)...
 * /switchbot_status_publisher/token: (トークンの上位数桁が表示)...

NODES
  /
    switchbot_ros (switchbot_ros/switchbot_ros_server.py)
    switchbot_status_publisher (switchbot_ros/switchbot_status_publisher.py)

auto-starting new master
process[master]: started with pid [7812]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to e454822a-b07d-11ef-9b82-a11b8fd4bdd2
process[rosout-1]: started with pid [7822]
started core service [/rosout]
process[switchbot_ros-2]: started with pid [7829]
process[switchbot_status_publisher-3]: started with pid [7830]
[INFO] [1733124025.952044]: Switchbot API Client initialized.
[INFO] [1733124025.953872]: Using SwitchBot API v1.1
[INFO] [1733124025.955817]: Switchbot Device List:
9 Item(s)
deviceName: bot74a, deviceID: (固有のID番号が表示), deviceType: Bot
deviceName: cam-entrance01, deviceID: (固有のID番号が表示), deviceType: None
deviceName: co2sensor-ba1, deviceID: (固有のID番号が表示), deviceType: MeterPro(CO2)
deviceName: hub2a, deviceID: (固有のID番号が表示), deviceType: Hub 2
deviceName: plugmini7a1, deviceID: (固有のID番号が表示), deviceType: Plug Mini (JP)
deviceName: remote-button10a, deviceID: (固有のID番号が表示), deviceType: Remote
deviceName: tapelight7a1, deviceID: (固有のID番号が表示), deviceType: Strip Light
deviceName: thermo-hygrometer-f7a, deviceID: (固有のID番号が表示), deviceType: Meter
deviceName: trackcard01, deviceID: (固有のID番号が表示), deviceType: None

[INFO] [1733124025.957387]: Switchbot Remote List:
2 Item(s)
deviceName: air-conditioner, deviceID: (固有のID番号が表示), remoteType: Air Conditioner
deviceName: pendant-light, deviceID: (固有のID番号が表示), remoteType: DIY Light

[INFO] [1733124025.959085]: Switchbot Scene List:
2 Item(s)
sceneName: turnoff-all-lights, sceneID: (固有のID番号が表示)
sceneName: turnon-all-lights, sceneID: (固有のID番号が表示)

[INFO] [1733124025.981926]: Ready.
[INFO] [1733124026.191206]: Switchbot API Client initialized.
[INFO] [1733124026.192948]: Using SwitchBot API v1.1
[INFO] [1733124026.195299]: Rate: 0.016666
[INFO] [1733124026.197702]: deviceName: co2sensor-ba1 / deviceType: MeterPro(CO2)
[INFO] [1733124026.200537]: Ready: SwitchBot Status Publisher for co2sensor-ba1

ターミナル 2 : ROS Topic の確認

rostopic list の実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ rostopic list

rostopic list の実行出力例

/rosout
/rosout_agg
/switchbot_ros/devices
/switchbot_ros/switch/cancel
/switchbot_ros/switch/feedback
/switchbot_ros/switch/goal
/switchbot_ros/switch/result
/switchbot_ros/switch/status
/switchbot_status_publisher/co2sensor_ba1

rostopic echo 実行入力

$ rostopic echo /switchbot_status_publisher/co2sensor_ba1

rostopic echo の実行出力例

header: 
  seq: 1
  stamp: 
    secs: 1733124088
    nsecs:   5677223
  frame_id: ''
temperature: 25.4
humidity: 35.0
battery: 100.0
co2ppm: 562
---
header: 
  seq: 2
  stamp: 
    secs: 1733124147
    nsecs: 910016298
  frame_id: ''
temperature: 25.4
humidity: 35.0
battery: 100.0
co2ppm: 562
---

「SwitchBot CO2センサー(温湿度計)」のステータスデータとして CO2濃度 などが取得されて ROS Topic にパブリッシュされている様子が見て取れるかと思います.

今回の記事はここまでです.

著者:yamamoto.yosuke

ルンバ 900 シリーズを ROS で遠隔操作ロボットに – 遠隔操縦編

本シリーズ前回の記事では 900 シリーズのルンバと Ubuntu PC を USB ケーブルで 接続して ROS からルンバを有線操縦する方法を紹介しました.

今回の記事ではルンバが独立して動きやすいようにバッテリー駆動のラズベリーパイ(ラズパイ・Raspberry Pi)をルンバと USB 接続し,併せて USB カメラもそのラズパイに接続することで,ルンバ 900 シリーズを WiFi を介した ROS 遠隔操作ロボットのようにしてみる様子を紹介します.

実行環境

前回の記事においてルンバを Ubuntu PC から ROS を使って USB 有線操縦することを目的としたハードウェア・ソフトウェア構成は以下のようになっていました.

  • ルンバ 961(→今回はラズパイに接続)
  • micro USB ケーブル(→今回はラズパイとルンバを接続するために使用)
  • PC: Dell Inspiron 13 5390
  • OS 等: Ubuntu 24.04 + ROS Jazzy (ROS2)
  • コントローラ(どちらか1つ)
    • Xbox360 互換ゲームパッド( 8bitDo SN30 pro – USB 有線 )
    • 3Dマウス( 3DConnexion SpaceMouse Wireless を有線で使用 )
  • 使用コード: https://github.com/y-yosuke/create_robot/tree/humble-add-setmode

今回はこれらのハードウェアに加えて下記のラズパイとその周辺機器のセットをルンバに接続したシステムも使用します.

  • Raspberry Pi 4B
    • OS をインストールする microSD カードは最大読込 100 MB/s 以上のスペックを推奨
  • OS 等: Ubuntu 24.04 + ROS Jazzy (ROS2)
  • USB 充電バッテリー( Anker Power Bank (10000mAh, 30W) )
  • USB カメラ( Buffalo WEBカメラ BSW505MBK )
  • 使用コード: https://github.com/y-yosuke/create_robot/tree/humble-add-setmode

OS などの環境については本記事執筆直近の動作検証では Ubuntu 24.04 と ROS Jazzy (ROS2) の組み合わせで行っていますが,過去に行った検証では Ubuntu 22.04 と ROS Humble の組み合わせでも動作確認しています.

使用コードについては前回の記事と同様に今回のシステム構成において使いやすいように Create Robot のソフトウェア GitHub リポジトリ https://github.com/AutonomyLab/create_robot からフォーク https://github.com/y-yosuke/create_robot/tree/humble-add-setmode して利用しています.

インストール・ビルド

今回追加した Raspberry Pi 4B に Ubuntu 24.04 + ROS Jazzy と必要なソフトウェアをインストール・ビルドします.

Raspeberry Pi への Ubuntu 24.04.1 のインストール

Ubuntu 24.04 ディスクイメージを microSD カードに書き込みます.
Install Ubuntu on a Raspberry Pi を参照して microSD カードに Ubuntu 24.04.1 以降ののインストーライメージを書き込みます.

Raspeberry Pi へのソフトウェアのインストール・ビルド

Raspberry Pi への ROS Jazzy と必要なパッケージのインストール・ビルドについては基本的に前回の記事のインストール手順 ルンバ 900 シリーズを ROS で遠隔操作ロボットに – USB 有線操縦編 : インストール・ビルド と同じですのでそちらを参照して進めてください.

1ヶ所 libcreate/include/create/packet.h を編集するときに gnome-text-editor がコマンドラインから起動できないことがありました.

$ gnome-text-editor ~/roomba_ws/src/libcreate/include/create/packet.h

その場合は本記事最後にあるトラブルシューティングの項目を参考に nanogedit その他お好みの gnome-text-editor 以外のテキストエディタを使用してください.

Ubuntu 24.04.1 インストール時点では ssh サーバが入っていないのでインストールして「設定(Settings)」で ssh 接続を有効化してください.

$ sudo apt update
$ sudo apt install openssh-server

今回使用するパッケージで依存関係記述から漏れていたパッケージ v4l2_camera をインストールします.

$ sudo apt install ros-jazzy-v4l2-camera

ルンバの遠隔操縦

ハードウェアのセットアップ

Raspberry Pi にルンバ,USB カメラ,バッテリーを接続します.Ubuntu PC 側にはゲームコントローラなどを接続します.

Raspberry Pi 4B + USB カメラ + バッテリー <==(USBケーブル)==> ルンバ 900 シリーズ
 ↑ /// ( WiFi ネットワーク ) /// ↓
Ubuntu PC + ゲームコントローラなど

次の画像はルンバ側のハードウェアを接続した様子です.

次の画像は Ubuntu PC 側のハードウェアを接続した様子です.この画像内の PC ディスプレイには後述する「ソフトウェアの実行」を行ったときのルンバに設置した USB カメラからの映像が映し出されています.

Raspberry Pi への ssh 接続とデバイスの権限設定

Ubuntu PC のターミナルからルンバと USB 接続されている Raspberry Pi に ssh 接続します.

下記の例では robotuser-rp4b というホスト名をつけた Raspberry Pi に robotuser というユーザ名で接続しています.ホスト名やユーザ名,接続時のパスワードは適宜読者の環境に沿ったもので実行してください.

ssh 接続ができたらルンバとのシリアル通信ポートの権限を chmod で変更します.

Ubuntu PC: Raspberry Pi に ssh 接続するターミナル

$ ssh robotuser@robotuser-rp4b.local
robotuser@robotuser-rp4b:~$ sudo chmod 777 /dev/ttyACM0

このターミナルの ssh は接続したままににします.

ソフトウェアの実行

Raspberry Pi に ssh 接続したターミナルで次のコマンドを実行して create_1_camera.launch
を起動します.

Ubuntu PC: Raspberry Pi に ssh 接続したターミナル

robotuser@robotuser-rp4b:~$ source ~/roomba_ws/install/setup.bash
robotuser@robotuser-rp4b:~$ ros2 launch create_bringup create_1_camera.launch
注)上記ボックス内を横スクロールでコマンド全文表示

次にルンバを遠隔操作する側の Ubuntu PC 上の2つのターミナルで次のコマンドを実行してルンバに接続した Raspberry Pi のカメラ映像を表示しながらゲームパッドノードからルンバへの速度指令のトピックを発行します.

Ubuntu PC: ターミナル 1(カメラ映像の表示)

$ source ~/roomba_ws/install/setup.bash
$ ros2 run rqt_image_view rqt_image_view 

画像トピック名に image_raw を選択するとウィンドウ内に映像が表示されます.

Ubuntu PC: ターミナル 2(速度指令発行ノードの実行)

ルンバへの速度指令を出すためのゲームパッドもしくは 3D マウスのノードを実行するためにターミナルをもう1つ開いて実行します.

< Xbox360 互換ゲームパッド使用の場合 >

Xbox360 互換ゲームパッドを用いてルンバに対する速度指令を出すノードを実行するのに joy_teleop.launch を起動します.

$ source ~/roomba_ws/install/setup.bash
$ ros2 launch create_bringup joy_teleop.launch
注)デッドマンスイッチ(現設定 L1 ボタン) を押しながらアナログスティック R を操作

< 3Dマウス( 3DConnexion SpaceMouse Wireless )使用の場合 >

3DConnexion SpaceMouse を用いてルンバに対する速度指令を出すノードを実行するのに spacenav_telelop.launch を起動します.

$ source ~/roomba_ws/install/setup.bash
$ ros2 launch create_bringup spacenav_teleop.launch 

次の動画ではルンバとラズパイのシステムが外部接続ケーブルが無く独立しており,Ubuntu PC 側のゲームパッドで操縦されルンバ上の USB カメラの映像も取得できている様子が見て取れると思います.

この動画内では撮影の都合で Ubuntu PC で操作を行っている操縦者の有視界内にルンバもありますが,Ubuntu PC とルンバは WiFi ネットワークを介してつながっているので例えば別の部屋などの視界外からもルンバ上の USB カメラからの映像や他の ROS トピックを参照しながら遠隔操縦できそうであることは想像できるのではないでしょうか.

ルンバ操作を終了するときは各ターミナルで実行しているプロセスを Ctrl+C で終了してください.


付録-A. 掃除中ルンバの ROS トピック発信

ルンバから派生した趣味や教育用をターゲットとした Create Robot は掃除機能を廃してしまっていますが今回使用しているのはお掃除ロボットのルンバそのものです.

ルンバが普通に掃除している間もその状態を Roomba Open Interface (ROI) を通じて取得できるのが ROI のパッシブモードです.

create_1_camera.launch でも launch オプションで control_mode:=passive を指定すると,ROI のパッシブモードでルンバを操作せずに通信してその状態を ROS トピックとして発行します.

Ubuntu PC: Raspberry Pi に ssh 接続したターミナル

robotuser@robotuser-rp4b:~$ source ~/roomba_ws/install/setup.bash
robotuser@robotuser-rp4b:~$ ros2 launch create_bringup create_1_camera.launch control_mode:=passive
注)上記ボックス内を横スクロールでコマンド全文表示

パッシブモードを実行中にルンバの CLEAN ボタンを押すか iRobot アプリから開始することで掃除が始まります.

create_1_camera.launch パッシブモード時に発行される ROS トピックのリスト出力は次の様になっています.

Ubuntu PC: ターミナル 1

$ source ~/roomba_ws/install/setup.bash
$ ros2 topic list
/battery/capacity
/battery/charge
/battery/charge_ratio
/battery/charging_state
/battery/current
/battery/temperature
/battery/voltage
/bumper
/camera_info
/check_led
/clean_button
/cliff
/cmd_vel
/day_button
/debris_led
/define_song
/diagnostics
/dock
/dock_button
/dock_led
/hour_button
/image_raw
/ir_omni
/joint_states
/main_brush_motor
/minute_button
/mode
/odom
/parameter_events
/play_song
/power_led
/robot_description
/rosout
/set_ascii
/side_brush_motor
/spot_button
/spot_led
/tf
/tf_static
/undock
/vacuum_motor
/wheeldrop

付録-B. トラブルシューティング

ターミナルが起動しない場合 → locale の LANG 設定を確認

Ubuntu 24.04.1 でターミナルが起動しなかったのですが,その時は /etc/default/locale の内容を LANG="en_US.UTF-8" に修正したら起動するようになりました.

/etc/default/locale

LANG="en_US.UTF-8"

gnome-text-editor が起動しない → 他のテキストエディタを使用

gnome-text-editor がコマンドラインから起動できない場合は他のテキストエディタ nano や gedit などを使用してください.

1. nano を使う
$ nano ~/roomba_ws/src/libcreate/include/create/packet.h
2. gedit を使う
$ sudo apt update
$ sudo apt install gedit
$ gedit ~/roomba_ws/src/libcreate/include/create/packet.h

今回の記事はここまでです.

著者:yamamoto.yosuke

ルンバ 900 シリーズを ROS で遠隔操作ロボットに – USB 有線操縦編

iRobot 社のお掃除ロボット「ルンバ(Roomba)」は 700 シリーズ以前のモデルでは mini-DIN のインターフェースポートがありシリアル通信にて外部からルンバを操作するためのインタフェース Roomba Open Interface (ROI) が提供されていました.またルンバ 900 シリーズではシリアルポートが micro USB となり USB ケーブル経由で外部コンピュータと簡単につなげて ROI が利用できるようになっていました.

そしてルンバから派生した掃除機能を廃して趣味や教育用をターゲットとした Create ロボットもルンバと共通の ROI で操作可能です.なおかつ Create 向けとして ROI の ROS インタフェースが GitHub で提供されているので この ROI-ROS インタフェースを用いることでシリアルポートの付いているルンバを ROS から操作することが可能となっています.

本シリーズの記事では PC やラズパイから USB ケーブルで 900 シリーズのルンバに接続して ROS からルンバを操縦する方法を紹介します.

記事のシリーズ構成は次のようになる予定です.

  • ルンバを Ubuntu PC から ROS を使って USB 有線操縦する(→本記事)
  • ルンバを Raspberry Pi に接続して ROS を使って WiFi 経由で無線遠隔操作ロボットにする(→次回記事)

実行環境

ルンバを Ubuntu PC から ROS を使って USB 有線操縦することを目的とした今回の記事におけるハードウェア・ソフトウェア構成は以下のようになっています.

  • ルンバ 961
  • micro USB ケーブル
  • PC: Dell Inspiron 13 5390
  • OS 等: Ubuntu 24.04 + ROS Jazzy (ROS2)
  • コントローラ(どちらか1つ)
    • Xbox360 互換ゲームパッド( 8bitDo SN30 pro – USB 有線 )
    • 3Dマウス( 3DConnexion SpaceMouse Wireless を有線で使用 )
  • 使用コード: https://github.com/y-yosuke/create_robot/tree/humble-add-setmode

OS などの環境については本記事執筆直近の動作検証では Ubuntu 24.04 と ROS Jazzy (ROS2) の組み合わせで行っていますが,過去に行った検証では Ubuntu 22.04 + ROS Humble の組み合わせでも動作確認しています.

使用コードについては今回のシステム構成において使いやすいように Create Robot のソフトウェア GitHub リポジトリ https://github.com/AutonomyLab/create_robot から
フォーク https://github.com/y-yosuke/create_robot/tree/humble-add-setmode して利用しています.

インストール・ビルド

Ubuntu 24.04 に ROS Jazzy のインストールする手順は下記リンク先の ROS 2 Documentation: Jazzy – Installation Ubuntu (deb packages) を参照して実行してください.

依存パッケージをインストールできるように rosdep をセットアップしておきます.

$ sudo apt install python3-rosdep
$ sudo rosdep init
$ rosdep update

ビルドのために colcon 関連パッケージをインストールします.

$ sudo apt install python3-colcon-common-extensions

ROS ワークスペースを作成して GitHub からコードをクローンし,インストール・ビルドを実行します.

$ source /opt/ros/jazzy/setup.bash
$ mkdir -p ~/roomba_ws/src
$ cd ~/roomba_ws/src/
$ git clone -b humble-add-setmode https://github.com/y-yosuke/create_robot.git
$ git clone https://github.com/AutonomyLab/libcreate.git
$ gnome-text-editor ~/roomba_ws/src/libcreate/include/create/packet.h
$ cd ~/roomba_ws/
$ rosdep install -r -y --from-paths src --ignore-src
$ colcon build
$ source ~/roomba_ws/install/setup.bash

2024.09.20 追記

上記手順の libcreate を git clone したあとに下記コマンドを追加しています.

$ gnome-text-editor ~/roomba_ws/src/libcreate/include/create/packet.h

本コマンドを実行するとテキストエディタが起動して修正が必要なファイル packet.h が開かれます.

下のように packet.h の 35行目 に #include <string> を挿入してファイルを保存してからテキストエディタを閉じます.

libcreate / include / create / packet.h

#define CREATE_PACKET_H

#include <mutex>
#include <string>

namespace create {
  class Packet {

これはビルドするのに必要な下記リンク先の修正のプルリクエストがまだ反映されていないための修正作業です.今後このプルリクエストが libcreate の master ブランチにマージされた後は不要となります.

ルンバの USB 有線操縦

ハードウェアのセットアップ

Ubuntu PC のソフトウェアのセットアップが終了したら Ubuntu PC にルンバとゲームパッドもしくは 3D マウスを接続します.

Ubuntu PC + ゲームパッド <==(USBケーブル)==> ルンバ 900シリーズ

ルンバ 900 シリーズの micro USB ソケットは上面右側にある細長いカバーを外すとあります.このカバーは工具なしで手で外すことができます.

デバイスの権限設定

ルンバが接続されているシリアルポートの権限を変更してユーザからもアクセス可能な状態にします.

$ sudo chmod a+rw /dev/ttyACM0
$ sudo usermod -a -G dialout $USER

ソフトウェアの実行

ターミナル 1

$ source ~/roomba_ws/install/setup.bash
$ ros2 launch create_bringup create_1.launch

launch 後,正常に Ubuntu PC からルンバに通信が確立されているとルンバ側で短いビープ音が鳴ります.

ターミナル 2

ルンバへの速度指令を出すためのゲームパッドもしくは 3D マウスのノードを実行するためにターミナルをもう1つ開いて実行します.

< Xbox360 互換ゲームパッド使用の場合 >

Xbox360 互換ゲームパッドを用いてルンバに対する速度指令を出すノードを実行するのに joy_teleop.launch を起動します.

$ source ~/roomba_ws/install/setup.bash
$ ros2 launch create_bringup joy_teleop.launch
注)デッドマンスイッチ(現設定 L1 ボタン) を押しながらアナログスティック R を操作

< 3Dマウス( 3DConnexion SpaceMouse Wireless )使用の場合 >

3DConnexion SpaceMouse を用いてルンバに対する速度指令を出すノードを実行するのに spacenav_telelop.launch を起動します.

$ source ~/roomba_ws/install/setup.bash
$ ros2 launch create_bringup spacenav_teleop.launch 

spacenav_teleop.launch においてはデッドマン・スイッチの設定はないので SpaceMouse の前後・ヨー軸のねじり入力がそのままルンバへの速度指令として出力されます.

次の動画はゲームパットを用いてルンバを動かしたときのものです.デッドマン・スイッチの L1 を押しながらアナログスティック R を操作することでルンバへの速度指令が出力されている様子が見て取れるかと思います.

ルンバ操作を終了するときは各ターミナルで実行しているプロセスを Ctrl+C で終了してください.

今回の記事はここまでです.


本シリーズ次回の記事ではルンバが動きやすいようにバッテリー駆動のラズベリーパイをルンバと USB 接続し,カメラも併せてラズパイに接続することで,ルンバ 900 シリーズを WiFi を介した ROS 遠隔操作ロボットのようにしてみる様子を紹介する予定です.

著者:yamamoto.yosuke

SwitchBot を ROS から利用する – データ取得編

本シリーズ前回の記事 SwitchBot を ROS から利用する – コマンド操作編2 では SwitchBot を ROS から利用する switchbot_ros のサンプルのソースコードで扱われていた SwitchBot デバイス以外のものを ROS から操作するために SwitchBot API のコマンドセットを調べて control_switchbot.py に実装する過程について紹介しました.

今回は SwitchBot デバイスのステータスデータの取得と ROS トピックへのパブリッシュを行ってみます.

switchbot_ros の更新・ビルド

前回の記事 SwitchBot を ROS から利用する – コマンド操作編2 を公開した後に GitHub 上の switchbot_ros が更新されて SwitchBot デバイスのステータスデータの取得とパブリッシュを行うソフトウェアソースコードが追加されました.

更新された switchbot_ros を実際に動作させる Ubuntu PC 内の switchbot_ros に適用してビルドします.

今回初めて switchbot_ros を使う場合は前々回の記事 SwitchBot を ROS から利用する – コマンド操作編1switchbot_ros のビルド の項目を参考にワークスペースの作成やクローン・ビルドを実行してください.このように新規にクローンしてきた場合は次の更新作業は不要です.

既に前回の記事の時点の switchbot_ros を含む jsk_3rdparty をクローンして利用している場合は次の手順で更新された GitHub 上の jsk_3rdparty を git でプル(ダウンロード更新)してビルドします.

switchbot_ros を含む jsk_3rdparty の更新とビルド

$ source ~/switchbot_ws/devel/setup.bash
$ cd ~/switchbot_ws/src/jsk_3rdparty
$ git checkout master
$ git pull origin master
$ catkin build
$ source ~/switchbot_ws/devel/setup.bash

利用可能な SwitchBot デバイス名の取得

ターミナル 1 : switchbot_ros の実行

前回記事と同じですがユーザの SwitchBot アカウントで登録されているデバイスの「デバイス名」と「デバイスタイプ」は switchbot.launch を実行すると表示されます.

(下記 launch オプションの YOUR_TOKENYOUR_SECRET をそれぞれユーザアカウントのトークンとシークレットに置き換えて実行)

switchbot.launch 実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ roslaunch switchbot_ros switchbot.launch token:=YOUR_TOKEN secret:=YOUR_SECRET

switchbot.launch 実行出力例

... logging to /home/robotuser/.ros/log/87b6e5c8-c1a2-11ee-bce7-1d89a9d14e1f/roslaunch-robotuser-PC-62866.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://robotuser-PC:40731/

SUMMARY
========

PARAMETERS
 * /rosdistro: noetic
 * /rosversion: 1.16.0
 * /switchbot_ros/secret: (シークレットの上位数桁が表示)...
 * /switchbot_ros/token: (トークンの上位数桁が表示)...

NODES
  /
    switchbot_ros (switchbot_ros/switchbot_ros_server.py)

auto-starting new master
process[master]: started with pid [62874]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 87b6e5c8-c1a2-11ee-bce7-1d89a9d14e1f
process[rosout-1]: started with pid [62884]
started core service [/rosout]
process[switchbot_ros-2]: started with pid [62891]
[INFO] [1706861436.195243]: Switchbot API Client initialized.
[INFO] [1706861436.199678]: Using SwitchBot API v1.1
[INFO] [1706861436.204957]: Switchbot Device List:
6 Item(s)
deviceName: bot74a, deviceID: (固有のID番号が表示), deviceType: Bot
deviceName: hub2a, deviceID: (固有のID番号が表示), deviceType: Hub 2
deviceName: plugmini7a1, deviceID: (固有のID番号が表示), deviceType: Plug Mini (JP)
deviceName: remote-button10a, deviceID: (固有のID番号が表示), deviceType: Remote
deviceName: tapelight7a1, deviceID: (固有のID番号が表示), deviceType: Strip Light
deviceName: thermo-hygrometer-f7a, deviceID: (固有のID番号が表示), deviceType: Meter

[INFO] [1706861436.208853]: Switchbot Remote List:
2 Item(s)
deviceName: air-conditioner, deviceID: (固有のID番号が表示), remoteType: Air Conditioner
deviceName: pendant-light, deviceID: (固有のID番号が表示), remoteType: DIY Light

[INFO] [1706861436.214168]: Switchbot Scene List:
3 Item(s)
sceneName: turnoff-all-lights, sceneID: (固有のID番号が表示)
sceneName: turnon-all-lights, sceneID: (固有のID番号が表示)
sceneName: turnon-all-lights, sceneID: (固有のID番号が表示)

[INFO] [1706861436.254126]: Ready.

利用可能なデバイス名がコンソール出力されたので一旦 Ctrl-C にて switchbot.launch を終了します.

上記の switchbot.launch 実行出力例にある SwitchBot デバイスのうち取得するステータスがない Remote 以外の次のデバイスタイプは switchbot_ros にてステータスデータを取得することができます.

  • Bot
  • Hub 2
  • Meter
  • Plug Mini (JP)
  • Strip Light

また上記リスト以外のデータ取得 API 提供がされている SwitchBot デバイスについては switchbot_ros のコードに組み込まれていませんが適宜情報をコードに加えれば switchbot_ros からもデータ取得できるようになると思います.

SwitchBot デバイスのステータスデータの取得と確認

実行例として今回は SwitchBot の温湿度計(デバイスタイプ Meter)のステータスデータを取得してパブリッシュされている ROS トピックを表示してみます.先述の switchbot.launch の実行出力例から読み取ると,該当するデバイス名が thermo-hygrometer-f7a となっています.

ステータスデータを取得する場合は switchbot.launch 実行時に次の2つのオプションを追加します.

  • pub_status:=true ステータスを取得・パブリッシュを実行するオプション true/false
  • pub_device_name:=thermo-hygrometer-f7a デバイス名の指定(本例では thermo-hygrometer-f7a)

ターミナル 1 : switchbot_ros の実行

switchbot.launch 実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ roslaunch switchbot_ros switchbot.launch token:=YOUR_TOKEN secret:=YOUR_SECRET pub_status:=true pub_device_name:=thermo-hygrometer-f7a
  • 注1) 上記テキストボックスの横スクロールで全 launch オプションが表示されます.
  • 注2) 各 launch オプションについて
    • YOUR_TOKENYOUR_SECRET は各々の SwitchBot アカウントのトークンとシークレットに置き換えて実行してください.
    • pub_status:=true でステータスを取得・パブリッシュを実行します.
    • pub_device_name:=thermo-hygrometer-f7athermo-hygrometer-f7a
      は各ユーザ利用のデバイス名に変更してください.

switchbot.launch 実行出力例

... logging to /home/robotuser/.ros/log/81bc64b6-faf2-11ee-8dad-e57ee950b51d/roslaunch-robotuser-PC-28197.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://robotuser-PC:35371/

SUMMARY
========

PARAMETERS
 * /rosdistro: noetic
 * /rosversion: 1.16.0
 * /switchbot_ros/secret: (シークレットの上位数桁が表示)...
 * /switchbot_ros/token: (トークンの上位数桁が表示)...
 * /switchbot_status_publisher/device_name: thermo-hygrometer...
 * /switchbot_status_publisher/rate: 0.1
 * /switchbot_status_publisher/secret: (シークレットの上位数桁が表示)...
 * /switchbot_status_publisher/token: (トークンの上位数桁が表示)...

NODES
  /
    switchbot_ros (switchbot_ros/switchbot_ros_server.py)
    switchbot_status_publisher (switchbot_ros/switchbot_status_publisher.py)

auto-starting new master
process[master]: started with pid [28205]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 81bc64b6-faf2-11ee-8dad-e57ee950b51d
process[rosout-1]: started with pid [28215]
started core service [/rosout]
process[switchbot_ros-2]: started with pid [28222]
process[switchbot_status_publisher-3]: started with pid [28223]
[INFO] [1713163000.937913]: Switchbot API Client initialized.
[INFO] [1713163000.938005]: Switchbot API Client initialized.
[INFO] [1713163000.940084]: Using SwitchBot API v1.1
[INFO] [1713163000.940382]: Using SwitchBot API v1.1
[INFO] [1713163000.942545]: Switchbot Device List:
6 Item(s)
deviceName: bot74a, deviceID: (固有のID番号が表示), deviceType: Bot
deviceName: hub2a, deviceID: (固有のID番号が表示), deviceType: Hub 2
deviceName: plugmini7a1, deviceID: (固有のID番号が表示), deviceType: Plug Mini (JP)
deviceName: remote-button10a, deviceID: (固有のID番号が表示), deviceType: Remote
deviceName: tapelight7a1, deviceID: (固有のID番号が表示), deviceType: Strip Light
deviceName: thermo-hygrometer-f7a, deviceID: (固有のID番号が表示), deviceType: Meter

[INFO] [1713163000.944131]: Switchbot Remote List:
2 Item(s)
deviceName: air-conditioner, deviceID: (固有のID番号が表示), remoteType: Air Conditioner
deviceName: pendant-light, deviceID: (固有のID番号が表示), remoteType: DIY Light

[INFO] [1713163000.944268]: Rate: 0.1
[INFO] [1713163000.945732]: Switchbot Scene List:
2 Item(s)
sceneName: turnoff-all-lights, sceneID: (固有のID番号が表示)
sceneName: turnon-all-lights, sceneID: (固有のID番号が表示)

[INFO] [1713163000.947428]: deviceName: thermo-hygrometer-f7a / deviceType: Meter
[INFO] [1713163000.951801]: Ready: SwitchBot Status Publisher for thermo-hygrometer-f7a
[INFO] [1713163000.966800]: Ready.

ターミナル 2 : ROS トピックの確認

rostopic list の実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ rostopic list

rostopic list の実行出力例

/rosout
/rosout_agg
/switchbot_ros/devices
/switchbot_ros/switch/cancel
/switchbot_ros/switch/feedback
/switchbot_ros/switch/goal
/switchbot_ros/switch/result
/switchbot_ros/switch/status
/switchbot_status_publisher/thermo_hygrometer_f7a

rostopic echo 実行入力

$ rostopic echo /switchbot_status_publisher/thermo_hygrometer_f7a

rostopic echo の実行出力例

header: 
  seq: 1
  stamp: 
    secs: 1713163093
    nsecs: 412018775
  frame_id: ''
temperature: 26.9
humidity: 36.0
battery: 100.0
---
header: 
  seq: 2
  stamp: 
    secs: 1713163103
    nsecs: 447003364
  frame_id: ''
temperature: 26.9
humidity: 36.0
battery: 100.0
---
header: 
  seq: 3
  stamp: 
    secs: 1713163113
    nsecs: 380291700
  frame_id: ''
temperature: 26.9
humidity: 36.0
battery: 100.0

SwitchBot 温湿度計 Meter のステータスデータとして温度・湿度などが取得されて ROS トピックにパブリッシュされている様子がわかるかと思います.

ステータスの取得とパブリッシュの間隔は switchbot.launch のデフォルト設定で 0.1 [Hz] = 10秒間隔 になっています.これを変更する場合には switchbot.launch のオプションで pub_status_rate:=0.05 のように追加します.温湿度のように急に変化しなさそうなデータの場合はもっと長めの間隔でも良いかもしれません.

今回の記事はここまでです.

著者:yamamoto.yosuke

SwitchBot を ROS から利用する – コマンド操作編2

本シリーズ前回の記事 SwitchBot を ROS から利用する – コマンド操作編1 では SwitchBot を ROS から利用する switchbot_ros の導入とサンプル Python コードの実行の様子を紹介しました.

今回は前回の記事の続きとしてサンプルのソースコードで扱われていた SwitchBot デバイス以外のものを ROS から操作するために SwitchBot API のコマンドセットを調べて control_switchbot.py に実装する過程について紹介します.

  1. 利用可能な SwitchBot デバイス情報の取得
  2. SwitchBot デバイス API コマンドセットの調査
  3. SwitchBot デバイスコマンドのソースコード追記

利用可能な SwitchBot デバイス情報の取得

switchbot_ros のサンプル Python コード control_switchbot.py においてボット(スイッチ)をオンにする命令は次のようになっていて「デバイス名」とそれに対する「コマンド」の2つを指定する必要があります.

client.control_device('bot74a', 'turnOn')
client.control_device('デバイス名', 'コマンド')

このうち「コマンド」は SwitchBot API にてデバイスタイプごとに設定されているので「デバイスタイプ」が何かを知る必要があります.

ユーザのアカウントで登録されているデバイスの「デバイス名」と「デバイスタイプ」は switchbot.launch を実行すると表示されます.

(下記 launch オプションの YOUR_TOKEN と YOUR_SECRET をそれぞれユーザアカウントのトークンとシークレットに置き換えて実行)

switchbot.launch 実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ roslaunch switchbot_ros switchbot.launch token:=YOUR_TOKEN secret:=YOUR_SECRET

switchbot.launch 実行出力例

... logging to /home/robotuser/.ros/log/87b6e5c8-c1a2-11ee-bce7-1d89a9d14e1f/roslaunch-robotuser-PC-62866.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://robotuser-PC:40731/

SUMMARY
========

PARAMETERS
 * /rosdistro: noetic
 * /rosversion: 1.16.0
 * /switchbot_ros/secret: (シークレットの上位数桁が表示)...
 * /switchbot_ros/token: (トークンの上位数桁が表示)...

NODES
  /
    switchbot_ros (switchbot_ros/switchbot_ros_server.py)

auto-starting new master
process[master]: started with pid [62874]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 87b6e5c8-c1a2-11ee-bce7-1d89a9d14e1f
process[rosout-1]: started with pid [62884]
started core service [/rosout]
process[switchbot_ros-2]: started with pid [62891]
[INFO] [1706861436.195243]: Switchbot API Client initialized.
[INFO] [1706861436.199678]: Using SwitchBot API v1.1
[INFO] [1706861436.204957]: Switchbot Device List:
6 Item(s)
deviceName: bot74a, deviceID: (固有のID番号が表示), deviceType: Bot
deviceName: hub2a, deviceID: (固有のID番号が表示), deviceType: Hub 2
deviceName: plugmini7a1, deviceID: (固有のID番号が表示), deviceType: Plug Mini (JP)
deviceName: remote-button10a, deviceID: (固有のID番号が表示), deviceType: Remote
deviceName: tapelight7a1, deviceID: (固有のID番号が表示), deviceType: Strip Light
deviceName: thermo-hygrometer-f7a, deviceID: (固有のID番号が表示), deviceType: Meter

[INFO] [1706861436.208853]: Switchbot Remote List:
2 Item(s)
deviceName: air-conditioner, deviceID: (固有のID番号が表示), remoteType: Air Conditioner
deviceName: pendant-light, deviceID: (固有のID番号が表示), remoteType: DIY Light

[INFO] [1706861436.214168]: Switchbot Scene List:
3 Item(s)
sceneName: turnoff-all-lights, sceneID: (固有のID番号が表示)
sceneName: turnon-all-lights, sceneID: (固有のID番号が表示)
sceneName: turnon-all-lights, sceneID: (固有のID番号が表示)

[INFO] [1706861436.254126]: Ready.

switchbot.launch 実行出力から次の1行を例にとると「デバイス名」が plugmini7a1 で「デバイスタイプ」が Plug Mini (JP) です.

deviceName: plugmini7a1, deviceID: (固有のID番号が表示), deviceType: Plug Mini (JP)

SwitchBot デバイス API コマンドセットの調査

操作したい SwitchBot デバイスタイプが分かればそのコマンドセットを調べます.SwitchBot API のコマンドセットは下記の Web ページで知ることができます.

今回はデバイスタイプ Plug Mini (JP) と Strip Light のデバイスを操作したいのでそれらのコマンドセットについて調べます.

Plug Mini (JP) のコマンドセット

電源プラグの On/Off を行う SwitchBot デバイスである Plug Mini (JP) のコマンドセットの説明は次のリンク先にあります.

上記 Web ページの Plug Mini (JP) コマンドセットの表をそのまま貼り付けたものが次の表です.

deviceType commandType Command command parameter Description
Plug Mini (JP) command turnOn default set to ON state
Plug Mini (JP) command turnOff default set to OFF state
Plug Mini (JP) command toggle default toggle state

デバイスの機能どおりに電源入 turnOn,電源切 turnOff,電源入切の切替 toggle の3つのコマンドにより構成されています.

Strip Light のコマンドセット

テープライト形状の SwitchBot デバイスである Strip Light のコマンドセットの説明は次のリンク先にあります.

上記 Web ページの Strip Light コマンドセットの表をそのまま貼り付けたものが次の表です.

deviceType commandType Command command parameter Description
Strip Light command turnOn default set to ON state
Strip Light command turnOff default set to OFF state
Strip Light command toggle default toggle state
Strip Light command setBrightness {1-100} set brightness
Strip Light command setColor "{0-255}:{0-255}:{0-255}" set RGB color value

点灯 turnOn,消灯 turnOff,明滅切替 toggle,輝度設定 setBrightness,色設定 setColor の5つのコマンドにより構成されていて,そのうち輝度設定では{1-100} の範囲で輝度設定, "{0-255}:{0-255}:{0-255}" の値で RGB 色設定を行います.

SwitchBot デバイスコマンドのソースコード追記

Plug Mini (JP) を操作するソースコード追記と実行

デバイス名 plugmini7a1 の Plug Mini (JP) を操作します. ROS からコマンドを送って On/Off の切り替え toggle をしてみます.

サンプルコード control_switchbot.py に client.control_device('plugmini7a1', 'toggle') を追加します.(下記ソースコードの 16行目)

control_switchbot.py

#!/usr/bin/env python

import rospy
from switchbot_ros.switchbot_ros_client import SwitchBotROSClient

rospy.init_node('controler_node')
client = SwitchBotROSClient()

devices = client.get_devices()
print(devices)

# client.control_device('pendant-light', 'turnOn')

# client.control_device('bot74a', 'turnOn')

client.control_device('plugmini7a1', 'toggle')

ここでは元々サンプルコードにあったペンダントライトとボット(スイッチ)の操作をする行(上記ソースコードの12,14行目)は行頭に # を入れてコメントアウトして実行されないようにしています.

変更を加えた control_switchbot.py ファイルを保存してから実行します.

ターミナル 1 : switchbot.launch 実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ roslaunch switchbot_ros switchbot.launch token:=YOUR_TOKEN secret:=YOUR_SECRET

ターミナル 2 : control_switchbot.py 実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ rosrun switchbot_ros control_switchbot.py 

Strip Light を操作するソースコード追記と実行

デバイス名 tapelight7a1 の Strip Light (テープライト)を操作します. ROS からコマンドを送って次の動作をしてみます.

  1. 消灯
  2. 点灯
  3. 輝度を 100% に設定
  4. 色を白 '255:255:255' に設定
  5. 色を赤 '255:0:0' に設定
  6. 色を緑 '0:255:0' に設定
  7. 色を青 '0:0:255' に設定
  8. 輝度を 1% に設定
  9. 消灯

サンプルコード control_switchbot.py に下記ソースコードの18行目以降を追加します.

値を設定する setBrightnesssetColor といったコマンドでは各数値を control_device() の引数 parameter に文字列として渡します.

また control_device() の中ではコマンドを Action サーバにゴールとして送っているので新しいコマンドが前のコマンドに置き換わらないように1つ1つのコマンド実行を終えるのを待つように引数 waitTrue を渡しています.

control_switchbot.py

#!/usr/bin/env python

import rospy
from switchbot_ros.switchbot_ros_client import SwitchBotROSClient

rospy.init_node('controler_node')
client = SwitchBotROSClient()

devices = client.get_devices()
print(devices)

# client.control_device('pendant-light', 'turnOn')

# client.control_device('bot74a', 'turnOn')

# client.control_device('plugmini7a1', 'toggle')

client.control_device('tapelight7a1', 'turnOff', wait=True)
client.control_device('tapelight7a1', 'turnOn', wait=True)
client.control_device('tapelight7a1', 'setBrightness', parameter='100', wait=True)
client.control_device('tapelight7a1', 'setColor', parameter='255:255:255', wait=True)
client.control_device('tapelight7a1', 'setColor', parameter='255:0:0', wait=True)
client.control_device('tapelight7a1', 'setColor', parameter='0:255:0', wait=True)
client.control_device('tapelight7a1', 'setColor', parameter='0:0:255', wait=True)
client.control_device('tapelight7a1', 'setBrightness', parameter='1', wait=True)
client.control_device('tapelight7a1', 'turnOff', wait=True)

前述の Plug Mini (JP) のときと同様に変更を加えた control_switchbot.py ファイルを保存してから実行します.

補足ソースコード変更

筆者が試した範囲では時々 client.control_device() が実行されない不具合が見受けられ,それが SwitchBotROSClient インスタンス作成時 client = SwitchBotROSClient() に Action サーバの起動やサーバへの接続が不十分であることが原因のように思われました.

そこで下記の switchbot_ros_client.py の21行目のように self.action_client.wait_for_server() を入れて Action サーバが起動して接続されるのを待つようにしたところ,現状では安定して client.control_device() が実行されているように感じます.

switchbot_ros_client.py

import rospy
import actionlib
from switchbot_ros.msg import SwitchBotCommandAction
from switchbot_ros.msg import SwitchBotCommandGoal
from switchbot_ros.msg import DeviceArray


class SwitchBotROSClient(object):

    def __init__(self,
                 actionname='switchbot_ros/switch',
                 topicname='switchbot_ros/devices'):

        self.actionname = actionname
        self.topicname = topicname
        self.action_client = actionlib.SimpleActionClient(
                actionname,
                SwitchBotCommandAction
                )
        rospy.loginfo("Waiting for action server to start.")
        self.action_client.wait_for_server()

    def get_devices(self, timeout=None):

        return rospy.wait_for_message(
                self.topicname,
                DeviceArray,
                timeout=timeout
                )

    def control_device(self,
                       device_name,
                       command,
                       parameter='',
                       command_type='',
                       wait=False
                       ):

        goal = SwitchBotCommandGoal()
        goal.device_name = device_name
        goal.command = command
        goal.parameter = parameter
        goal.command_type = command_type
        self.action_client.send_goal(goal)
        if wait:
            self.action_client.wait_for_result()
            return self.action_client.get_result()

今回の記事はここまでです.

著者:yamamoto.yosuke

SwitchBot を ROS から利用する – コマンド操作編1

本記事では SwitchBot を ROS から利用できるソフトウェア switchbot_ros の使い方を紹介します.


SwitchBot は多くの IoT スマートホームデバイス製品を提供しているブランドで,既にそれらを日常生活の中で活用されている方も多いのではないでしょうか.

SwitchBot からはソフトウェアインターフェースとして WebAPI が提供されていて,2024年2月はじめの時点での最新バージョンが v1.1 となっています.

SwitchBot の WebAPI を ROS から利用する switchbot_ros は下記のリポジトリで公開されていて SwitchBot API v1.1 にも対応しています.

SwitchBot の機器を ROS のシステムに組み込むことによりロボットとスマートホームデバイスを組み合わせた動作システムを簡単に実現することが可能となります.


今回は switchbot_ros を含む jsk_3rdparty リポジトリを Ubuntu PC 内の ROS ワークスペースにクローン・ビルドして ROS から SwitchBot デバイスを動作させます.

switchbot_ros のビルド

本記事では次の環境で switchbot_ros を利用しています.

  • Ubuntu 20.04
  • ROS Noetic

Ubuntu や ROS のインストールが済んだ状態で次のように switchbot_ros を利用するためのワークスペースを作成して jsk_3rdparty リポジトリをクローンしてビルドします.

$ source /opt/ros/noetic/setup.bash
$ mkdir -p ~/switchbot_ws/src
$ cd ~/switchbot_ws
$ catkin build 
$ source ~/switchbot_ws/devel/setup.bash
$ cd ~/switchbot_ws/src
$ git clone https://github.com/jsk-ros-pkg/jsk_3rdparty.git
$ cd ~/switchbot_ws
$ rosdep install -y -r --from-paths src --ignore-src
$ catkin build
$ source ~/switchbot_ws/devel/setup.bash

SwitchBot API のトークンとシークレットの取得

switchbot_ros は SwitchBot API を利用していますので SwitchBot API にアクセスするための SwitchBot アカウント各々に固有の「トークン(token)」と「シークレット(secret)」の2つの情報が必要になります.

SwitchBot Magazine – 【API】新バージョンAPI v1.1を公開しました にトークンとシークレットの取得方法などが書かれています.この記事から引用・まとめをするとトークンとシークレットの取得方法はつぎのようになっています.

  1. App Store または Google Play Store より SwitchBot アプリをダウンロード
  2. SwitchBot アカウントを作成またはサインイン
  3. オープントークンを生成
    1. 「プロフィールページ」 → 「設定」へ移動
    2. 「アプリバージョン」を10回タップ → 「開発者向けオプション」が表示される
    3. 「開発者向けオプション」をタップ
    4. 「トークン」と「クライアントシークレット」をコピーしてテキストとして保存

switchbot_ros の実行

switchbot_ros の中にあるコマンドを発する Python コード例 control_switchbot.py を実行して ROS から SwitchBot デバイスのハブの赤外線リモコン発信で部屋の電気を点灯した後にボット(スイッチ)を動作させます.

control_switchbot.py の中身はシンプルで 12行目 で照明を点灯させて,14行目 でボット(スイッチ)を On しています.

control_switchbot.py

#!/usr/bin/env python

import rospy
from switchbot_ros.switchbot_ros_client import SwitchBotROSClient

rospy.init_node('controler_node')
client = SwitchBotROSClient()

devices = client.get_devices()
print(devices)

client.control_device('pendant-light', 'turnOff')

client.control_device('bot74a', 'turnOn')
12行目で client.control_device('pendant-light', 'turnOff')'turnOff' となっているのに点灯?と思いますが筆者のペンダントライトのリモコンを SwitchBot アプリで登録する際に電源の On/Off ボタンが1つのものとして扱われていて 'turnOn''turnOff' も On/Off の切り替えボタンとして機能してしまっているためです. ( = もう一度 client.control_device('pendant-light', 'turnOff') を実行すると消灯になる) このように特に登録するリモコンについてはどのようにマッピングができたかに挙動が依存するのでコマンドに対する各々のデバイスの挙動を確認してから利用する必要があります.

操作コマンドの SwitchBot デバイスに至るまでの大まかな流れは次のようになっています.

  • control_switchbot.py
  • → SwitchBot ROS Client
  • → SwitchBot ROS Action Server
  • → SwitchBot WebAPI
  • → SwitchBot デバイス

それでは実際に実行してみます. SwitchBot ROS アクションサーバを起動してから別ターミナルで control_switchbot.py を実行します.

ターミナル 1 : SwitchBot ROS アクションサーバの起動

下記コマンドの SwichBot ROS アクションサーバの起動実行時に launch オプションの token:=YOUR_TOKENYOUR_TOKEN を SwitchBot アプリで取得したトークンに置き換えて, secret:=YOUR_SECRETYOUR_SECRET を取得したシークレットに置き換えて書いて実行します.

switchbot.launch 実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ roslaunch switchbot_ros switchbot.launch token:=YOUR_TOKEN secret:=YOUR_SECRET

switchbot.launch 実行出力例

... logging to /home/robotuser/.ros/log/87b6e5c8-c1a2-11ee-bce7-1d89a9d14e1f/roslaunch-robotuser-PC-62866.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://robotuser-PC:40731/

SUMMARY
========

PARAMETERS
 * /rosdistro: noetic
 * /rosversion: 1.16.0
 * /switchbot_ros/secret: (シークレットの上位数桁が表示)...
 * /switchbot_ros/token: (トークンの上位数桁が表示)...

NODES
  /
    switchbot_ros (switchbot_ros/switchbot_ros_server.py)

auto-starting new master
process[master]: started with pid [62874]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 87b6e5c8-c1a2-11ee-bce7-1d89a9d14e1f
process[rosout-1]: started with pid [62884]
started core service [/rosout]
process[switchbot_ros-2]: started with pid [62891]
[INFO] [1706861436.195243]: Switchbot API Client initialized.
[INFO] [1706861436.199678]: Using SwitchBot API v1.1
[INFO] [1706861436.204957]: Switchbot Device List:
6 Item(s)
deviceName: bot74a, deviceID: (固有のID番号が表示), deviceType: Bot
deviceName: hub2a, deviceID: (固有のID番号が表示), deviceType: Hub 2
deviceName: plugmini7a1, deviceID: (固有のID番号が表示), deviceType: Plug Mini (JP)
deviceName: remote-button10a, deviceID: (固有のID番号が表示), deviceType: Remote
deviceName: tapelight7a1, deviceID: (固有のID番号が表示), deviceType: Strip Light
deviceName: thermo-hygrometer-f7a, deviceID: (固有のID番号が表示), deviceType: Meter

[INFO] [1706861436.208853]: Switchbot Remote List:
2 Item(s)
deviceName: air-conditioner, deviceID: (固有のID番号が表示), remoteType: Air Conditioner
deviceName: pendant-light, deviceID: (固有のID番号が表示), remoteType: DIY Light

[INFO] [1706861436.214168]: Switchbot Scene List:
3 Item(s)
sceneName: turnoff-all-lights, sceneID: (固有のID番号が表示)
sceneName: turnon-all-lights, sceneID: (固有のID番号が表示)
sceneName: turnon-all-lights, sceneID: (固有のID番号が表示)

[INFO] [1706861436.254126]: Ready.

ターミナル 2 : control_switchbot.py の実行

ターミナル1 の switchbot.launch を起動したままの状態で別のターミナルで control_switchbot.py を実行します.

control_switchbot.py 実行入力

$ source ~/switchbot_ws/devel/setup.bash
$ rosrun switchbot_ros control_switchbot.py 

control_switchbot.py 実行出力例

devices: 
  - 
    name: "bot74a"
    type: "Bot"
  - 
    name: "hub2a"
    type: "None"
  - 
    name: "plugmini7a1"
    type: "Plug Mini (JP)"
  - 
    name: "remote-button10a"
    type: "Remote"
  - 
    name: "tapelight7a1"
    type: "Strip Light"
  - 
    name: "thermo-hygrometer-f7a"
    type: "Meter"
  - 
    name: "air-conditioner"
    type: "Air Conditioner"
  - 
    name: "pendant-light"
    type: "DIY Light"

control_switchbot.py 実行出力時の SwitchBot デバイス動作の様子

SwitchBot を ROS から操作する感じが伝わりましたでしょうか?

今回の記事はここまでです.


本シリーズ次回の記事では今回実行した Python コード例で扱われていたもの以外の SwitchBot デバイスを ROS から操作するために SwitchBot API を調べて control_switchbot.py にコマンドを追加する様子についてお伝えする予定です.

著者:yamamoto.yosuke

ChatGPT と ROS – ROS Topic を介した ChatGPT チャットプログラム

本シリーズ前回の記事 1. ROS Service プログラムの文脈をふまえたチャット対応 では OpenAI の Chat Completion API を利用して過去のチャット履歴もふまえたチャットを行える ROS Service プログラムを作成した様子をお伝えしました.

今回の記事では Chat Completion API を利用した「文脈をふまえたチャット」をする ROS ソフトウェアを実装してみた2つ目の方法「2. ROS Topic を介した ChatGPT チャットプログラム」を作成した様子を紹介します.

  1. ROS Service プログラムの文脈をふまえたチャット対応
    • 「1問1答」形式 →「チャット」形式
  2. ROS Topic を介した ChatGPT チャットプログラム
    • ROS Service の応答 → ROS Topic のやり取りによる ChatGPT とのチャット

ROS Topic を介した ChatGPT のチャットプログラム

前回,比較的短文のチャットを扱う Chat Completion API へのアクセスであれば ROS Service よりも ROS Topic を介したメッセージのやり取りの方が ROS ノード内でのチャット会話に限られず,より ROS に親和的でよりシンプルな構成になるのでは?という反省がありました.

今回の ROS Topic を用いたチャットプログラムの作成方針は次のようにしました.

  • Chat Completion API にアクセスする ROS Node
    • ROS Topic /request を購読してユーザの発言を得る
    • ユーザの発言をふまえて Chat Completion API にアクセスして応答を ROS Topic /response としてパブリッシュする
    • チャットの履歴データを蓄積する
  • チャットユーザ側
    • 質問を ROS Topic /request にパブリッシュする
    • 返答は ROS Topic /response を購読して得る

ROS Service プログラムの場合はチャット履歴をふまえたとしてもチャット機能提供側とユーザとの1者対1者でのやり取りでしたが,ROS Topic にすることでチャット機能提供側と複数のユーザの1者対他者でのやり取りも可能になる利点もあります.

ソースコード

ROS Topic を介した文脈をふまえたチャットプログラムで追加したファイルは次の2つです.

  • scripts / openai_chat_rostopic.py
  • launch / openai_chat.launch

サービスの定義など考慮しなくて良いので非常にシンプルです.

以下,それぞれのファイル内のコードを記載して少し説明をします.

scripts / openai_chat_rostopic.py

#!/usr/bin/env python3

import rospy
import openai

from std_msgs.msg import String


class Chatter:
    """
    Chat with ChatGPT on ROS topics
    """
    def __init__(self):
        # Get ROS parameters
        prompt = rospy.get_param('~prompt')
        self.model = rospy.get_param('~model')
        openai.api_key = rospy.get_param('~key')
        
        rospy.loginfo("For \'system\': %s" % (prompt))
        
        # Set initial message with a prompt
        self.messages = []
        self.messages.append({"role": "system", "content": str(prompt)})
        
        self.sub = rospy.Subscriber('request', String, self.callback)
        self.pub = rospy.Publisher('response', String, queue_size=10)
        
        rospy.spin()


    def callback(self, data):
        rospy.loginfo("request: %s", data.data)
        
        # Add user's input to the history
        self.messages.append({"role": "user", "content": str(data.data)})
        
        response = openai.ChatCompletion.create(
            model=self.model,
            messages=self.messages
        )
        
        content = response["choices"][0]["message"]["content"]
        role = response["choices"][0]["message"]["role"]
        token = response["usage"]["total_tokens"]
        
        # Add GPT's response to the history
        self.messages.append({"role": str(role), "content": str(content)})
        
        rospy.loginfo("%s(token:%d): %s" % (role, token, content))
        self.pub.publish(content)


if __name__ == "__main__":
    rospy.init_node('chat_rostopic', anonymous=True)
    chatter = Chatter()
    
  • L25,31: ROS Topic /request を購読(Subscribe)してトピックを受け取ったら callback() メソッドを呼び出す
  • L35: callback() メソッド内で新たなリクエストをチャット履歴に追加
  • L37-40: Chat Completion API に投げる
  • L47: Chat Completion API からの返答をチャット履歴に追加
  • ROS Topic /response としてパブリッシュ

launch / openai_chat.launch

launch オプション service を用いて前回の記事で紹介した ROS Service によるチャットプログラムと今回の ROS Topic を介したチャットプログラムのどちらを実行するかを切り替えるようにしています.

<launch>
  
  <arg name="key" default="$(env OPENAI_API_KEY)" />
  <arg name="model" default="gpt-3.5-turbo" />
  <arg name="service" default="false" />
  <arg name="prompt" default="You are a helpful assistant." />
  
  <node if="$(arg service)"
        pkg="openai_ros" type="openai_chat_server.py" name="openai_chat_service" output="screen">
    <param name="key" value="$(arg key)" />
    <param name="model" value="$(arg model)" />
  </node>
  
  <node unless="$(arg service)"
        pkg="openai_ros" type="openai_chat_rostopic.py" name="openai_chat_topic" output="screen">
    <param name="key" value="$(arg key)" />
    <param name="model" value="$(arg model)" />
    <param name="prompt" value="$(arg prompt)" />
  </node>
  
</launch>

実行例

文脈をふまえた ROS Topic を介したチャットプログラムを実行した例を以下に記載します.

ターミナル 1 : チャットノードの起動

Chat Completion API にアクセスして ROS Topic でやり取りする ROS Node を openai_chat.launch で起動しています.

robotuser@robotuser-PC:~$ source ~/openai_ws/devel/setup.bash
robotuser@robotuser-PC:~$ export OPENAI_API_KEY="sk-..."
robotuser@robotuser-PC:~$ roslaunch openai_ros openai_chat.launch 
... logging to /home/robotuser/.ros/log/609f8d12-52cd-11ee-9968-6b3ff6703622/roslaunch-robotuser-PC-5035.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://robotuser-PC:40257/

SUMMARY
========

PARAMETERS
 * /openai_chat/key: sk-3JDluBbxsNuIhi...
 * /openai_chat/model: gpt-3.5-turbo
 * /openai_chat/prompt: You are a helpful...
 * /rosdistro: noetic
 * /rosversion: 1.16.0

NODES
  /
    openai_chat (openai_ros/openai_chat_rostopic.py)

auto-starting new master
process[master]: started with pid [5043]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 609f8d12-52cd-11ee-9968-6b3ff6703622
process[rosout-1]: started with pid [5053]
started core service [/rosout]
process[openai_chat-2]: started with pid [5060]
[INFO] [1694675254.662674]: For 'system': You are a helpful assistant.
[INFO] [1694675266.017788]: request: Hello
[INFO] [1694675267.401076]: assistant(token:27): Hello! How can I assist you today?
[INFO] [1694675292.897892]: request: インターネットはどこにありますか?
[INFO] [1694675300.168180]: assistant(token:183): インターネットは物理的な場所にあるのではなく,世界中のコンピューターがネットワークで結ばれている仮想的な空間です.インターネットは,データを送信し受け取るためのプロトコルとパケット交換技術を使用しています.つまり,インターネットは世界中のコンピューターネットワークの集合体です.
[INFO] [1694675347.975610]: request: 世界中とは地球のことですか?
[INFO] [1694675354.647098]: assistant(token:324): はい,正確に言えば,インターネットは地球上のコンピューターネットワークの集合体です.このネットワークには,地球上の様々な場所に設置されたサーバーやルーターなどの機器が含まれます.インターネットのデータ通信は,これらの機器を介して行われます.
[INFO] [1694675387.510775]: request: あなたは誰ですか?
[INFO] [1694675391.409440]: assistant(token:407): 私はAI(人工知能)ベースのヘルプフルなアシスタントです.質問や問題解決,情報の提供など,お手伝いできることがありましたらお知らせください.
[INFO] [1694675436.047036]: request: どのようにヘルプフルですか?
[INFO] [1694675447.019485]: assistant(token:645): 私は多くの情報と知識を持つAIですので,様々な質問や問題に対してお答えすることができます.例えば,旅行の予約や天気予報の確認,翻訳や研究のサポート,一般的な知識の提供など,さまざまな分野でお手伝いすることができます.また,自然言語処理の技術を利用して,あなたの質問や要求を理解し,最適な回答やソリューションを提供することも可能です.お困りのことや疑問があれば,いつでもお気軽にお知らせください.
[INFO] [1694675485.687087]: request: 東京の明日の天気もわかりますか?
[INFO] [1694675507.944942]: assistant(token:1064): もちろんです!東京の天気予報を調べてみましょう.

私はリアルタイムのデータにアクセスできるわけではありませんが,一般的に天気予報を提供する公式のウェブサイトやアプリを利用して,詳細な天気予報を確認することができます.天気予報は頻繁に更新されるため,事前に確認することをおすすめします.以下は一般的な天気予報サービスの利用方法です.

- インターネット検索エンジンで「東京の天気予報」と検索すると,現在の天気情報と明日の天気予報を含む結果が表示されます.
- スマートフォンやタブレットを使用している場合は,天気予報を提供するアプリをダウンロードしてインストールすることもできます.定番のアプリには「Weather」や「Weather Underground」などがあります.

これらの方法を使用して,明日の東京の天気を確認してみてください.天気予報に関する詳細な情報を入手するためには,地元の気象庁や天気予報サービスの公式ウェブサイトを参照することもおすすめです.
^C[openai_chat-2] killing on exit
[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete
done
robotuser@robotuser-PC:~$ 

ターミナル 2 : ROS Topic に発言をパブリッシュ

1つ目のターミナルで openai_chat.launch を起動したままの状態で2つ目のターミナルから ROS Topic をパブリッシュします.

robotuser@robotuser-PC:~$ rostopic pub -1 /request std_msgs/String "Hello"
publishing and latching message for 3.0 seconds
robotuser@robotuser-PC:~$ rostopic pub -1 /request std_msgs/String "インターネットはどこにありますか ?"
publishing and latching message for 3.0 seconds
robotuser@robotuser-PC:~$ rostopic pub -1 /request std_msgs/String "世界中とは地球のことですか?"
publishing and latching message for 3.0 seconds
robotuser@robotuser-PC:~$ rostopic pub -1 /request std_msgs/String "あなたは誰ですか?"
publishing and latching message for 3.0 seconds
robotuser@robotuser-PC:~$ rostopic pub -1 /request std_msgs/String "どのようにヘルプフルですか?"
publishing and latching message for 3.0 seconds
robotuser@robotuser-PC:~$ rostopic pub -1 /request std_msgs/String "東京の明日の天気もわかりますか?"
publishing and latching message for 3.0 seconds
robotuser@robotuser-PC:~$ 

ターミナル 3 : チャットノードからの応答の ROS Topic を確認

3つ目のターミナルで ROS Topic /response に Chat Completion API からの応答がパブリッシュされているかを確認します.コンソール出力では文字コード化して可読性がないですが Python で print()rospy.loginfo() で出力すると ターミナル 1 のような読める日本語で表示されます.

robotuser@robotuser-PC:~$ rostopic echo /response 
data: "\u79C1\u306FAI\uFF08\u4EBA\u5DE5\u77E5\u80FD\uFF09\u30D9\u30FC\u30B9\u306E\u30D8\u30EB\
  \u30D7\u30D5\u30EB\u306A\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u3067\u3059\u3002\u8CEA\
  \u554F\u3084\u554F\u984C\u89E3\u6C7A\u3001\u60C5\u5831\u306E\u63D0\u4F9B\u306A\u3069\
  \u3001\u304A\u624B\u4F1D\u3044\u3067\u304D\u308B\u3053\u3068\u304C\u3042\u308A\u307E\
  \u3057\u305F\u3089\u304A\u77E5\u3089\u305B\u304F\u3060\u3055\u3044\u3002"
---
data: "\u79C1\u306F\u591A\u304F\u306E\u60C5\u5831\u3068\u77E5\u8B58\u3092\u6301\u3064AI\u3067\
  \u3059\u306E\u3067\u3001\u69D8\u3005\u306A\u8CEA\u554F\u3084\u554F\u984C\u306B\u5BFE\
  \u3057\u3066\u304A\u7B54\u3048\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\
  \u3002\u4F8B\u3048\u3070\u3001\u65C5\u884C\u306E\u4E88\u7D04\u3084\u5929\u6C17\u4E88\
  \u5831\u306E\u78BA\u8A8D\u3001\u7FFB\u8A33\u3084\u7814\u7A76\u306E\u30B5\u30DD\u30FC\
  \u30C8\u3001\u4E00\u822C\u7684\u306A\u77E5\u8B58\u306E\u63D0\u4F9B\u306A\u3069\u3001\
  \u3055\u307E\u3056\u307E\u306A\u5206\u91CE\u3067\u304A\u624B\u4F1D\u3044\u3059\u308B\
  \u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u307E\u305F\u3001\u81EA\u7136\u8A00\
  \u8A9E\u51E6\u7406\u306E\u6280\u8853\u3092\u5229\u7528\u3057\u3066\u3001\u3042\u306A\
  \u305F\u306E\u8CEA\u554F\u3084\u8981\u6C42\u3092\u7406\u89E3\u3057\u3001\u6700\u9069\
  \u306A\u56DE\u7B54\u3084\u30BD\u30EA\u30E5\u30FC\u30B7\u30E7\u30F3\u3092\u63D0\u4F9B\
  \u3059\u308B\u3053\u3068\u3082\u53EF\u80FD\u3067\u3059\u3002\u304A\u56F0\u308A\u306E\
  \u3053\u3068\u3084\u7591\u554F\u304C\u3042\u308C\u3070\u3001\u3044\u3064\u3067\u3082\
  \u304A\u6C17\u8EFD\u306B\u304A\u77E5\u3089\u305B\u304F\u3060\u3055\u3044\u3002"
---
data: "\u3082\u3061\u308D\u3093\u3067\u3059\uFF01\u6771\u4EAC\u306E\u5929\u6C17\u4E88\u5831\
  \u3092\u8ABF\u3079\u3066\u307F\u307E\u3057\u3087\u3046\u3002\n\n\u79C1\u306F\u30EA\
  \u30A2\u30EB\u30BF\u30A4\u30E0\u306E\u30C7\u30FC\u30BF\u306B\u30A2\u30AF\u30BB\u30B9\
  \u3067\u304D\u308B\u308F\u3051\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u304C\u3001\
  \u4E00\u822C\u7684\u306B\u5929\u6C17\u4E88\u5831\u3092\u63D0\u4F9B\u3059\u308B\u516C\
  \u5F0F\u306E\u30A6\u30A7\u30D6\u30B5\u30A4\u30C8\u3084\u30A2\u30D7\u30EA\u3092\u5229\
  \u7528\u3057\u3066\u3001\u8A73\u7D30\u306A\u5929\u6C17\u4E88\u5831\u3092\u78BA\u8A8D\
  \u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u5929\u6C17\u4E88\u5831\
  \u306F\u983B\u7E41\u306B\u66F4\u65B0\u3055\u308C\u308B\u305F\u3081\u3001\u4E8B\u524D\
  \u306B\u78BA\u8A8D\u3059\u308B\u3053\u3068\u3092\u304A\u3059\u3059\u3081\u3057\u307E\
  \u3059\u3002\u4EE5\u4E0B\u306F\u4E00\u822C\u7684\u306A\u5929\u6C17\u4E88\u5831\u30B5\
  \u30FC\u30D3\u30B9\u306E\u5229\u7528\u65B9\u6CD5\u3067\u3059\u3002\n\n- \u30A4\u30F3\
  \u30BF\u30FC\u30CD\u30C3\u30C8\u691C\u7D22\u30A8\u30F3\u30B8\u30F3\u3067\u300C\u6771\
  \u4EAC\u306E\u5929\u6C17\u4E88\u5831\u300D\u3068\u691C\u7D22\u3059\u308B\u3068\u3001\
  \u73FE\u5728\u306E\u5929\u6C17\u60C5\u5831\u3068\u660E\u65E5\u306E\u5929\u6C17\u4E88\
  \u5831\u3092\u542B\u3080\u7D50\u679C\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\
  \n- \u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3084\u30BF\u30D6\u30EC\u30C3\u30C8\
  \u3092\u4F7F\u7528\u3057\u3066\u3044\u308B\u5834\u5408\u306F\u3001\u5929\u6C17\u4E88\
  \u5831\u3092\u63D0\u4F9B\u3059\u308B\u30A2\u30D7\u30EA\u3092\u30C0\u30A6\u30F3\u30ED\
  \u30FC\u30C9\u3057\u3066\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3059\u308B\u3053\u3068\
  \u3082\u3067\u304D\u307E\u3059\u3002\u5B9A\u756A\u306E\u30A2\u30D7\u30EA\u306B\u306F\
  \u300CWeather\u300D\u3084\u300CWeather Underground\u300D\u306A\u3069\u304C\u3042\
  \u308A\u307E\u3059\u3002\n\n\u3053\u308C\u3089\u306E\u65B9\u6CD5\u3092\u4F7F\u7528\
  \u3057\u3066\u3001\u660E\u65E5\u306E\u6771\u4EAC\u306E\u5929\u6C17\u3092\u78BA\u8A8D\
  \u3057\u3066\u307F\u3066\u304F\u3060\u3055\u3044\u3002\u5929\u6C17\u4E88\u5831\u306B\
  \u95A2\u3059\u308B\u8A73\u7D30\u306A\u60C5\u5831\u3092\u5165\u624B\u3059\u308B\u305F\
  \u3081\u306B\u306F\u3001\u5730\u5143\u306E\u6C17\u8C61\u5E81\u3084\u5929\u6C17\u4E88\
  \u5831\u30B5\u30FC\u30D3\u30B9\u306E\u516C\u5F0F\u30A6\u30A7\u30D6\u30B5\u30A4\u30C8\
  \u3092\u53C2\u7167\u3059\u308B\u3053\u3068\u3082\u304A\u3059\u3059\u3081\u3067\u3059\
  \u3002"
---

ChatGPT に対して問い合わせる側が人間であれば応答から自分で文脈をふまえて次の会話をすると思いますが,クライアントプログラムの場合は文脈をふまえた会話をしたければクライアント側のソフトウェアも ROS Topic を拾って自分で文脈を記録して解釈する必要があります.

ChatGPT vs ChatGPT

Chat Completion API との応答を ROS Topic を介してやり取りしているので,複数の Chat ノード(openai_chat_rostopic.py)を実行してトピックの remap をして互いのノードの応答を自らのノードの入力にすれば ChatGPT 同士で会話を続けるようにすることも簡単にできます.

そのために openai_chat.launch を次のように変更しました.

<launch>
  
  <arg name="key" default="$(env OPENAI_API_KEY)" />
  <arg name="model" default="gpt-3.5-turbo" />
  <arg name="service" default="false" />
  <arg name="opponent" default="false" />
  <arg name="prompt" default="You are a helpful assistant." />
  
  <node if="$(arg service)"
        pkg="openai_ros" type="openai_chat_server.py" name="openai_chat_service" output="screen">
    <param name="key" value="$(arg key)" />
    <param name="model" value="$(arg model)" />
  </node>
  
  <group unless="$(arg service)">
    <node pkg="openai_ros" type="openai_chat_rostopic.py" name="openai_chat_topic" output="screen">
      <param name="key" value="$(arg key)" />
      <param name="model" value="$(arg model)" />
      <param name="prompt" value="$(arg prompt)" />
    </node>
   
    <group ns="opponent" if="$(arg opponent)">
      <node pkg="openai_ros" type="openai_chat_rostopic.py" name="openai_chat_topic">
        <param name="key" value="$(arg key)" />
        <param name="model" value="$(arg model)" />
        <param name="prompt" value="You are a good talker." />
        <remap from="/opponent/request" to="/response" />
        <remap from="/opponent/response" to="/request" />
      </node>
    </group>  
  </group>
  
</launch>
  • L6: launch オプシション opponent で ChatGPT 同士の会話にするかを指定
  • L22: 2つ目のチャットノードは別のネームスペースとして区別
  • L23: 2つ目のチャットノードのコンソール出力も表示すると内容が重複するので output="screen" はなし
  • L26: prompt の設定でアシスタント同士だと会話が不自然な感じがしたので(とりあえず)2つ目のプロンプトは “You are a good talker.” としてみた
  • L27-28: remap/request/response を入れ替え

ターミナル 1 : 2つのチャットノードの起動

openai_chat.launch の起動オプション opponent:=true で2つのチャットノード実行とトピックの remap を行います.

起動した状態では応答は何もないですが ターミナル 2 から ROS トピック /request に最初のリクエストを1つパブリッシュすることで以後 ChatGPT 同士の会話が始まります.

robotuser@robotuser-PC:~$ roslaunch openai_ros openai_chat.launch opponent:=true
... logging to /home/robotuser/.ros/log/9cc9a1be-5dc8-11ee-9968-6b3ff6703622/roslaunch-robotuser-PC-35705.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://robotuser-PC:42615/

SUMMARY
========

PARAMETERS
 * /openai_chat_topic/key: sk-3JDluBbxsNuIhi...
 * /openai_chat_topic/model: gpt-3.5-turbo
 * /openai_chat_topic/prompt: You are a helpful...
 * /opponent/openai_chat_topic/key: sk-3JDluBbxsNuIhi...
 * /opponent/openai_chat_topic/model: gpt-3.5-turbo
 * /opponent/openai_chat_topic/prompt: You are a good ta...
 * /rosdistro: noetic
 * /rosversion: 1.16.0

NODES
  /
    openai_chat_topic (openai_ros/openai_chat_rostopic.py)
  /opponent/
    openai_chat_topic (openai_ros/openai_chat_rostopic.py)

auto-starting new master
process[master]: started with pid [35714]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 9cc9a1be-5dc8-11ee-9968-6b3ff6703622
process[rosout-1]: started with pid [35724]
started core service [/rosout]
process[openai_chat_topic-2]: started with pid [35731]
process[opponent/openai_chat_topic-3]: started with pid [35732]
[INFO] [1695882670.941923]: For 'system': You are a helpful assistant.
[INFO] [1695882677.451265]: request: サッカーの盛んな国を1つ挙げてください.
[INFO] [1695882679.335665]: assistant(token:60): ブラジルはサッカーの盛んな国として知られています.
[INFO] [1695882705.653403]: request: そうですね,ブラジルは世界でも有名なサッカーの強豪国として知られています.ブラジルではサッカーは国民的なスポーツであり,多くの人々が熱狂的に応援しています.

ブラジル代表チームは過去に5回のワールドカップ優勝を果たし,サッカーの歴史においても最も成功した国の一つです.有名な選手も多く輩出しており,ペレやジーコ,ロナウド,ロナウジーニョ,ネイマールなど,数々の伝説的なプレーヤーがブラジルから生まれています.

ブラジルではサッカーの試合が行われると,町中が一体となって応援に熱が入ります.カラフルな応援旗やドラム,歌声,そして華麗なサンバの踊りなど,独特のエネルギーと情熱が試合会場を包みます.

また,ブラジルには多くの有名なサッカークラブがあります.サンパウロのサンパウロFC,リオデジャネイロのフラメンゴ,サントス,リオグランデ・ド・スールのグレミオ,コリンチャンスなど,これらのクラブは強豪として名高いだけでなく,ファンの熱心さも有名です.

ブラジルのサッカーは単なるスポーツ以上のものであり,国民の誇りやアイデンティティの一部となっています.サッカーを通じて,ブラジルの文化や人々の情熱を感じることができるでしょう.
[INFO] [1695882713.741564]: assistant(token:754): その通りです.ブラジルのサッカーは国民の誇りであり,文化の一部として重要な役割を果たしています.多くの人々がサッカーに情熱を注ぎ,試合を熱狂的に応援する様子は見る価値があります.ブラジルのサッカーは世界中で愛され,その魅力は他の国にも広まっています.それだけに,ブラジルはサッカーの盛んな国として有名です.
[INFO] [1695882744.670979]: request: そうですね,ブラジルのサッカーの魅力は世界中に広まっており,多くの人々がその情熱に共感しています.ブラジル代表チームやクラブチームの試合は,テレビやインターネットを通じて世界中に配信されており,多くのサッカーファンがその魅力に触れることができます.

さらに,ブラジルのサッカー文化は技術,創造性,スピード,そしてリズム感を特徴としています.ブラジルのサッカー選手は驚くほど優れたテクニックを持ち,美しいプレーを見せることで知られています.彼らのキレのあるドリブル,正確なパス,そして豪快なシュートは,多くの人々に感動を与えます.

ブラジルのサッカーの成功は,その国の熱狂的なサッカーカルチャーとも関連しています.子供たちは幼い頃からサッカーボールを蹴り,街角やビーチでプレーする様子をよく見かけます.サッカースクールやアカデミーも充実しており,若い才能は早いうちから育成されています.

ブラジルのサッカーは単なるスポーツの一環ではなく,国民の誇りやアイデンティティの一部です.多くの人々が試合を通じて喜びや感動を共有し,サッカーを通じて結びついています.ブラジルのサッカー文化は他の国々にも影響を与え,彼らのスタイルやプレースタイルが憧れとなっています.

ブラジルのサッカーは確かに盛んな国であり,その魅力は世界中に広がっています.それはブラジルの人々の情熱と才能,そしてサッカー文化の豊かさによるものです.
[INFO] [1695882752.038028]: assistant(token:1519): 完全に同意します.ブラジルのサッカーカルチャーは,国民の情熱と才能,そして豊かなサッカー文化によって支えられています.その魅力は世界中に広まり,多くの人々がブラジルのサッカーに感動を覚えています.ブラジルのサッカーは間違いなく世界的な影響力を持っており,多くの国々で愛される存在です.
[INFO] [1695882760.235372]: request: ありがとうございます.ブラジルのサッカーは確かに世界的な影響力を持っており,多くの人々に愛されています.その独特のスタイルと情熱は,他の国々のサッカーカルチャーにも大きな影響を与えています.ブラジルのサッカーは常に進化し,新たな才能が次々に生まれることで,さらなる魅力と成功を築いていくでしょう.
^C[opponent/openai_chat_topic-3] killing on exit
[openai_chat_topic-2] killing on exit
[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete
done
robotuser@robotuser-PC:~$ 

ターミナル 2 : 最初の話題投下

robotuser@robotuser-PC:~$ rostopic pub -1 /request std_msgs/String "サッカーの盛んな国を1つ挙げてください."
publishing and latching message for 3.0 seconds
robotuser@robotuser-PC:~$ 

ROS ノードグラフ

rqt の ROS Node Graph でノードとトピックの様子を確認してみると,2つのノード /openai_chat_topic/opponent/openai_chat_topic とが互いの応答トピックを参照して循環していることが見て取れます.

ターミナル 1 の出力にも現れていますが段々と応答の文字数が互いに多くなる傾向があります.ChatGPT の token 数の上限に達して終わったりしますが,そうでない限りはずっと ChatGPT 同士で応答を続けるので終わらせたい場合は Ctrl-C で終わらせます.


文脈のデータを蓄積して多くなると Chat Completion API の token を消費してしまいますし,応答に時間がかかったりもします.一定時間会話がなかった場合やそれまでの文脈からがらりと話題を変える場合のために文脈を含めたメッセージデータを初期化するメソッドも運用上は必要かもしれません.

また,OpenAI 以外の大規模言語モデル(LLM)の API の ROS Topic ラッパがあれば(or を作れば)異なる LLM 間での会話も可能であろうと思います.


今回の記事はここまでです.

著者:yamamoto.yosuke

ChatGPT と ROS – ROS Service プログラムの文脈をふまえたチャット対応

本シリーズ前回の記事 ChatGPT と ROS – 文書生成 ROS ラッパー生成編(Chat Completion API) では OpenAI の Chat Completion API を利用した ROS Service ラッパ Python プログラムを Web の方の ChatGPT の助けを借りて作成した様子を紹介しました.

しかし,前回のプログラムは Chat Completion API を用いているものの使い方は「1問1答」形式で,それは Completion API を利用しているのと大きく変わらず,「文脈をふまえたチャット」形式ではありませんでした.

そこで前回から発展させて Chat Completion API を利用した「文脈をふまえたチャット」をする ROS ソフトウェアを次の2つの方法で実装してみました.

  1. ROS Service プログラムの文脈をふまえたチャット対応
    • 「1問1答」形式 →「チャット」形式
  2. ROS Topic を介した ChatGPT チャットプログラム
    • ROS Service の応答 → ROS Topic のやり取りによる ChatGPT とのチャット

今回の記事ではこれらのうち「1. ROS Service プログラムの文脈をふまえたチャット対応」を行った様子をお伝えします.

ROS Service プログラムの文脈をふまえたチャット対応

前回作成した Chat Completion API を利用しながらも「1問1答」形式だった ROS Service プログラムを「チャット」形式に対応させるて会話ができるように作り直します.

Chat Completion API を用いたチャット機能の実装については下記の Web 記事が ROS ではない Python プログラムですが大変参考になりました.

この記事によると Chat Completion API の応答を「チャット」の結果として機能させるためには「新しい問い」に一連の「チャットの全履歴」も含めて新たなメッセージとしたものを API に送ってリクエストする必要があります.

前回作成した ROS Service プログラムを発展させて,Chat Completion API を利用し履歴をふまえた ROS チャットソフトウェアを作成する場合,チャットの履歴を ROS Service のサーバ側で保持するか,サービスの呼び出し側で保持するか,システム的な最適解はさておき,プログラム的にはどちらの方法もあるかと思います.

今回作成した文脈をふまえたチャットに対応する ROS Service プログラムは Chat Completion API のシンプルな ROS ラッパーとしての位置づけは変えずにそのサービスを呼び出す ROS Node 側で履歴を保持して ROS Service にリクエストを送り Chat Completion API にアクセスする方法を採ってみました.

  • チャット対応 ROS Service プログラム概要
    • サービスサーバ側で Chat Completion API にアクセス(シンプルなラッパー)
    • サービスを呼び出す側でチャットの履歴を保持してチャットメッセージを作成
    • サービスのメッセージ型
      • JSON 形式の文字列として Chat Completion API へのメッセージおよびレスポンスのデータをやりとり

プログラム作成時の ChatGPT の活用

今回も Web サービスの ChatGPT の助けを借りてプログラムを作成したのですが,まるごと Python コードを作成するための問いの仕方が下手だったのか,ChatGPT の応答でしっくり来るようなソースコードは得られませんでした.そこで Python コードを記述する際の個別具体的な問題について ChatGPT の力を借りました.

例えば Chat Completion API へのメッセージやレスポンスを文字列(string)にしてやり取りする方法を聞きました.

これも聞いた時の少し前の時期に Web API を扱っていたことで Python API と Web API を混同していて,聞き方も JSON データ(文字列)と Python リストを混同していてかなりあやしいですが辻褄を合わせて何とか答えてくれるのも ChatGPT ですね.(小文字)

User

Chat Completion API Python における引数 messages に渡すのは json 形式の text 文字列であっていますか?


ChatGPT

Chat Completion APIのmessages引数に渡すものは,Pythonのリストとしてのデータ構造です.このリストは辞書のオブジェクトを要素として持ちます.通常,直接JSON形式のテキスト文字列を渡すのではなく,Pythonのデータ構造を使用します.

以下は,APIに渡すためのmessagesの例です:

messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Who won the world series in 2020?"}
]

もし,このリストがJSON形式の文字列として提供されている場合,Pythonのjsonモジュールを使ってデコードすることで,上記のようなPythonのデータ構造に変換することができます:

import json

json_string = '[{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Who won the world series in 2020?"}]'
messages = json.loads(json_string)

OpenAIのAPIを直接使用する際や,HTTPリクエストを行う場合,リクエストのボディとしてJSON文字列を送信することがあります.その際には,上記のようにPythonのデータ構造をJSON文字列に変換(エンコード)したり,逆にJSON文字列からPythonのデータ構造に変換(デコード)したりする必要があります.しかし,多くのライブラリやSDKは,この変換を自動的に行ってくれるので,ユーザーが直接JSON文字列を扱う必要は少ないです.


User

json の python list を string に変換する場合はどうしますか?


ChatGPT

PythonのリストをJSON形式の文字列に変換するには,Pythonの標準ライブラリであるjsonモジュールのdumps関数を使用します.

以下に具体的な手順を示します.

1. jsonモジュールをインポートします.

import json

1. json.dumps関数を使用してPythonのリストをJSON形式の文字列に変換します.

data = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Who won the world series in 2020?"}
]

json_string = json.dumps(data)
print(json_string)

この例では,dataという名前のPythonリストをJSON形式の文字列に変換し,それをjson_stringという変数に保存しています.

また,json.dumps関数にはいくつかのオプション引数があります.例えば,indentを指定することで,整形された(インデントされた)JSON文字列を取得することができます:

json_string_pretty = json.dumps(data, indent=4)
print(json_string_pretty)

これにより,出力は読みやすい形式で表示されます.


User

単純に str(data) とするのと異なりますか?


ChatGPT

str(data)json.dumps(data)は,多くの場合において似た結果を返すことがありますが,実際には異なる振る舞いを持ち,それぞれ異なる目的に最適化されています.以下にその主な違いをいくつか示します.

1. Unicode Handling:

json.dumps()は,Unicode文字列を適切にエンコードしてJSON互換のエスケープシーケンスにします.一方,str()はPythonのUnicode文字列の内部表現をそのまま返すことがあります.

data = {"key": "あいうえお"}
print(str(data))          # Python 2では "{'key': u'\u3042\u3044\u3046\u3048\u304a'}"
print(json.dumps(data))   # '{"key": "あいうえお"}'

2. Boolean Values:

json.dumps()は,PythonのTrueFalseをそれぞれtruefalseとしてJSONに変換します.str()は,Pythonの表現をそのまま返します.

data = {"key": True}
print(str(data))          # "{'key': True}"
print(json.dumps(data))   # '{"key": true}'

3. Single vs Double Quotes:

Pythonの辞書を文字列として表現するとき,str()はシングルクォート(‘)を使用します.しかし,JSON標準はプロパティ名や文字列値にダブルクォート(“)を使用するため,json.dumps()はダブルクォートを使用します.

data = {"key": "value"}
print(str(data))          # "{'key': 'value'}"
print(json.dumps(data))   # '{"key": "value"}'

これらの違いから,PythonのデータをJSONとして扱いたい場合や,他のシステムとの互換性を確保したい場合は,json.dumps()を使用するのが最適です.一方,デバッグ目的などでPythonの内部表現を文字列として見たいだけの場合は,str()を使用することができます.

また,Chat Completion API へ送るメッセージデータの中のroleの使い方についても ChatGPT に質問してみました.

User

Chat Completion API の渡し値の role における system と assistant の違いをおしえて?


ChatGPT

Chat Completion APIの文脈におけるroleの値systemassistantは,入力メッセージのコンテキストを形成するためのものです.各roleは以下のような意味を持ちます:

1. system:

  • systemの役割は,環境やセッションの全体的な指示やコンテキストを設定するためのものです.
  • このメッセージは,モデルに特定の動作やコンテキストを伝える指示として機能します.たとえば,ユーザーとの会話のスタイルやモードを指定する際に使用されることがあります.
  • 例: {"role": "system", "content": "You are an assistant that speaks like Shakespeare."}

2. assistant:

  • assistantの役割は,モデル自体の前の発言やレスポンスを示すためのものです.
  • これは,継続的な会話のコンテキストにおいて,モデルが以前にどのような回答や情報を提供したかを示すために使用されます.

各役割は,APIを通じてモデルとの対話を形成するためのコンテキストを提供する役割を果たします.たとえば,モデルにシェイクスピアのように話すように指示するsystemメッセージの後,ユーザーの質問に対するモデルの回答はシェイクスピアのスタイルで形成される可能性があります.

このように,roleの値を使用して,モデルとの対話のコンテキストや動作を微調整することができます.

ソースコード

文脈をふまえたチャット対応を行った ROS Service プログラムの作成や変更を行ったファイルは次のとおりです.

  • srv / ChatCompletion.srv
  • scripts / openai_chat_server.py
  • scripts / openai_chat_client.py
  • launch / openai_chat.launch

以下,それぞれのファイル内のコードを記載して少し説明をします.

srv / ChatCompletion.srv

先述したように Chat Completion API とやり取りする Python データ構造データを JSON 形式の文字列にして ROS Service との通信を行います.Chat Completion API に渡すデータをmessages,受取るデータをresponseというstring型にしています.

string messages
---
string response

scripts / openai_chat_server.py

ROS Service chat_service としてデータを JSON 形式の文字列として授受し,Chat Completion API へのアクセスを行っています.

#!/usr/bin/env python3

import rospy
import openai
import json

from openai_ros.srv import ChatCompletion, ChatCompletionResponse


def handle_chat_request(req):

    openai.api_key = rospy.get_param('~key')
    model = rospy.get_param('~model')
    
    res = ChatCompletionResponse()
    messages = json.loads(req.messages)
    
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages
    )
    
    return json.dumps(response)


def chat_service():
    rospy.init_node('chat_service')
    rospy.Service('chat_service', ChatCompletion, handle_chat_request)
    rospy.spin()


if __name__ == "__main__":
    chat_service()

scripts / openai_chat_client.py

ChatGPT に教えてもらったように role の「環境やセッションの全体的な指示やコンテキストを設定する」 systemprompt の内容を設定します.

ROS Node 内でユーザからのインプットを受け取り,これまでのメッセージ履歴に追加して,メッセージデータを JSON 文字列として ROS Service chat_service に送っています.サービスからの応答データは JSON 文字列から Python リストに変換されて含まれていた返答メッセージはprint()してメッセージ履歴にも追加することを繰り返しています.

#!/usr/bin/env python3

import sys, json
import rospy

from openai_ros.srv import ChatCompletion, ChatCompletionResponse


def chat_client(prompt="You are a helpful assistant."):
    
    messages = []
    messages.append({"role": "system", "content": str(prompt)})
    
    rospy.wait_for_service('chat_service')
    
    try:
        chat_service_client = rospy.ServiceProxy('chat_service', ChatCompletion)
    except rospy.ServiceException as e:
        print ("Service call failed: %s" % e)

    while not rospy.is_shutdown():
        
        # Get input from the user
        user_input = input("You: ")
        if user_input == "quit":
            exit()
        
        # Add user's input to the history
        messages.append({"role": "user", "content": user_input})
        
        msg_string = json.dumps(messages)
        
        # Call the service
        try:
            res_msg = chat_service_client(msg_string)
        except rospy.ServiceException as e:
            print ("Service call failed: %s" % e)
        
        response = json.loads(res_msg.response)
        
        content = response["choices"][0]["message"]["content"]
        role = response["choices"][0]["message"]["role"]
        token = response["usage"]["total_tokens"]
        
        print("\n%s(token:%d): %s\n" % (role, token, content))
        
        # Add GPT's response to the history
        messages.append({"role": str(role), "content": str(content)})


if __name__ == "__main__":
    if len(sys.argv) == 2:
        prompt = str(sys.argv[1])
    else:
        prompt = "You are a helpful assistant."
    
    print("Type \'quit\' to quit.\n")
    print("For \'system\': %s\n" % (prompt))
    rospy.init_node('chat_client')
    
    chat_client(prompt=prompt)

launch / openai_chat.launch

環境変数から OpenAI API Key を読み取って ROS Parameter に設定し, Chat Completion API にアクセスする ROS Service を実行します.

<launch>
  
  <arg name="key" default="$(env OPENAI_API_KEY)" />
  <arg name="model" default="gpt-3.5-turbo" />

  <node pkg="openai_ros" type="openai_chat_server.py" name="openai_chat" output="screen">
    <param name="key" value="$(arg key)" />
    <param name="model" value="$(arg model)" />
  </node>
  
</launch>

CMakeLists.txt

今回の ROS Service の定義ファイルを記述して使えるようにします.

add_service_files(
  FILES
  Completion.srv
  ChatCompletion.srv
)

generate_messages(

実行例

文脈をふまえたチャットへ対応させた ROS Service プログラムの実行例が次になります.

ターミナル1 : ROS Service サーバの起動

robotuser@robotuser-PC:~/openai_ws$ source ~/openai_ws/devel/setup.bash
robotuser@robotuser-PC:~/openai_ws$ export OPENAI_API_KEY="sk-..."
robotuser@robotuser-PC:~/openai_ws$ roslaunch openai_ros openai_chat.launch

ターミナル2 : ROS チャットノードの実行

robotuser@robotuser-PC:~/openai_ws$ source ~/openai_ws/devel/setup.bash
robotuser@robotuser-PC:~/openai_ws$ rosrun openai_ros openai_chat_client.py
Type 'quit' to quit.

For 'system': You are a helpful assistant.

You: hello

assistant(token:27): Hello! How can I assist you today?

You: ハロー

assistant(token:56): こんにちは!どのようにお手伝いできますか?

You: ボン・ニュイ

assistant(token:115): ボン・ニュイ!夜にちょっと早い挨拶ですね.何かお手伝いできることはありますか?

You: こんばんは をフランス語で言うと?

assistant(token:163): 「こんばんは」をフランス語で言うと「Bonsoir」となります.

You: bon nuit は日本語では?

assistant(token:224): 「bon nuit」はフランス語で「良い夜」を意味しますが,日本語では「おやすみなさい」と訳されます.

You: 間違えていました.ボンソワール

assistant(token:338): 間違いありません.「ボンソワール」はフランス語で「こんばんは」という意味です.おやすみなさいの言い方は「ボンヌィ」となります.ごめんなさい,混乱を招いてしまいました.どうかお許しください.

You: quit
robotuser@robotuser-PC:~/openai_ws$ 

このように今回は ROS Node 内でのチャット会話になっています.

前回ベースにしている https://github.com/davesarmoury/openai_ros が1問1答形式の Completion API にアクセスする ROS Service を提供していたことから Chat Completion API にアクセスする ROS ソフトウェアも ROS Service 形式で作成してみました.

比較的長文で1問1答を行う Completion API であれば ROS Service や ROS Action (actionlib) のソフトウェアにするのも一理あるように思えます.しかし短文のチャットを扱う Chat Completion API へのアクセスであれば ROS Topic を介したメッセージのやり取りの方が ROS ノード内のチャット会話に限られず,より ROS 親和的かつよりシンプルな構成になるのでは?と思いました.

本シリーズ次回の記事では冒頭で述べました文脈をふまえたチャットを実現する2つの方法のもう一方の「ChatGPT と ROS – ROS Topic を介した ChatGPT チャットプログラム」を作成した様子を紹介する予定です.

今回の記事はここまでです.

著者:yamamoto.yosuke

ChatGPT と ROS – 文書生成 ROS ラッパー生成編(Chat Completion API)

本シリーズ前回の記事 ChatGPT と ROS – 文書生成 ROS ラッパー利用編(Completion API) では OpenAI API の ROS ラッパーの中で Completion API を利用している ROS1 の Python ラッパ https://github.com/davesarmoury/openai_ros を使ってみました.

今回は OpenAI の Chat Completion API を利用した ROS ラッパ Python プログラムを Web サービスの方の ChatGPT の助けをかりながら作成した様子を紹介します.

OpenAI の文書生成 API 概要

本シリーズ第1回の記事 ChatGPT と ROS – 調査編 でもふれましたが OpenAI の文書生成 API について簡単にまとめますと,「1問1答形式」の Completion API と,「対話した文脈を含むチャット対話形式」の Chat Completion API の2つがあります.

  • OpenAI の文書生成 API
    • Completion API : 1問1答形式
    • Chat Completion API : 文脈を含むチャット対話形式

前回の記事ではこの2つのうち「1問1答」形式の Completion API を利用ました.今回の記事ではもう一方の「チャット対話」形式のインタフェースである Chat Completion API を ROS から利用してみます.

開発・実行環境

今回は Web サービスの ChatGPT に Chat Completion API を使ったプログラムを生成してもらいながら進めましたのでそれも含めて開発・実行環境の構成は次のようになっています.

  • Ubuntu 20.04
  • ROS Noetic
  • OpenAI ChatGPT のアカウントを持っている(今回筆者は ChatGPT-4 を利用)
  • OpenAI API の利用が有効なアカウントを持っている
    • API Key を取得済

ChatGPT でのプログラム生成

まずは ChatGPT の Web サービスに ChatGPT の Python API にアクセスするための Python プログラムを書いてもらいました.

User

ChatGPT の Python API を用いたアクセスプログラムを書いてください.


ChatGPT

まず,OpenAIのPythonクライアントライブラリをインストールする必要があります.次のコマンドでインストールできます.

pip install openai

そして,以下はOpenAIのGPTを使用するための基本的なPythonコードです.この例では,プロンプトとして”Translate the following English text to French: ‘{}'”を使用し,その'{}’の部分に翻訳したい英文を挿入しています.

import openai

openai.api_key = 'your-api-key'

response = openai.ChatCompletion.create(
  model="gpt-4.0-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Translate the following English text to French: '{}'"}
    ]
)

print(response['choices'][0]['message']['content'])

上記のコードは,APIキーを設定し,特定のモデル(この場合は”gpt-4.0-turbo”)を指定して,ChatCompletion APIを呼び出す基本的な構造を示しています.messagesパラメータは会話の履歴を表し,最初のメッセージは通常,モデルに役割(この場合は”helpful assistant”)を設定するためのシステムメッセージです.ユーザーメッセージはその後に続きます.

注意: ‘your-api-key’の部分は,OpenAIから提供される実際のAPIキーに置き換える必要があります.また,APIの使用は料金が発生しますので,公式ドキュメンテーションを確認して使用制限とコストを理解することが重要です.

なお,GPT-4のリリース後もAPIの基本的な使い方はこれまでと同様ですが,詳細な情報や更新内容についてはOpenAIの公式ドキュメンテーションをご覧ください.

次にこの ChatGPT にアクセスする Python コードを ROS の Service に対応させたプログラムを作成してもらいました.

User

この Python プログラムから ROS の service プログラムラッパーを作成してください.


ChatGPT

ROS (Robot Operating System)は,ロボットのためのフレームワークで,様々なハードウェアやソフトウェアの要素を組み合わせて使うことができます.ここでは,PythonのOpenAI GPT-4クライアントをROSサービスとしてラップする基本的な例を示します.

まず,適切なメッセージタイプを使用するためのsrvファイルを作成します.この例では,リクエストとレスポンスが共に一つの文字列を持つシンプルなサービスを定義します.

# GptService.srv
string input
---
string output

次に,このサービスを実装するPythonのROSノードを作成します.このノードは,指定された文字列を翻訳するサービスを提供します.

#!/usr/bin/env python
import rospy
from openai_ros.srv import GptService, GptServiceResponse
import openai

def handle_gpt_request(req):
    openai.api_key = 'your-api-key'
    
    response = openai.ChatCompletion.create(
        model="gpt-4.0-turbo",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "Translate the following English text to French: '{}'".format(req.input)}
        ]
    )

    return GptServiceResponse(response['choices'][0]['message']['content'])

def gpt_service():
    rospy.init_node('gpt_service')
    s = rospy.Service('gpt_service', GptService, handle_gpt_request)
    print("Ready to translate English text to French.")
    rospy.spin()

if __name__ == "__main__":
    gpt_service()

このPythonスクリプトは,ROSノードgpt_serviceを作成し,それがGptServiceサービスを提供するようにします.サービスリクエストが来ると,handle_gpt_request関数が呼び出され,その中でOpenAIのGPT-4クライアントが使われてリクエストされたテキストを翻訳します.

このスクリプトをROSノードとして実行するためには,そのファイルに実行可能なパーミッションを与える必要があります.以下のコマンドで実行可能なパーミッションを与えることができます:

chmod +x gpt_service.py

また,OpenAIのAPIキーを設定する部分では,実際のキーに’your-api-key’を置き換える必要があります.そして,APIの使用は料金が発生しますので,公式ドキュメンテーションを確認して使用制限とコストを理解することが重要です.

なお,上記のコードはあくまで一例であり,具体的な使用シーンや要件によりますので,適宜修正や拡張を行ってください.

ChatGPT に最初に生成してもらった Python プログラムにおいてプロンプトの内容が固定されているため,それを基に生成した ROS ラッパープログラムも固定プロンプトへの応答結果を出すだけになってしまいました.

そこでプロンプトを変更可能なようにプログラムを変更してもらいました.

User

ChatGPT に問うプロンプトを変えられるようにプログラムを変更してください.


ChatGPT

もちろんです.以下に,GPTサービスリクエストにプロンプトを含めるように改変したROSサービスの例を示します.

まず,新たなsrvファイルを作成します.この例では,リクエストにプロンプトとインプットの2つの文字列を持つサービスを定義します.

# GptService.srv
string prompt
string input
---
string output

次に,このサービスを実装するPythonのROSノードを作成します.

#!/usr/bin/env python
import rospy
from openai_ros.srv import GptService, GptServiceResponse
import openai

def handle_gpt_request(req):
    openai.api_key = 'your-api-key'
    
    response = openai.ChatCompletion.create(
        model="gpt-4.0-turbo",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "{} '{}'".format(req.prompt, req.input)}
        ]
    )

    return GptServiceResponse(response['choices'][0]['message']['content'])

def gpt_service():
    rospy.init_node('gpt_service')
    s = rospy.Service('gpt_service', GptService, handle_gpt_request)
    print("Ready to handle GPT-4 requests.")
    rospy.spin()

if __name__ == "__main__":
    gpt_service()

このPythonスクリプトは,ROSノードgpt_serviceを作成し,それがGptServiceサービスを提供するようにします.サービスリクエストが来ると,handle_gpt_request関数が呼び出され,その中でOpenAIのGPT-4クライアントが使われてリクエストされたプロンプトとテキストを処理します.

上記のコードを実行する前に,Pythonスクリプトに実行可能なパーミッションを与えることを忘れないでください.

ここまでの ChatGPT の応答で ROS の Python プログラムとして動きそうな感じのソースコードが生成されたように思いましたので実際に実行しながら修正してみることにしました.

ChatGPT が生成したプログラムの修正

今回は ChatGPT と ROS – 文書生成 ROS ラッパー利用編(Completion API) で利用した ROS パッケージ https://github.com/davesarmoury/openai_ros をベースに Chat Completion API を利用する機能を付け加えるかたちで進めました.

ChatGPT が生成した Chat Completion API を利用する ROS Python プログラムを使って Chat Completion API を利用できるよう ROS パッケージに変更を加えた箇所をまとめると次のようになります.

  • openai_chat_node.py の追加
    • ChatGPT が生成したコードからの修正点
      • #!/usr/bin/env python
        • → Python3 に #!/usr/bin/env python3
      • openai.api_key = 'your-api-key'
        • → ROS パラメータから取得する方法に変更
          openai.api_key = rospy.get_param('~key')
      • model="gpt-4.0-turbo",
        • → GPT 3.5 に変更 model="gpt-3.5-turbo",
      • print("Ready to handle GPT-4 requests.")
        • → GPT 3.5 に変更 print("Ready to handle GPT-3.5 requests.")
  • GptService.srv の追加
    • ChatGPT が生成したコードをそのまま利用
  • CMakeLists.txs 内に GptService.srv の記述追加
  • openai_chat.launch の追加
    • 主に OpenAI API Key を ROS パラメータとするために作成

openai_chat_node.py

#!/usr/bin/env python3
import rospy
from openai_ros.srv import GptService, GptServiceResponse
import openai

def handle_gpt_request(req):
#    openai.api_key = 'your-api-key'
    openai.api_key = rospy.get_param('~key')
    
    response = openai.ChatCompletion.create(
#        model="gpt-4.0-turbo",
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "{} '{}'".format(req.prompt, req.input)}
        ]
    )

    return GptServiceResponse(response['choices'][0]['message']['content'])

def gpt_service():
    rospy.init_node('gpt_service')
    s = rospy.Service('gpt_service', GptService, handle_gpt_request)
#    print("Ready to handle GPT-4 requests.")
    print("Ready to handle GPT-3.5 requests.")
    rospy.spin()

if __name__ == "__main__":
    gpt_service()

プログラムの本筋の部分は ChatGPT が生成したコードから修正の必要はありませんでした.

GptService.srv

# GptService.srv
string prompt
string input
---
string output

CMakeLists.txt

add_service_files(
  FILES
  Completion.srv
  GptService.srv
)

GptService.srv のサービスが利用できるように CMakeLists.txt に加筆しました.このあたりの修正箇所の洗い出しも ChatGPT に問うてみるのも修正規模が大きい場合にはありかもしれません.

openai_chat.launch

<launch>
  <arg name="key" default="$(env OPENAI_API_KEY)" />
  <arg name="max_tokens" default="256" />
  <arg name="model" default="gpt-4.0-turbo" />

  <node pkg="openai_ros" type="openai_chat_node.py" name="openai_chat" output="screen">
    <param name="key" value="$(arg key)" />
    <param name="max_tokens" value="$(arg max_tokens)" />
    <param name="model" value="$(arg model)" />
  </node>  
</launch>

モデルを GPT-3.5 と GPT-4 で launch オプションで切り替えて使おうかと思っていたのですが,Web と API への課金は別らしく今回は API では GPT-3.5 のみ利用可能な状況でしたので openai_chat_node.py にモデル名を直書きしたまま使ってしまいました.

修正したプログラム実行の様子

roslaunch openai_ros openai_chat.launch を起動してからもう1つのターミナルで ROS サービスで rosservice call /gpt_service '{prompt: "(プロンプト)", input: "(内容)"}'
output: "Mon nom est Robotuser."
のように利用します.

ターミナル1

robotuser@robotuser-PC:~/openai_ws$ source ~/openai_ws/devel/setup.bash
robotuser@robotuser-PC:~/openai_ws$ roslaunch openai_ros openai_chat.launch 
... logging to /home/robotuser/.ros/log/9d61ced2-f54d-11ed-b5ca-c10df8d90fa9/roslaunch-robotuser-PC-41157.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://robotuser-PC:35595/

SUMMARY
========

PARAMETERS
 * /openai_chat/key: sk-3JDluBbxsNuIhi...
 * /openai_chat/max_tokens: 256
 * /openai_chat/model: gpt-4.0-turbo
 * /rosdistro: noetic
 * /rosversion: 1.16.0

NODES
  /
    openai_chat (openai_ros/openai_chat_node.py)

auto-starting new master
process[master]: started with pid [41165]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 9d61ced2-f54d-11ed-b5ca-c10df8d90fa9
process[rosout-1]: started with pid [41175]
started core service [/rosout]
process[openai_chat-2]: started with pid [41182]
Ready to handle GPT-3.5 requests.

ターミナル2

robotuser@robotuser-PC:~/openai_ws$ source ~/openai_ws/devel/setup.bash
robotuser@robotuser-PC:~/openai_ws$ rosservice call /gpt_service '{prompt: "Translate following to French:", input: "My name is Robotuser."}'
output: "Mon nom est Robotuser."
robotuser@robotuser-PC:~/openai_ws$ rosservice call /gpt_service '{prompt: "Translate following to Spanish:", input: "My name is Robotuser."}'
output: "Mi nombre es Robotuser."
robotuser@robotuser-PC:~/openai_ws$ rosservice call /gpt_service '{prompt: "Translate following to Japanese:", input: "My name is Robotuser."}'
output: "\u79C1\u306E\u540D\u524D\u306F\u30ED\u30DC\u30C3\u30C8\u30E6\u30FC\u30B6\u30FC\u3067\
  \u3059\u3002"
robotuser@robotuser-PC:~/openai_ws$ 
  • 注)コマンド全体は横スクロールにて表示してください.

このサービス利用例では “My name is Robotuser.” をフランス語,スペイン語,日本語に翻訳するよう各プロンプトを送りました.
日本語への翻訳指示した output が文字コード化していたので Unicode 変換すると次のようになりました.

私の名前はロボットユーザーです.

このように ChatGPT の Web サービスを利用してコードを生成してもらい,OpenAI の Chat Completion API を ROS から利用できるようになりました.

しかし今回のプログラムは Chat Completion API を用いているものの「1問1答」形式の使い方をしていて,それは Completion API を利用している場合と大きく変わらず, “文脈” をふまえた「チャット」形式ではありませんでした.

本シリーズ次回の記事では今回の Chat Completion API を利用する ROS サービスプログラムを文脈をふまえた「チャット」をする ROS プログラムに改造した様子をお伝えする予定です.

著者:yamamoto.yosuke

ChatGPT と ROS – 文書生成 ROS ラッパー利用編(Completion API)

本シリーズ前回の記事 ChatGPT と ROS – 調査編 では ChatGPT の ROS を介した利用について少し調べてみたことをお伝えしました.

今回は OpenAI API の ROS ラッパーの中で Completion API を利用している ROS1 の Python ラッパ https://github.com/davesarmoury/openai_ros を使ってみた様子を紹介します.

実行環境

今回は次の環境で OpenAI API の ROS を介した実行を行っています.

  • Ubuntu 20.04
  • ROS Noetic
  • OpenAI API の利用が有効なアカウントを持っている
    • API Key を取得済

OpenAI API は新規登録後 3ヶ月 の期限がありますが 5ドル分 の無料クレジットが付与されるのでお試し利用することができます.(2023年8月中旬時点)

API Key の取得は OpenAI API の Web ページでログインした状態で下記リンク先の API keys のページから取得します.

インストールとビルド

実行環境の準備が整いましたらインストールとビルドを行います.

ROS のインストール

ROS は既にインストールされているようでしたら改めてインストールする必要はありません.

加えて下記の catkin ツール関係もインストールしておきます.

$ sudo apt install python3-osrf-pycommon python3-catkin-tools

OpenAI Python ライブラリのインストール

OpenAI の Python ライブラリが必要ですので pip からインストールします.

$ sudo apt install python3-pip
$ pip install --upgrade openai

ワークスペースの作成とビルド

今回は openai_ws という名前のワークスペースを作成してソースコードのクローンとビルドを行っています.

$ mkdir -p ~/openai_ws/src
$ cd ~/openai_ws/src/
$ git clone https://github.com/davesarmoury/openai_ros.git
$ cd ~/openai_ws/
$ rosdep install -y -r --from-paths src --ignore-src
$ catkin build
$ source ~/openai_ws/devel/setup.bash

openai_ros の実行

ワークスペースでビルドした openai_ros の ROS プロセスを実行します.

まず1つ目のターミナルで API Key を環境変数 OPENAI_API_KEY として export で設定しておきます.$ export OPENAI_API_KEY="sk-..."sk-... の部分は各自の OpenAI API アカウントで作成した API Key の内容に置き換えてください.

OpenAI の Completion API を利用するための ROS サービスサーバを実行するために openai.launch を起動します.

ターミナル 1

$ source ~/openai_ws/devel/setup.bash
$ export OPENAI_API_KEY="sk-..."
$ roslaunch openai_ros openai.launch max_tokens:=256

2つ目のターミナルから1つ目のターミナルで実行している OpenAI Completion API の ROS サービスにプロンプトを “Write a poem about OpenAI” としてサービスコールを行います.

ターミナル 2

$ source ~/openai_ws/devel/setup.bash
$ rosservice call /get_response '{prompt: "Write a poem about OpenAI"}'
finish_reason: "stop"
text: "\n\nOpenAI, a force of nature,\nA tool of the future,\nA way to explore the unknown,\n\
  A way to make the world better.\n\nA way to make machines smarter,\nA way to make\
  \ them think,\nA way to make them learn,\nA way to make them act.\n\nA way to make\
  \ them understand,\nA way to make them act,\nA way to make them do,\nA way to make\
  \ them react.\n\nOpenAI, a force of nature,\nA tool of the future,\nA way to explore\
  \ the unknown,\nA way to make the world better."
model: "text-davinci-003"
completion_tokens: 134
prompt_tokens: 6
total_tokens: 140

Completion API から ROS サービス経由で応答が帰ってきました.text: に応答内容があります.

text 部分の改行コードなどを除くと次のようになっています.

OpenAI, a force of nature,
A tool of the future,
A way to explore the unknown,
A way to make the world better.

A way to make machines smarter,
A way to make them think,
A way to make them learn,
A way to make them act.

A way to make them understand,
A way to make them act,
A way to make them do,
A way to make them react.

OpenAI, a force of nature,
A tool of the future,
A way to explore the unknown,
A way to make the world better.

…だそうです.

プロンプトを日本語で例えば '{prompt: "OpenAI についての40字以 内のポエムを書いてください"}' 記述しても応答はありますが rosservice のコールの応答をそのままコンソール出力した状態ですと text: 内は文字コード化されていて可読性がありませんでした.

注)コマンド全文は枠内を横スクロールして表示してください.

$ rosservice call /get_response '{prompt: "OpenAI についての40字以 内のポエムを書いてください"}'
finish_reason: "stop"
text: "\n\nOpenAI\u306F\u3001\u4EBA\u985E\u306E\u672A\u6765\u3092\u5B88\u308B\u305F\u3081\
  \u306B\u3001AI\u3092\u4F7F\u3063\u3066\u6280\u8853\u3092\u767A\u5C55\u3055\u305B\
  \u308B\u3002\u79C1\u305F\u3061\u306F\u3001AI\u3092\u4F7F\u3063\u3066\u3001\u3088\
  \u308A\u826F\u3044\u672A\u6765\u3092\u5275\u9020\u3057\u3088\u3046\u3002"
model: "text-davinci-003"
completion_tokens: 81
prompt_tokens: 31
total_tokens: 112
$

文字コード表示 解決法1 – ascii2uni を使う

文字コード表示を文字コード変換の ascii2uni で解決してみます.ascii2uni を使うため uni2ascii をインストールします.

$ sudo apt install uni2ascii

ターミナル 2

ROS サービスコールの結果に対して | ascii2uni -a U -q をパイプしてコード変換を行います.

注)コマンド全文は枠内を横スクロールして表示してください.

$ rosservice call /get_response '{prompt: "OpenAI についての40字以 内のポエムを書いてください"}' | ascii2uni -a U -q
finish_reason: "stop"
text: "\n\nOpenAIは,人類の未来を守るため\
  に𰀚Iを使って技術を発展させ\
  る.私たちは𰀚Iを使って,よ\
  り良い未来を創造しよう."
model: "text-davinci-003"
completion_tokens: 81
prompt_tokens: 31
total_tokens: 112
$ 

一部文字化けしてしまっているようです.おそらく \u3001(=読点「,」) + AI\u3001A + I と判断して違う文字を表示しようとしているようです.「文字コードの”読点”」+「平文英数字」の組み合わせ以外は大体 ascii2uni で表示できそうです.

文字コード表示 解決法2 – Python を使う

文字コード化されたものは Python の print() 内で解決されて可読性のある日本語の状態で出力されますので,今回の openai_ros の ROS サービスを Python からコールするプログラム openni_get_completion.py を書きました.

openni_get_completion.py

#!/usr/bin/env python3

import sys
import rospy

from openai_ros.srv import Completion, CompletionResponse


def get_response_client(prompt):
  request = '{prompt: ' + str(prompt) +'}'
  rospy.wait_for_service('get_response')
  try:
    get_response = rospy.ServiceProxy('get_response', Completion)
    response = get_response(request, 0)
    return response
  except rospy.ServiceException as e:
    print ("Service call failed: %s"%e)


if __name__ == "__main__":
  if len(sys.argv) == 2:
    prompt = str(sys.argv[1])
  else:
    prompt = "Write a poem about OpenAI"
  
  print("Prompt: %s\n" % (prompt))
  
  response = get_response_client(prompt)
  
  print("Response: \n%s\n" % (response))
  print("Text: %s\n" % (response.text))

先程の ターミナル1 で openai.launch を実行している状態で ターミナル2 から openni_get_completion.py を実行します.

ターミナル 2

$ source ~/openai_ws/devel/setup.bash
$ rosrun openai_ros openai_get_completion.py 
Prompt: Write a poem about OpenAI

Response: 
finish_reason: "stop"
text: "\n\nOpenAI, a force of nature,\nA powerful tool of creation,\nAble to learn and adapt,\n\
  Able to think and create.\n\nA tool of the future,\nA tool of the present,\nA tool\
  \ of the past,\nA tool of the ages.\n\nA tool of the people,\nA tool of the world,\n\
  A tool of the universe,\nA tool of the gods.\n\nOpenAI, a force of nature,\nA powerful\
  \ tool of creation,\nAble to learn and adapt,\nAble to think and create."
model: "text-davinci-003"
completion_tokens: 124
prompt_tokens: 11
total_tokens: 135

Text: 

OpenAI, a force of nature,
A powerful tool of creation,
Able to learn and adapt,
Able to think and create.

A tool of the future,
A tool of the present,
A tool of the past,
A tool of the ages.

A tool of the people,
A tool of the world,
A tool of the universe,
A tool of the gods.

OpenAI, a force of nature,
A powerful tool of creation,
Able to learn and adapt,
Able to think and create.

$ 

実行時にプロンプトの引数を渡していないのでプログラム内に書かれてるデフォルトのプロンプト “Write a poem about OpenAI” に対する英語のポエムが返ってきています.英語でも Python の print() で出力すると改行コードが見えなくなるので読みやすくなっています.

次は引数として日本語のプロンプト “OpenAI についての40字以内のポエムを書いてください.” を渡して openni_get_completion.py を実行します.

ターミナル 2

$ rosrun openai_ros openai_get_completion.py "OpenAI についての40字以内のポエムを書いてください."
Prompt: OpenAI についての40字以内のポエムを書いてください.

Response: 
finish_reason: "stop"
text: "\n\nOpenAI\u306F\u672A\u6765\u3092\u7167\u3089\u3059\u5149\u3001\u672A\u6765\u3092\
  \u5207\u308A\u958B\u304F\u92ED\u3044\u5203\u3002\u79C1\u305F\u3061\u306E\u672A\u6765\
  \u3092\u8C4A\u304B\u306B\u3057\u3066\u304F\u308C\u308B\u3002"
model: "text-davinci-003"
completion_tokens: 58
prompt_tokens: 39
total_tokens: 97

Text: 

OpenAIは未来を照らす光,未来を切り開く鋭い刃.私たちの未来を豊かにしてくれる.

$ 

日本語でも可読性のある整形された状態で読めました.そうなんですね…

ポエムはさておき,openai_ros パッケージを利用して OpenAI の Completion API を ROS から英語と日本語のどちらでも利用することができました.

今回の記事はここまでです.


本シリーズ次回の記事は OpenAI の Chat Completion API を ROS から利用する Python プログラムを OpenAI の ChatGPT に教えてもらいながら作成した様子を紹介する予定です.

著者:yamamoto.yosuke

ChatGPT と ROS – 調査編

文書生成などで何かと話題の ChatGPT の ROS を介した利用について少し調べてみました.

本記事の筆者は AI に興味はあるものの利用したことがほとんどない立場ですが,ChatGPT などについて調べてみると AI 初心者でも OpenAI の API と ROS を介して文章を生成することができました.加えて ChatGPT の文章生成機能の力を借りてその API を使った ROS ラッパープログラムも作ることができました.その様子を次のようなトピックで複数回に分けて記事にします.

  1. 調査編(本記事)
  2. 文書生成 ROS ラッパー利用編(Completion API)
  3. 文書生成 ROS ラッパー生成編(Chat Completion API)

OpenAI/ChatGPT の API

ChatGPT を提供しているのは OpenAI 社ですので “OpenAI” や “ChatGPT” でネット検索してみると OpenAI Gym の利用だったり,ChatGPT だったりといろいろとあるようでした.全く体系的・網羅的ではないと思うのですが,今回調査してみて得られた情報を大まかに分類してみると次のような構成になりました.

  • 強化学習を行うための OpenAI Gym
  • 文書生成系の OpenAI API も複数
    • Chat Completion API
    • Completion API

まず OpenAI Gym というのは強化学習を行うためのものでロボットの動作経路の学習などに用いられていて,今回の目的としていた文書生成とは異なる機能を提供しているようです.文書生成 API も Completion API と Chat Completion API と複数に分かれていました.

Web ページから ChatGPT-4 に Completion と Chat Completion の API の違いを聞いてみました.

OpenAI API の Completion API と Chat Completion API の違いを教えてください.

Completion APIとChat Completion APIは,OpenAIのGPT(Generative Pretrained Transformer)をベースとしたテキスト生成APIです.しかし,それぞれの使用方法や特性は少し異なります.

Completion API:

  • Completion APIは,提供されたプロンプトに対する続きのテキストを生成します.つまり,モデルに入力を1つ与え,それに対する出力を1つ得ます.
  • このAPIは,多くの一般的なテキスト生成タスクに使用できます.例えば,文章の完成,質問への答え,電子メールのドラフト作成などです.

Chat Completion API:

  • Chat Completion APIは,会話形式のテキスト生成に最適化されています.複数のメッセージを入力として受け取り,それに基づいて応答を生成します.
  • それぞれのメッセージには,「role」(’system’,’user’,’assistant’)と「content」があります.’system’ メッセージは,チャット全体のコンテキストを設定します.’user’ メッセージはモデルに指示を出し,’assistant’ メッセージはモデルの先行の応答を提供します.
  • このAPIは,対話型のタスクやマルチターンの会話に特に適しています.

使用するAPIは,あなたがどのようなタスクを実行したいか,またはどのような出力を期待しているかによって異なります.

Chat Completion は名前の「チャット」のとおり文脈を含む対話形式で,Completion は1問1答形式のようです.

Completion と Chat Completion の違いについて対比的に解説されている記事もあり参考になりました.

OpenAI/ChatGPT と ROS

ROS では OpenAI/ChatGPT がどのように使われているのか?ということで調べてみると,まず ROS Wiki にある openai_ros は強化学習の OpenAI Gym の機能を利用するパッケージのようでした.

また GitHub 内で “openai” と “ros” を組み合わせて検索してみると https://github.com/search?q=openai+ros&type=repositories&p=1 かなりヒットします.そのうち文書生成に関するリポジトリをピックアップしてリストにします.

これらの既存の OpenAI API の ROS ラッパーの中で Completion API を利用している ROS1 の Python ラッパ https://github.com/davesarmoury/openai_ros を使ってみた様子を次回の OpenAI と ROS の記事でお伝えする予定です.

今回の記事はここまでです.

著者:yamamoto.yosuke

信州大学の HIRO ロボットソフトウェアが Ubuntu 20.04 + ROS Noetic に対応

先日,長野市にある信州大学の山崎研究室を訪問して Ubuntu 20.04 および ROS Noetic に対応した HIRO ロボットソフトウェアを納品しました.

山崎研究室では HIRO で AI を用いたロボット制御などを行っているとのことで,今回は GPU ボードを搭載したワークステーションに Ubuntu 20.04 および ROS Noetic に対応した HIRO ロボットソフトウェアをインストールしました.

HIRO ロボットは新しいソフトウェアを得て今後も活躍してくれることと思います.


なお, 今回の HIRO とともに TORK では NEXTAGE OPEN も Ubuntu 20.04 および ROS Noetic に対応したロボットソフトウェアの動作確認をしました.

NEXTAGE OPEN や HIRO を Python3 で動かすことや ROS Noetic で使うことにご興味がありましたら,TORK( info@opensource-robotics.tokyo.jp )にお問い合わせいただけたらと思います.


関連記事: 信州大学 山崎研究室でHiroに会いました!

信州大学 山崎研究室でHiroに会いました!

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(14)MoveIt の動モデルの作成

本シリーズ前回の記事 Gazebo/MoveIt のための 3D モデリング(13)MoveIt の静モデルの作成 では CAD などからエクスポートしたメッシュデータファイルを MoveIt の静モデルとしてモデルファイルに組み込んで表示する方法を紹介しました.

今回は洗濯機の URDF (Unified Robot Description Format) モデルにドアのヒンジなどの動く箇所を設定して,より機械らしい(ロボットに近い)モデルにする様子を紹介します.

各リンクモデルメッシュのエクスポート

前回の MoveIt の静モデル作成においては洗濯機全体として1つのメッシュデータファイル( DAE もしくは STL )をエクスポートして利用しました.

MoveIt のリンクモデル作成では各リンクに対応したメッシュをそれぞれエクスポートしてそれぞれのリンクのメッシュファイルとして利用します.

今回の洗濯機モデルでは次の3つのリンク構成にします.

  • 洗濯機本体: main-body
  • 洗濯槽の扉: door
  • 洗剤投入トレイ: tray

今回は「洗濯機本体(main-body)」は元の洗濯機全体の座標系そのままとするので配置の変更はしません.

「洗濯槽の扉(door)」と「洗剤投入トレイ(tray)」の形状データを各リンクの座標系原点に配置します.

元々の洗濯機全体の座標系で配置されたオブジェクトを残しつつ,別途各リンクのエクスポート用にリンク座標系の原点にオブジェクトを配置してメッシュデータとしてエクスポートします.

Rhinoceros では右の図のようにオブジェクトを含む既存のレイヤを右クリックするとメニューに「レイヤとオブジェクトを複製」ができるのでこの機能で複製した先のレイヤで作業すると良いでしょう.

各リンク座標系基準の配置用レイヤでそれぞれの各リンクは次のように配置しました.

  • 洗濯機本体: main-body
    • 位置: 変更なし
    • 角度: 変更なし
  • 洗濯槽の扉: door
    • 位置: 開閉ヒンジ回転軸の中心が座標原点
    • 角度: 開閉ヒンジ回転軸を Z軸 に一致
  • 洗剤投入トレイ: tray
    • 位置: 最後下部エッジ中心が座標原点
    • 角度: 変更なし

各リンク座標基準に配置したオブジェクトを選択して「選択オブジェクトをエクスポート」コマンドから DAE (Collada) か STL 形式でエクスポートします.

Rhinoceros から DAE (Collada) をエクスポートする場合はエクスポートオプションにて
ジオメトリのみを保存」のみにチェック
を入れてファイルを書き出します.

この「ジオメトリのみを保存」でも色や単位情報も保存されます.

今回は表示(visual)用に色付きの DAE ファイルとしてエクスポートし,干渉チェック(collision)用にデータ量を少なくするため粗目の設定で STL ファイルをエクスポートしました.

  • 表示 visual 用 DAE ファイル
    • main-body.dae
    • door.dae
    • tray.dae
  • 干渉チェック collision 用 STL ファイル
    • main-body.stl
    • door.stl
    • tray.stl

リンク機構を含む URDF モデルファイルの作成

DAE や STL のメッシュデータのエクスポートが終わったらリンク機構を含む URDF モデルファイルを作成します.

ファイル配置

3dmodeling-examples/models/urdf/
├── meshes
│   └── washing-machine
│       ├── base_link.dae
│       ├── base_link.stl
│       ├── door.dae
│       ├── door.stl
│       ├── main-body.dae
│       ├── main-body.stl
│       ├── tray.dae
│       └── tray.stl
├── washing-machine_links.urdf
└── washing-machine.urdf

前回作成してメッシュファイルを配置したフォルダ
3dmodeling-examples/models/urdf/meshes
内にエクスポートしたメッシュファイルを配置します.

そしてフォルダ 3dmodeling-examples/models/urdf/ にファイル washing-machine_links.urdf をテキストファイルとして作成してそこにリンク機構を含む URDF モデルを作り込みます.前回作成したファイル washing-machine.urdf を複製してファイルの名前を変更しても良いです.

リンクの相対姿勢・可動域の確認

URDF データで 「洗濯機本体(main-body)」 と 「洗濯槽の扉(door)」 および 「洗剤投入トレイ(tray)」 それぞれの相対的な姿勢の関係とそれぞれの可動域を 「関節(joint)」 として定義しますので, CAD ( Rhinoceros など ) 上で相対姿勢および可動域の測定を行います.

その際,各リンクオブジェクトについて DAE や STL ファイルへのエクスポート用に原点へ移動した配置ではなく元々の洗濯機全体内での配置で調べるということに注意してください.

まずは 「洗濯機本体(main-body)」 と並進的な相対位置関係にある 「洗剤投入トレイ(tray)」 の座標の確認と設定可能な可動域を調べます.

  • 洗濯機本体(main-body) → 洗剤投入トレイ(tray)
    • 相対位置: 洗濯機本体原点から ( 0.0 , -190.00 , 956.00 ) [mm] の位置
    • 相対角度: ゼロ
    • 可動域: 前方へ 200 [mm] とした

次に 「洗濯機本体(main-body)」 と 「洗濯槽の扉(door)」 の相対座標・角度やの確認と設定可能な可動域を調べます.

扉は傾いて洗濯機本体に取り付けられているのでその角度とヒンジ回りの可動域も調べます.Rhinoceros では角度表示がラジアンでもできるのでそれを利用します.

  • 洗濯機本体(main-body) → 洗濯槽の扉(door)
    • 相対位置: 洗濯機本体原点から ( 306.58 , -258.00 , 675.82 ) [mm] の位置
    • 相対角度: 洗濯槽の扉(door)原点から Y軸と平行な軸 回りに 0.1396 [rad] (= 8.0 [deg] )
    • 可動域: ヒンジを軸に閉じた状態から 1.8326 [rad] (= 105 [deg] ) 開くとした

URDF データの作成

リンクモデルに必要なメッシュファイルと情報が揃いましたので URDF ファイルに書き込んだものが次のようになります.

washing-machine_links.urdf
<?xml version="1.0" ?>

<robot name="washing-machine">
  
  <link name="base_link">
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://3dmodeling-examples/models/urdf/meshes/washing-machine/main-body.stl" scale="0.001 0.001 0.001" />
      </geometry>
    </collision>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://3dmodeling-examples/models/urdf/meshes/washing-machine/main-body.dae" />
      </geometry>
    </visual>
  </link>
  
  <link name="door">
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://3dmodeling-examples/models/urdf/meshes/washing-machine/door.stl" scale="0.001 0.001 0.001" />
      </geometry>
    </collision>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://3dmodeling-examples/models/urdf/meshes/washing-machine/door.dae" />
      </geometry>
    </visual>
  </link>
  
  <link name="tray">
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://3dmodeling-examples/models/urdf/meshes/washing-machine/tray.stl" scale="0.001 0.001 0.001" />
      </geometry>
    </collision>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://3dmodeling-examples/models/urdf/meshes/washing-machine/tray.dae" />
      </geometry>
    </visual>
  </link>
  
  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child  link="door"/>
    <origin xyz="0.30658 -0.258 0.67582" rpy="0 -0.1396 0"/>
    <axis xyz="0 0 1" />
    <limit effort="30" velocity="1.0" lower="-1.8326" upper="0.0" />
  </joint>
  
  <joint name="joint2" type="prismatic">
    <parent link="base_link"/>
    <child  link="tray"/>
    <origin xyz="0.0 -0.190 0.956" rpy="0 0 0"/>
    <axis xyz="1 0 0" />
    <limit effort="30" velocity="1.0" lower="0.0" upper="0.200" />
  </joint>
  
</robot>

washing-machine_links.urdf 内のそれぞれの要素について説明します.

  • 5〜48行 <link> 要素: リンクの定義 3つ ( base_link, door, tray )
    • <collision> 要素にメッシュに STL ファイルを使用し単位変換 [mm] → [m]
    • <visual> 要素に DAE メッシュファイルを使用
    • <origin> はリンク内のメッシュの配置なので今回は全てゼロ
  • 50〜56行 <joint> 要素: joint1
    • type で関節形式 revolve (=回転)を設定
    • <parent> 要素で関節を介する親リンク base_link を指定
    • <child> 要素で関節を介する子リンク door を指定
    • <origin> 要素で親子リンク間の相対座標
      • 位置の単位はメートル [m]
      • 姿勢角の正負に注意(座標軸に対して右ねじの法則)
    • <axis> 要素で revolve 関節の回転軸のリンク座標系での方向を設定
    • <limit> 要素
      • effort : 最大トルク – 今回はとりあえずの値
      • velocity : 最大角速度 – 今回はとりあえずの値
      • lower : 可動域下限 – 回転関節なので下限角度で単位はラジアン [rad]
      • upper : 可動域上限 – 回転関節なので上限角度で単位はラジアン [rad]
  • 58〜64行 <joint> 要素: joint2
    • type で関節形式 prismatic (=並進)を設定
    • <parent> 要素で関節を介する親リンク base_link を指定
    • <child> 要素で関節を介する子リンク tray を指定
    • <origin> 要素で親子リンク間の相対座標
    • <axis> 要素で prismatic 関節のリンク座標系での移動方向を設定
    • <limit> 要素
      • effort : 最大力 – 今回はとりあえずの値
      • velocity : 最大速度 – 今回はとりあえずの値
      • lower : 可動域下限 – 並進関節なので下限位置で単位はメートル [m]
      • upper : 可動域上限 – 並進関節なので上限位置で単位はメートル [m]

下記リンク先の ROS Wiki に URDF ファイルの作成方法のチュートリアルがありますので参考にしてください.

URDF モデルの確認

urdf_tutorialdisplay.launch で URDF モデル washing-machine_links.urdf の確認をします.(下記コマンド横スクロールで末尾まで表示)

$ roslaunch urdf_tutorial display.launch model:='$(find 3dmodeling-examples)/models/urdf/washing-machine_links.urdf'

URDF で <joint> 要素を定義して joint_state_publisher ウィンドウ内のスライドバーも有効になっているので関節を動かしてみます.

動画では表示メッシュの動きとともに TF も一緒に動いている様子が見られると思います.

今回の記事はここまでです.

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(13)MoveIt の静モデルの作成

本シリーズ前回の記事 Gazebo/MoveIt のための 3D モデリング(12)Gazebo の静モデルの作成 ではエクスポートしたメッシュデータファイルを Gazebo の静モデルとしてモデルファイルに組み込んで表示する方法を紹介しました.

今回はエクスポートしたメッシュデータファイルを MoveIt の静モデルとしてモデルファイルに組み込んで表示する方法を紹介します.

今回紹介するのは次の2通りの方法です.メッシュを MoveIt GUI で読み込んで障害物とする方法とロボットモデル作成につながる方法の URDF モデルの作成とそれを確認表示する方法です.

  1. MoveIt 空間内の動作計画に対する障害物として STL ファイルまたは DAE ファイルを読み込んで設置
  2. URDF モデルの作成(→ ロボットリンクモデル作成へつながる)

MoveIt 内の障害物モデルとしてのメッシュ読込み

MoveIt には動作計画における障害物として STL ファイルや DAE ファイルをそのまま読み込んで MoveIt の動作計画空間内に配置する機能があります.

MoveIt の Motion Planning パネル内の Scene Objects タブを開いて, “Mesh from file” を選択します.

“Mesh from file” セレクタの右隣にあるプラスボタン [ + ] を押します.

(左図拡大は画像をクリック)

保存してある STL もしくは DAE ファイルを選択します.

ファイルを読み込むときに MoveIt の GUI インタフェースである RViz のメッセージウィンドウが開いて,ミリメートル単位で記述されているモデルをメートル単位に変換する旨の問いがなされるので [ Yes ] をクリックします.

読み込んだモデルをインタラクティブマーカや座標などを指定して意図した位置に設置し,左のチェックボックスをクリックすると設置リンクの選択を促されますので適宜選択して [ OK ] ボタンを押します.

次に [ Publish ] ボタンを押すと読み込んで設置したモデルが MoveIt 空間内で障害物として認識されます.

あとは [ Plan ] や [ Plan & Execute ] などで動作計画を実行するとその経路上に障害物があるとそれを避けたマニピュレーションの軌道が生成されます.

MoveIt モデル URDF ファイルの作成

MoveIt モデルの URDF ファイルの作成は下記リンク先の ROS Wiki に書かれています.
本記事ではそれらから MoveIt 静モデル作成に絞って説明します.

MoveIt モデルの作成にあたっては ROS パッケージを作成してその中にモデルの URDF ファイルを置くのが本記事の内容に続く応用も含めると一番簡便なのではないかと思います.

今回 ROS パッケージをつくるのが面倒なようでしたら下記リンク先リポジトリをクローンして利用してください.

3dmodeling-examples/
├── CMakeLists.txt
├── images
│   ├── front_view_win.png
│   ├── left_view_win.png
│   ├── top_view_win.png
│   ├── washing-machine_catalogue.pdf
│   └── washing-machine_catalogue.png
├── launch
│   ├── spawn-washingmachine.launch
│   └── world-washingmachine.launch
├── LICENSE
├── models
│   ├── gazebo_models
│   │   ├── washing-machine
│   │   │   ├── meshes
│   │   │   │   ├── base_link_blue-gray.stl
│   │   │   │   ├── base_link_dark-gray.stl
│   │   │   │   ├── base_link_gray-white.stl
│   │   │   │   ├── base_link_light-gray.stl
│   │   │   │   └── base_link.stl
│   │   │   ├── model.config
│   │   │   └── model.sdf
│   │   └── washing-machine-dae
│   │       ├── meshes
│   │       │   ├── base_link.dae
│   │       │   └── base_link.stl
│   │       ├── model.config
│   │       └── model.sdf
│   ├── urdf
│   │   ├── meshes
│   │   │   └── washing-machine
│   │   │       ├── base_link.dae
│   │   │       └── base_link.stl
│   │   └── washing-machine.urdf
│   └── washing-machine.3dm
├── package.xml
├── README.md
└── worlds
    └── washing-machine.world

本記事執筆時のサンプルモデルパッケージは右に示すような構成になっていますので参考にしてみてください.

この中の MoveIt URDF モデルに関連するフォルダ・ファイルがハイライトされた部分です.

meshes フォルダに base_link.dae と base_link.stl の2つのファイルが含まれていますが,これはサンプルのためですのでどちらか1つのファイルだけでも URDF モデルは作成できます.

今回の MoveIt 静モデルのサンプル URDF ファイル washing-machine.urdf の中身は次のようになっています.

<?xml version="1.0" ?>

<robot name="washing-machine">
  
  <link name="base_link">
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://3dmodeling-examples/models/urdf/meshes/washing-machine/base_link.stl" scale="0.001 0.001 0.001" />
      </geometry>
    </collision>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <mesh filename="package://3dmodeling-examples/models/urdf/meshes/washing-machine/base_link.dae" />
      </geometry>
    </visual>
  </link>
  
</robot>

URDF のデータ形式は XML で,モデル構成要素の linkcollisiongeometrymesh が記述されています.今回は静モデルですので link 要素は1つですがロボットのように関節が多いとリンク数にともなって link 要素およびそこに含まれる子要素も増えます.

ROS パッケージ化していることで ROS のファイルシステムが名前空間から package://3dmodeling-examples/... によって 3dmodeling-examples パッケージのディレクトリを自動解決できるようになっています.

collision メッシュの STL データは単位情報を持っていないので scale="0.001 0.001 0.001" で 0.001倍(=1/1000) 変換をして [mm] のデータを [m] に換算しています.

  • 注) 表示上コードの右の方に隠れていると思うので横スクロールで確認してください.

visual のメッシュは DAE ファイルを利用していて,DAE モデルは単位情報を持っていて読み込む側でスケール判断をするので scale は必要ありません.

URDF モデルファイルの RViz 表示

URDF モデルの確認には urdf_tutorial パッケージの display.launch を利用します.

urdf_tutorial は joint-state-publisher-gui パッケージをインストールすることで利用できるようになります.下記は ROS Melodic の場合のインストールコマンドですので他の ROS バージョンの場合は melodic の部分を noetic などに書き換えて実行してください.

$ sudo apt update
$ sudo apt install ros-melodic-joint-state-publisher-gui

ターミナルで ROS 環境の設定と urdf_tutorial の display.launch の起動を行います.

$ source ~/$PathToYourWorkspace/devel/setup.bash
$ roslaunch urdf_tutorial display.launch model:='$(find 3dmodeling-examples)/models/urdf/washing-machine.urdf'
  • 注)
    • $PathToYourWorkspace は各自の ROS ワークスペースへのパスを記述
    • Launch オプションの model:= には URDF ファイルパスを指定
      • 上記は 3dmodeling-examples パッケージ内のフォルダに washing-machine.urdf がある場合の例

正常に実行できると次の図のように洗濯機モデルが RViz 空間上に表示されます.

今回の単一リンクの正モデルの場合はリンク(フレーム)間の座標変換(tf)が無いので RViz 内の “Global Status: Warn / Fixed Frame No tf data. Actual error: Fixed Frame does not exist” と警告が出ますが問題はありません.
問題はありませんが気持ちの収まりが悪いようでしたらターミナルを追加で立ち上げて下記コマンドで例えば /world フレームから洗濯機モデルの /base_link フレームへの tf をパブリッシュすると警告が消えます.

$ rosrun tf2_ros static_transform_publisher 0 0 0 0 0 0 /world /base_link

今回の記事はここまでです.


本シリーズ次回の記事は洗濯機の URDF モデルにドアのヒンジなどの動く箇所を設定してより機械らしい(ロボットに近い)モデルにする様子を紹介する予定です.

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(11)形状データのエクスポート

本シリーズ前回の記事 Gazebo/MoveIt のための 3D モデリング(10)部品作成編 で洗濯機全体の形状が完成しました.

まずはエクスポートするメッシュの確認も兼ねて,可動部分のない一番単純な Gazebo と MoveIt それぞれにおける洗濯機モデルを作ることを目標として,今回は CAD( 本記事では Rhinoceros )の形状データに色を付けるとともに Gazebo や MoveIt で利用できるデータ形式にエクスポートする手順を紹介します.

次の図は今回エクスポートするデータを Gazebo と MoveIt のシミュレーションモデルに組み込んで表示させた様子で,次回の記事のゴールになる予定です.

Gazebo/MoveIt モデルに必要なメッシュデータ

Gazebo/MoveIt のシミュレーションモデルにはディスプレイ表示用の visual メッシュと干渉チェック用の collision メッシュの2種類のデータが必要です.今回は大きく分けて次の ① ② ③ の 3種類 のデータを用意します.

  • MoveIt 用 URDF モデル
    • visual : Collada(DAE)データ ①
      • DAE ファイルには色と単位の情報も「含まれる」
    • collision : 物体領域を明確に分けられる閉じた STL メッシュ(群)データ ②
  • Gazebo 用 SDF モデル
    • visual : 各表示色別に分けた STL メッシュデータ ③(今回は4色4ファイル)
      • STL ファイルには色と単位の情報が「含まれない」ため SDF ファイル側で指定
    • collision : 物体領域を明確に分けられる閉じた STL メッシュ(群)データ ②

一般的には visual メッシュを少し細かく(データとしては重く)し,collision メッシュは粗く(データとしては軽く)することが多いです.Gazebo シミュレータは物理エンジンも含まれていますのでロボットの力制御シミュレーションをするようになってくると collision メッシュの方をより細かくする必要が出てくるかもしれません.

干渉チェック(collision)用 STL メッシュデータのエクスポート

ひとまず可動部分のない Gazebo および MoveIt のシミュレーションモデルを作成しますので,これまで作成してきた洗濯機モデルの閉じたポリサーフェス(=ソリッド)をそのまま全て選択して「選択オブジェクトをエクスポート(Export)」で干渉チェック用の STL メッシュデータファイルとしてエクスポートします.

  • 選択オブジェクトをエクスポート
    • メニュー: ファイル(F) > 選択オブジェクトをエクスポート(E)
    • コマンド: Export

ファイルの種類で「STL (Stereolithography) (*.stl)」を選択します.ファイル名はメッシュモデルの乗るシミュレーションモデルのリンク名にすると分かりやすいので今回は「base_link.stl」とします.

ポリゴンメッシュ詳細オプション」の子ウィンドウが出るので各設定項目は主に下のリストのように今回は設定しました.(図はクリックで拡大表示されます.)

  • 最小エッジ長さ(E): 0.0001
  • 最大エッジ長さ(L): 0.0 (=無指定)
  • エッジからサーフェスの最大距離(D): 0.1
  • メッシュをリファイン(R): チェック

STL メッシュデータの粗密やデータ量を調整したい場合は主にこれらの設定値を調整します.

STLエクスポートオプション」ではデータ量を確認してデータが大きすぎるような場合には「メッシュを調整」ボタンから再調整して,問題なければ「バイナリ(B)」でエクスポートします.

エクスポートした STL ファイルの内容を確認するにはフリーソフトウェアの MeshLab にインポートするのが良いのではないかと思います.

MeshLab は Windows・Mac・Linux のどのプラットフォームにもインストールできますので便利です.

また Windows であれば「3Dビューアー」,Mac であれば「プレビュー」でも STL ファイルを表示することが可能です.

エクスポートした STL ファイルに洗濯機全体の形状データが含まれているように表示されるかと思います.

干渉チェック(collision)用の STL ファイルへのエクスポート手順は以上です.

洗濯機各部の色付け

ディスプレイ表示用の visual メッシュは色を付けない単色での利用も可能ですが,せっかくなのでカタログから推測して次のリストの色分けをしてみます.

  • gray-white: 本体の前面・上面側面の大部分
  • light-gray: ドア枠と本体側周辺部品・背面
  • dark-gray: 底部周辺
  • blue-gray: ドアの透明窓部・液晶表示部

Rhinoceros のデフォルトではポリサーフェスで1つにまとまっていると色や反射率,透過率などの設定が含まれるマテリアル設定が1つしか反映されないので,色ごとのポリサーフェスやサーフェス,それらのグループに分解します.ソリッド(=閉じたポリサーフェス)の状態は残しておきたいので色付け用のレイヤを作成してそのレイヤに洗濯機モデル全体をコピーしたものを分解,色付けします.

色はオブジェクトの「マテリアル」を設定して付けます.

色ごとに分けたオブジェクト(=ポリサーフェスやサーフェス,グループ)を選択してから右クリックして「オブジェクトのプロパティ(S)」を表示して「プロパティ: マテリアル」タブを開きます.

マテリアルの設定時に気を付ける点があり,「金属」系の色は後の項目でエクスポートする Collada(DAE)ファイルや Gazebo,MoveIt のディスプレイ上では反映されなく,意図しない,おそらくエクスポートしたオブジェクトのあるレイヤー色か黒などに表示されてしまうので「プラスチック」系のマテリアルを使用して各色を指定するのが良さそうです.

また,Rhinoceros 上での表示形式を「レンダリング」にすることでマテリアルが反映された表示になります.

上の図では 「gray-white」を選択した例を示していますが,他の「light-gray」「dark-gray」「blue-gray」についても同様にプラスチック系マテリアルの色を調整して設定します.

Collada(DAE)メッシュデータのエクスポート

MoveIt シミュレーションモデルの URDF ファイルから表示用(visual)メッシュとして使うために,マテリアルを設定して色付けしたモデル Rhinoceros から Collada(DAE)ファイルとしてエクスポートします.

Collada(DAE)のメッシュデータには色や単位の情報も含まれるので全色分のオブジェクトを一緒くたに選択して「選択オブジェクトをエクスポート(Export)」でエクスポートします.

ファイルの種類に「COLLADA(*.dae)」を選択します.ファイル名はメッシュモデルの乗るシミュレーションモデルのリンク名にすると分かりやすいので今回は「base_link.dae」とします.

エクスポートした DAE ファイルの内容の確認は Mac だと「プレビュー」で右の図のように行えます.

FreeCAD は Windows や Mac,Linux で利用でき,DAE データも表示することができます.

FreeCAD の操作感はあまり良いとは言えないのですが様々な形式の 3D データが読み込めるのでデータ確認には非常に便利です.

金属マテリアル表現の 3D モデルについて

今回,洗濯機操作部の丸いボタンに金属系マテリアルを設定して Collada(DAE)ファイルとしてエクスポートして利用しようとしましたが金属マテリアル部分が DAE メッシュとしては黒色になってしまって金属的な表現にはなりませんでした.

今回筆者の調べた範囲においては glTF(ジー”エル”ティーエフ) 形式とそのバイナリ形式の glb 形式が 3D モデルのファイル内に金属やガラスなどのマテリアル表現の情報も含まれる形式とのことでしたので Rhioceros にこれらの形式をエクスポートするプラグインを導入し,丸ボタンに金属マテリアルを適用したものを glb 形式でエクスポートして,Web にある glTF ビューア で表示してみたものが次の図です.

ボタンの部分が金属的な表現になっているように見えます.

ではこの glTF や glb 形式の 3D モデルファイルが Gazebo や MoveIt で使えるのか,といったところが ROS ユーザとしては気になるところです.Gazebo や MoveIt はレンダリングエンジンに OGRE(Object-Oriented Graphics Rendering Engine) を利用しています.

OGRE の現時点で最新リリースが 2022年2月9日 リリースの 13.3 です.OGRE v13.3 では glTF2.0 形式の情報を利用した金属や布などのマテリアル表現が可能になったとのことです.

Gazebo や MoveIt でも OGRE で新しくリリースされた豊かなマテリアル表現機能を使えるように実装が進んだら,今回上手くいかなかった金属表現もできるようになるのかな?と期待しています.

色別 STL メッシュデータのエクスポート

Gazebo シミュレーションモデルの SDF ファイルから表示用(visual)メッシュを色付きで使うためには色ごとにメッシュを分けた STL データファイルに対して SDF ファイル内で色情報を指定する必要があります.

そのために Rhinoceros からは色ごとにオブジェクトを選択して各色の STL ファイルとしてエクスポートします.

一般的な STL ファイルには色情報が含まれませんので Rhinoceros 上で色を付ける必要性はないのですが,前の項目で既に色ごとに分けて色付けしたオブジェクトがありますので,ここでは「色で選択(SelColor)」でそれぞれの色を選択して「選択オブジェクトをエクスポート(Export)」すると楽にできます.

  • 色で選択
    • メニュー: 編集(E) > オブジェクトを選択(S) > 色で選択(C)
    • コマンド: SelColor

STL エクスポート自体のの手順は先ほどの「干渉チェック(collision)用 STL メッシュデータのエクスポート」内で行った手順と基本的には同じですが,色分けした,ソリッド(=閉じたポリサーフェス)ではない,開いたポリサーフェスやサーフェスをエクスポートすることが出てきますので,その場合は「STLエクスポートオプション」にて「開いたオブジェクトをエクスポート(E)」のチェックを入れる必要があります.

ファイル名はメッシュモデルの乗るシミュレーションモデルのリンク名に色名を足しておくと分かりやすいので,今回は下のリストの各ファイル名で 4色分 4つのファイルとしてエクスポートしました.

  • base_link_gray-white.stl
  • base_link_light-gray.stl
  • base_link_dark-gray.stl
  • base_link_blue-gray.stl

複数に分けた STL ファイルを MeshLab にインポートすると MeshLab 内のレイヤとして表示されるのでレイヤの表示・非表示を切り替えるなどしてメッシュの確認を行うと良いのではないかと思います.

今回の記事はここまでです.


本シリーズ次回の記事は

「Gazebo/MoveIt のための 3D モデリング(12)Gazebo や MoveIt の静モデルの作成」

として,今回エクスポートしたメッシュデータファイルを Gazebo や MoveIt のモデルファイルに組み込んで表示する様子を紹介する予定です.

著者:yamamoto.yosuke

パソコン1台で出来るロボットの学習素材集

ROS(ロス/Robot Operating System)の学習は実際にロボットがなくてもロボットのシミュレータが入手できるのでネットワークにつながるパソコンが1台あればできますので結構自習に向いています.この記事では ROS の学習を始める,進めるにあたり必要な情報がある Web へのリンクを中心に紹介します.

大まかに言うと次のインストールを行えば ROS の学習をスタートすることができます.

  • パソコンにオペレーティングシステムの Ubuntu Linux をインストール
  • Ubuntu Linux に ROS をインストール
  • ROS 上で動くロボットソフトウェアのインストール
    • → 紹介 ROS チュートリアル内にて

ROS と Ubuntu Linux のバージョンは後述する ROS 学習のチュートリアルが現時点では ROS Kinetic というバージョンを基本としているので下記の組み合わせをお勧めします.

  • Ubuntu 16.04
  • ROS Kinetic

ROS Melodic は ROS Kinetic と基本的な操作のほとんどは変わらないので ROS Kinetic で学習してから ROS Melodic に移行しても難なく可能です.

 

パソコンへの Ubuntu Linux のインストール

パソコンはどのようなものを使えば良いのか?については下記記事を参考にしてください.

ROS 導入ノートパソコン比較調査

ROS 導入ノートパソコン比較調査

最新高性能パソコンよりも数年型落ちや廉価の機種のほうが Ubuntu Linux をインストールしやすい傾向にあるように思います.

 

Ubuntu Linux への ROS のインストール

下記リンク先に各 ROS のバージョンにおけるインストール手順が書かれています.

また,Ubuntu のバージョンと ROS のバージョンには1対1の対応関係があるので組み合わせを気をつける必要があります.

 

ROS のチュートリアル

各チュートリアルを進めるとそれらの中で ROS シミュレータなどのインストールも行います.

TORK MoveIt チュートリアル

ROS の入門には TORK MoveIt チュートリアルをお薦めします.MoveIt は ROS のマニピュレーションロボット動作計画ソフトウェアです.このチュートリアルでは数種のロボットの ROS シミュレータのインストールや基本的な操作,プログラムでのロボット操作を学習することができます.TORK MoveIt チュートリアルではプログラミング言語に Python を用いていますが,プログラミングの経験がほとんどない人にもプログラムによるロボット操作の体験と学習ができるように構成しています.

ROS を初めて使う方に TORK MoveIt チュートリアルを学習したときのレポートも下記の記事に書いてもらっています.学習過程でいろいろと疑問をもった点などの体験を書いてもらいましたので参考にしてみてください.

初めてのROS(ROSチュートリアルを使って)

 

ROS-Industrial トレーニング(日本語版)

より発展的な ROS プログラミングを学習したい場合は ROS-Industrial トレーニングを行ってみるのも良いでしょう.この教材で取り上げられているプログラミング言語は主に C++ と Python です.C++ によるロボット制御や画像処理,3D ポイントクラウド処理などとそれらの組み合わせのプログラムの学習ができます.

ROS-Industrialのトレーニング教材を日本語訳しました!

 

ROS で質問したいことが出てきたら

ROS Discourse やチュートリアル,パッケージの GitHub Issues に質問を投稿してみてください.

 

入門的な実機マニピュレーションロボット

1台のパソコンだけ,シミュレータだけでなく入門的な実機マニピュレータを利用してみたいと思った方は入門的なマニピュレーションロボット2例の導入検証を行った記事を参考にしてみてください.

ROS 入門向けマニピュレータ導入検証

著者:yamamoto.yosuke

CIS ToF カメラセンサの ROS ドライバパッケージをリリースしました

新しい ROS パッケージ cis_camerahttps://github.com/tork-a/cis_camera )をリリースしました.

この ROS パッケージは 株式会社シーアイエスhttps://www.ciscorp.co.jp/ ) ToF (Time of Flight) カメラセンサ DCC-RGBD1 のためのドライバパッケージです.

DCC-RGBD1 は小型ながら広いレンジの深度画像が取得可能な ToF カメラセンサ(ディベロップメントキット)です.

  • 15cm 〜 5m のレンジで高精度な深度画像を取得可能
  • 小型 H:50mm × W:55mm × D:35mm(突起部を含まず)
  • RGB (QVGA) と Depth / IR (VGA) の3つの画像を同時取得
  • インタフェースは USB 3.0( USB 3.0 micro B コネクタ搭載:USB 給電は非対応 )
  • 屋内使用向け

本パッケージでは CIS ToF カメラセンサの ROS ドライバに加え,ノイズ除去,平面検出・除去,対象物点群抽出とフレーム座標算出のポイントクラウド処理ならびに,それらの処理結果を RViz で 3D 表示するためのサンプルプログラムおよび launch ファイルを同梱しています.

使い方は GitHub のドキュメントをご参照ください.
もし問題にぶつかった場合は GitHub Issues で報告をお願いします.

CIS ToF カメラセンサのハードウェアの入手などに関するお問い合わせは下記連絡先までお願いします.

ハードウェアに関するお問合せ先:株式会社シーアイエス 営業担当
メールアドレス:newbiz@ciscorp.co.jp
電話番号:042-664-5568

著者:ryo.kabutan

World MoveIt Day 2019 in Tokyoが開催されました!

11月20日に,World MoveIt Day 2019 in Tokyoが開催されました! 当日の様子を写真をたくさん載せながらレポートしたいと思います.参加できなかった方もWorld MoveIt Dayの雰囲気を感じていただけると幸いです.当日の実施したスケジュールをたどりながら記事にしたいと思います.

会場

外の様子

会場は株式会社オムロンサイニックエックス様のオフィスでした.オフィス玄関,エレベータ,会場などにTORK作成のWorld MoveIt Dayのポスターを貼って雰囲気を盛り上げました.

会場内

会場したときの写真です.オムロンサイニックエックス様のご提供の会場はおしゃれなオフィスでした.参加者みなさん,それぞれ開発の準備をしています.

開会

TORKよる開会の挨拶がありました.1日の日程の説明を行いました.

ハッカソン

早急に開会の挨拶を終了し,ハッカソン開始!みなさんそれぞれの課題を見つけ開発を行います.わからないことがあれば,スタッフに積極的に質問してくださったり,参加者同士で助け合ったりと良い雰囲気でした.

昼食

昼食はTORKの提供でした.ごはんをしっかり食べて午後からも頑張れそうです!!

スポンサープレゼン

お昼ごはんを食べながら,主催者によるスポンサープレゼンがありました.

オムロンサイニックエックス

オムロンサイニックエックスのフェリクスさんからのスポンサープレゼンが実施されました.オムロンサイニックエックスとしての活動,MoveItの開発スケジュールなどの説明がありました.

TORK

TORKから,TORKの会社説明,活動(セミナー,トレーニング教材の作成,MoveItへのコミット)などを説明しました.

ハッカソン

午後もハッカソンが続きます.午後には事前に用意していたロボットを参加者さんが動かせるようになりました.そのときのトラブル事例などをシェアしたりと,開発者同士の積極的な交流がありました.またホワイトボードに今実施している内容(Issue番号なども)を書き出したりしました.

参加者による発表

夕方17時から,今日一日の成果発表です.参加者皆さん,今日一日やったことを発表するスタイルでした.「私のやったことなんて…」みたいなことがなく,互いの成果を称え合うすばらしい時間だったと思います.たくさんの発表があったので,一部だけご紹介します.

MoveItプラグイン上の不具合

MoveItプラグインのScene Objectsの設定画面にて,各Sceneに紐付けられたインタラクティブマーカのサイズがおかしいという問題をTORK から発表しました.当日は間に合いませんでしたが,その後問題を解決し,Pull Request を本家リポジトリへ出し,現在 merge を待っています.

RViz broken Interactive Marker in “Scene Objects” Tab #1115

https://github.com/ros-planning/moveit/issues/1115

Add interactive marker resizing #1795

https://github.com/ros-planning/moveit/pull/1795

https://github.com/ros-planning/moveit/pull/1796

Previousの実装

MoveItプラグインで,ロボットの開始終了姿勢を指定するときにCurrentという設定があると思います.それに追加で,Previousを実装したという発表でした.これによって,プランニング実行後,更にプランニングを行う場合,以前の姿勢を目標姿勢に設定することができます.なんとこの成果はMoveItのマスターブランチにマージされました!!すばらしいです.

add “<previous>” robot state to RViz motion display #14

https://github.com/ros-planning/moveit/issues/14

MoveIt チュートリアルの日本語化

MoveItチュートリアルの日本語化を現在取り組んでいます.その一部を2名の方に手伝ってもらいました!ありがとうございます.

Japanese Translation #415

https://github.com/ros-planning/moveit_tutorials/issues/415

プラグインのサイズ調整

MoveItのプラグインは横幅のサイズが固定で.ディスプレイサイズが小さいとRvizを専有してしまいます.このIssueに取り組んでくださいました.

make MoveIt’s RViz display properly resizable #13

https://github.com/ros-planning/moveit_tutorials/issues/13

xArmの動作デモ

ロボットを持ち込んで参加してくださった方々もいらっしゃいました.xArmの動作デモを実施していただきました.xArmの実物を見たことがなかったので,新鮮でした!

TrajOptについて

TORKからMoveItの新しいプランナであるTrajOptの説明を行いました.WMD当日時点では,TrajOptの機能はプルリクエストがあがっていますが,動作しなかったので,そのプルリクエストの内容のレビューを実施しました.WMDの時間内でなんとかプランニングを実行することまではできるようになりました.

Trajopt with no dependency to tesseract #1626

https://github.com/ros-planning/moveit/pull/1626

他にもたくさんの発表がありました

発表時間には多くの発表があり,この記事のボリュームの関係で紹介しきれなかったものもたくさんあります.発表してくださった方にはMoveItステッカーやTORK作成のMoveIt DayのTシャツをプレゼントさせていただきました.

記念写真

集合写真

集合写真もとりました.途中からの参加や,途中でお帰りになった方もいらっしゃいますが,定員で設定していた30名をお迎えすることができ非常によかったです.

スタッフ写真

閉会後スタッフとPanda,URのコラボ写真を撮影しました.

おわりに

今年のWorld MoveIt Dayの日本開催では,Masterブランチへマージされるようなすばらしい成果を出してくださった参加者さんもいらっしゃいました.だんだんと日本でもMoveItを使う側から開発側に入り込めるように推進活動をしたいと思っています.参加者の皆さん,ありがとうございました! 今年参加してくださった方も,参加できなかった方も,来年お会いしましょう!

著者:ryo.kabutan

MoveItの各プランナーについての解説(WMD 2019 in Tokyo 準備編)

0. はじめに

本記事はWorld MoveIt Day 2019 in Tokyo(WMD 2019 in Tokyo)へ参加するにあたり,MoveItで使用できるプランニングアルゴルリズムに関して解説します.
MoveItでは非常に多くのプランニングアルゴリズムが利用できます.プランニングアルゴリズムは理論や実装方法によって軌道の計算時間や軌道そのもののが大きく変わるため,ユーザにあまり意識させないような実装にMoveItは設計されているものの,実は非常に重要な要素です.しかしその豊富さが災いして,結局どのアルゴリズムがよいのかわからなくなっているのが現状です.そこでこの記事では現段階で実装されているアルゴリズムについて整理しようと思います.
アルゴリズム内部を理解していると,適用先のロボット,環境によってどのアルゴリズムが適しているかを判断しやすくなりますので,この記事を読んでアルゴリズムの理解を進めていきましょう.

続きを読む

著者:TanakaRyodo

MoveIt の本家リポジトリへコミットする方法(WMD 2019 in Tokyo 準備編)

0. はじめに

本記事は World MoveIt Day 2019 in Tokyo(WMD 2019 in Tokyo)へ参加するにあたり,MoveItのソースコードを変更し,コミットするためのやり方を紹介します.
MoveItにはPull Requestを送るためのルールがあるので,これに沿ったやり方が出来るよう解説します.WMD 2019 in Tokyoへ参加しない方でも,MoveItを使う方なら参考になると思うので,是非ご覧ください!
なお,今回想定しているROSのバージョンは,ROS1 melodicです. 続きを読む

著者:TanakaRyodo

World MoveIt Day 2019 in Tokyo を開催します!「準備編」

World MoveIt Day 2019 in Tokyo とは?

MoveIt の利用者,開発者のための世界的なイベント World MoveIt Day 2019 (以下WMD 2019)のローカルイベントを,東京で開催します.

MoveItとは ROS コミュニティ が開発している,ロボットマニュピレータを対象としたROSの主要パッケージの一つで,障害物にぶつからないようなロボットアームの軌道を計画するモーションプランニングのソフトウェアパッケージです.WMD 2019 は,このMoveItの開発を世界中の人々で一気に推し進めようという開発者のためのイベントです.

私はWMD2019に参加するべきでしょうか?

MoveItに興味はあるけどまだ使っていない方,全く聞いたことのない方へ

  • MoveItの一通りの使い方を紹介します.是非ご覧いただき,開発者になりましょう!

すでにMoveItを使われたことのある方へ

  • MoveItへの貢献の仕方も紹介しています.こちらも,是非ご覧ください!

当日の雰囲気はどのようなものでしょうか?

和気あいあいと開発を行っていきたいと考えています.

実機 Panda Arm の用意をはじめ,開発中に詰まったポイントは随時ホワイトボードに書き出し,みんなで共有->わかる人がいれば一緒に解決する.というスタイルで開発していきます.
さらに昼食も無料ですし,閉会後も可能な時間まで開発を続けることもできます…!是非産業ロボット大国日本から一丸となってMoveItに貢献し,MoveItとロボットを楽しみましょう!!

はじめてのMoveIt

初めてMoveItに触れる方におすすめの日本語教材が2つあります.
自分にあっている方を選んでまずはご覧ください.

ROSってなに…? MoveIt…?という方向け

はじめてMoveItに触れる方のために, ROS Industrial トレーニング教材(英語) が提供されています.しかし,これらは英語で書かれているため,日本語も欲しいところですよね!!
実はTORKでは以前にこのページを日本語化し,公開しています.MoveItの基本的な使い方,他のチュートリアルやマニュアルへのリンクなどがまとめられているので,まずはこちらをご覧ください.

また,2019年11月16〜17日には,日本ロボット学会(RSJ)の主催でMoveItとROSを用いたマニピュレータ制御に関するセミナーが開かれます.申し込み期限は2019年9月27日なので,是非参加されてみてください.

ROSは知ってる!MoveItははじめて…という方向け

TORKからMoveItの日本語チュートリアルを無料で公開しています.是非ご覧ください.

チュートリアルを終えたら…

どんなロボットを用いて開発をされても構いませんが,WMD 2019 では,Panda Arm の実機を用意しています.これは,Moveit!のチュートリアルで使用されているロボットです.
WMD 2019では,このチュートリアルの不備があれば公式リポジトリへIssueを出していただくことも推奨しています!!ただし英語のため,TORKにて部分的に日本語訳を行っていく予定です.

ここまでに登場したリンク以外にも,参考になるリンクをまとめて紹介しておきます.

MoveItに貢献しよう!

MoveItが使えるようになったら,是非MoveItに貢献しましょう!WMD 2019もROS Industrial に貢献することが開催目的です!
といっても,何から始めたら良いかわからないですよね…
実は公式ページからそのガイドラインが出ています.このページの”Finding Where You Can Help” と書かれてる箇所に具体的に載っています.内容は下記のとおりです.

  • moveit day candidate WMD 2019 の間に解決が可能なIssue
  • simple improvements 数時間で解決できそうなIssue
  • documentation 新しいチュートリアルの提案やWebページの更新等
  • no label ラベル無しももちろん解決が望まれているIssueです.WMD 2019 以降に伸びて開発を行うことももちろん歓迎です!

上記の中からとくに,WMD Tokyo 2019では実機のPanda Arm もあるため,documentation の項目を更新できるかもしれません…他のラベルもどんどん解決していきましょう!!!
筆者も昨年のWMD 2018 では simple_improvements の解決にチャレンジしていました.もちろん,WMD 2019 開催前にどんどんと解決していってもらっても構いません(むしろ歓迎).そして,その内容をWMD 2019で発表してください.

なお,WMD 2019で成果発表を行ってくださった方には素敵なプレゼントがあります!!!

記事の更新情報

「MoveItの本家リポジトリへコミットする方法」 を公開しました!(2019/10/24)
「MoveItでPandaを動かそう:前編」を公開しました!(2019/10/28)
「MoveItの各プランナーについての解説」を公開しました!(2019/10/30)
「MoveItでPandaを動かそう:後編」を公開しました!(2019/11/18)
「MoveIt2のビルドとマニピュレータ「MARA」による動作確認」を公開しました!(2019/11/19)

MoveIt2のビルドとマニピュレータ「MARA」による動作確認

さいごに

記事の更新情報は随時公開していきます.是非RSS等登録頂き,チェックしてください!

著者:Yumiko Suzuki

初級者の方のために – Linux環境に慣れる

春ですね!春は新しく勉強をはじめる方も多いと思います.

ROSワークショップはLinuxで実施しますが,Linux環境を簡単に準備できない方やLinuxが初めての方もいらっしゃいます.
環境をすぐに準備できない方はWeb上のターミナル環境を使ってまずはLinuxコマンドに慣れておくのをおすすめします.

Web上のターミナル環境
・ターミナル:Unix Terminal Online
http://www.tutorialspoint.com/unix_terminal_online.php

おすすめのLinuxコマンドのサイト
・ Linuxコマンド
http://robotics.naist.jp/edu/text/?Robotics%2Flinux-command

・参考:ROSを初めて勉強するときに
https://opensource-robotics.tokyo.jp/?p=1361

著者:東風上奏絵

World MoveIt! Day 2018 in 柏の葉が開催されました!

先週の金曜日にWorld MoveIt! Day 2018 in 柏の葉が開催されました! 当日の様子を写真で紹介します.参加できなかった方にも雰囲気を伝えられればと思います.

開会前の様子

準備もラストスパートに入っています.

開会式

ついにWorld MoveIt! Day 2018 in 柏の葉が始まりました! ハッカソンでの課題の例についての説明などがありました.

TORK但馬の挨拶です

次に,会場にロボットを展示していただいた企業の方からロボットのご紹介がありました.

Sawyer

SEED Solutions様の発表

富士ソフト様の発表

ハッカソン(午前の部)開始!

皆さんもくもくと作業されています.実機でプログラムを試す方もいらっしゃいました.

ハッカソンの様子

お昼ご飯

午前中はお疲れ様でした!お昼ご飯の時間です.

 

オムロンサイニックエックス株式会社様からご提供頂いた昼食はとても美味しかったです.

本当に美味しかったです!

参加者によるプレゼンテーション

お昼ご飯を食べながらの,参加者による発表が始まりました.

OMRON SINIC X Corporation @felixvd さん

WRS2018製品組立チャレンジ参加報告とオムロンサイニックエックス株式会社のご紹介をしてくださいました.

MoveIt! Task Planningについて @youtalk さん

MoveIt!の新機能,Task Constructorについてご紹介してくださいました.これにより,今までできなかった,物を掴みながら移動するといった,並列タスクが可能になるそうです.

SEED-noid ご紹介 近藤さん

SEED-noidの実用例を,コンビニを舞台にした競技会やレストランでの実証実験のお話などを通してご紹介くださいました.

JointTrajectoryPlotのご紹介 但馬(TORK)

MoveIt!でロボットを動かす際,各関節の角度を知りたい時に便利なツールのご紹介です.

ハッカソン(午後の部)開始!

発表が終わったら,ハッカソンの再開です.

午前と同様,静かで穏やかな時間が流れます.

成果発表会

お疲れ様でした!ハッカソン終了です.今日一日何に取り組んだか,発表し合います.

SEED-Noid Moverにかめはめ波を打たせる(MoveIt!を実機で使う)

 

新しいロボットの製品をgazeboでMoveIt!を使って動かす(ROBOTIS様)

 

新しいロボットの製品の情報をMoveIt!のホームページに追加

 

MoveIt!での衝突計算を簡単にするために,ロボットのメッシュモデルを簡略化する

MoveIt!での衝突計算を簡単にするために,ロボットのメッシュモデルを簡略化する

 

Issueへの取り組み(1)

 

Issueへの取り組み(2)

 

JointTrajectoryPlotをgazebo上で使ってみる

次回参加時の参考になる取り組みがたくさんありますね!

記念写真です!

参加者の皆さま,ありがとうございました! 来年もお会いしましょう!

 

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

10月のワークショップ日程を公開中です!

出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

9-10月のROSワークショップ日程を公開中です!

出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

8月のワークショップ日程を公開中です!

出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

5月のワークショップ日程を公開中です!

出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

対決!低価格LIDAR(3) ROS対応

ROS対応

前回は低価格LIDARの仕様を比較をしてみました.今回はROS対応を見ていきましょう.

RPLIDAR A2とSweepは,それぞれSDKが公開されているので自作のソフトウェアからデータを使うことが可能です.しかしやはりロボットに使うのであれば,ROSを使わない手はないでしょう.ここではROSの対応状況を見てみます.

RPLIDAR, Sweepともに,ROSドライバのコードがすでに作成されています.

Sweepはまだリリースはされておらず,ソースからのビルドが必要です.

RPLIDARはすでにリリースされているので,aptでインストールすることが可能です.

$ sudo apt install ros-kinetic-rplidar-ros

センサの起動

どちらも付属のlaunchファイルで簡単にデータを取得してrvizで見ることができます.

RPLIDAR A2:

$ roslaunch rplidar_ros view_rplidar.launch

Sweep:

$ roslaunch sweep_ros view_sweep_pc2.launch

メッセージの違い

rolidar_rosは,sensor_msgs/LaserScanメッセージを出力します.

一方sweep_rosは,sensor_msgs/PointCloud2を出力します.これは,前述したように,Sweepの計測が回転と同期していないためだと思われます.ただし,scan_tools/pointcloud_to_laserscanを使うことで,PointCloud2メッセージをLaserScanメッセージに変換することができます.

Rvizで表示

同じ場所でデータを可視化してみました.

RPLIDAR A2(10Hz)

RPLIDAR A2はデフォルトの設定で部屋の形がよく分かります.ロボットの地図生成や自律移動に充分使えることも確認しています.

一方のSweepですが,デフォルトの状態で同じ10Hzで回転させた時のデータがこちらです.

Sweep(10Hz, sample_rate=500Hz)

うーん,やはり同じ速度だとSweepの粗さが目立ちますが,しかし,なんだかさすがに解像度が低すぎないかな?

と思ってチェックしたら,sweep_rosノードのデフォルトのサンプルレートが500Hzで最大仕様(1kHz)の半分になっていることに気づきました.うーんこれはデフォルトで最大性能が出るようにしておいてもらいたいところですが,サンプルレートのパラメータsample_rateを1000に設定して,もう一度データをとってみました.

Sweep (10Hz, sample_rate=1kHz)

だいぶ詳細度が上がりました.しかし,RPLIDAR A2に比べると,部屋の形状がかなり分かりにくいですね.

そのまま,スキャン速度を3Hzに落としてみます.

Sweep (3Hz, sample_rate=1kHz)

このくらいなら部屋の形が分かりますね.回転速度が下がった分,RPLIDAR A2よりも更新周期が3倍程度長くなっています.
次は,動画でデータを比べてみましょう.

著者:Ryosuke Tajima

ROSワークショップ中級・自律移動編を名古屋で開催しました

名古屋伏見でやってます

ROSワークショップ中級・自律移動編を名古屋にて開催しました.中級ともなりますと,ROSをすでにかなり使いこなしている方が参加されていて,非常にスムースにカリキュラムを進めることができました.

自律移動の体験

自律移動編では,シミュレーション上で一通りの機能を試してもらった後,ルンバベースの教材ロボットRoomblockを部屋やオフィスの廊下で動作させて地図を作っていただき,実機での運用を体験していただきます.その後,ROSでの自律移動の構成を説明していきます.カリキュラム以外のROSやロボティクスに関する質問,疑問にも出来る限りお答えします.

自律移動ロボットRoomblock

11月のワークショップ日程を公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
初めてでLinux環境を準備できなくてもLiveUSBを使って完遂できました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

10月のワークショップ日程を公開中です!

10月は中級・自律移動編も実施いたします!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
準備万端でご参加いただきサクサクと進みました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

9-10月のワークショップ日程を公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

Roomblock(5): 3Dプリンタで出力可能なフレーム構造

前回までにルンバ,ラズベリーパイ,モバイルバッテリ,そしてレーザー距離センサといったRoomblockの部品を紹介しました.これらをルンバの上に載せるための,3Dプリンタで出力できる構造材を紹介します.

Battery stage

Battery stage

棚のような構造で,1番下の段にモバイルバッテリ,2番目の段にラズベリーパイ,1番上の段にRPLIDAR A2を載せます.動作中にモバイルバッテリが落ちてしまうことがあるので,1番下の段にはバッテリー固定用のベルトがつけられるようになっています.

Raspberry Pi stage

Raspberry Pi stage

部品をブロックのように交換したり追加したりして,機能を拡張することを狙っているので,”Roomblock”と名付けました.安直ですね.ラズベリーパイ用のボードカメラを固定するための部品も追加しました.

Roomblock's frame

Roomblock’s frame

ルンバとフレーム部分はベルクロテープで固定されているので,取り外しも簡単です.

この構造材は,比較的安価な3Dプリンタでも出力できるサイズで設計されています.確認には UP! plus2を使いましたが,ワークエリアが15cm x 15cm程度の3Dプリンタであれば,大抵の機種で出力できると思います.3Dデータ(STLファイル)は,Thingiverseからダウンロードすることができます.

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

本日2017年8月8日,おかげさまで TORK は設立4周年を迎えました.
皆様,いつもありがとうございます!
これからも,お客様のご要望に応え,産業・学術界でのオープンソースロボティクスの進展に寄与できるよう,より一層努力して参ります.

今回も有楽町にてROSワークショップ初級編を開催しました.
小さな疑問点にも都度お答えしながらの密度の高いワークショップとなりました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

9-10月のワークショップ日程を公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Yumiko Suzuki

ROSワークショップ初級編を開催しました

今回も有楽町の会議室にてROSワークショップ初級編を開催しました.
参加者の方が検討中のシステムについてのご相談もお受けしました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.

8月のワークショップ,いまなら間に合う!

9-10月のワークショップ日程を公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

ROS + Snappy Ubuntu Core (1) : いったい何なの?

iPhoneのAppStoreやAndroidのGooglePlayのようなアプリのマーケットインフラを,ロボットの世界にも導入するためにはどのような課題があるでしょうか?ROSはその開発当初から「Robot App Store」を視野に入れてきていますが,まだ実現していません.

その中で,最近のUbuntu Snappy Coreと呼ばれる仕組みの登場は,Robot App Storeの開設に大きく貢献するのではないかと思われます.

Snappy + ROS, https://www.crowdsupply.com/krtkl/snickerdoodle/updates/1890

今後,数回に分けて,Ubuntu Snappy CoreとROSについて書いていきたいと思います.

Ubuntuの事情

ROSがメインのベース・オペレーティング・システムとしているUbuntuは,年に2回のRegularリリースがあり,そのサポート期間は9ヶ月です.また,2年おきにLTS(Long Term Support)と呼ばれるリリースがあり,サポート期間は5年です.実用を求める人は安定なLTSを使いつつ,最新技術の取り入れや新規開発はRegularリリースを使う,というサイクルが続いています.

しかし,Ubuntuが対象とするデバイスは,デスクトップPCやサーバだけでなく,IoTやルータなどのエッジデバイスにも広がりつつあります.残念ながらUbuntu Phoneはついに陽の目を見ないことになるようですが…

これらのデバイスでは,セキュリティの観点から,Ubuntuのような同期的なものではなく,もっと不定期かつ細かい間隔の継続的なアップデートが欠かせません.また,耐障害性,たとえば不具合を含むソフトウェアが配信された際にロールバックする,などの機能が必要になります.

Snappy Ubuntu Core

これらの要求に対して,Ubuntuでは,IoTやエッジデバイス向けに,(Snappy) Ubuntu Coreと呼ばれる仕組みが開発されています.

これは,OSとデバイスドライバの分離,またカーネルとアプリケーションを分離して,それぞれを独立に,細かい周期でアップデートできるような仕組みにしよう,というものです.

ROSの事情

ロボットもまたIoTやエッジデバイスの一種と見ることができるため,今後ROSでも,このSnappyなパッケージシステムが主流になる可能性があります.また,ROSのリリースシステムも,ほころびが目立つようになってきています.

これまでROSはUbuntuと同様に,同期的なリリースを行ってきました.しかし,1年に1回のリリースでは,日進月歩の技術を取り入れるのに遅れが大きすぎる気もします.一方で,ROSを業務に使用する場合には,動作させることが優先され,頻繁にアップデートしない(できない)ようになってしまいがちです.

また,ROSのパッケージは,たくさんの外部ライブラリに依存しています.外部ライブラリのAPIが変更になるたびに,ROSのパッケージもそれに対応させる必要があります.仕様が変わる場合には,パッケージを対応させた上に動作確認も必要です.

そのため,リリースされるたびに,リリースから外れていくパッケージが多くなってきました.必要だしよく使われるパッケージであるにもかかわらず,リリースのために修正が必要だけど修正作業を行うメンテナがいない,という理由でリリースされなかったり,リリースが遅れたりするケースもあります.

もしROSを搭載したロボット製品を販売しようと考えた場合,UbuntuやROSが更新されたタイミングで,どのような仕様変更や不具合が混入するかわからず,それに対応するには膨大なリソースが必要であることが予想されます.

以上のようなことから,今後はSnappyなROSシステムが主流になるのではないかと,勝手ながら予想しています.

Canonicalにお勤めのロボットエンジニアの方(Kyle Fazzari氏)が精力的に情報発信をしているのも頼もしいです.4月に公開された以下の一連のブログと動画も必見です.

次回はSnappyなROSパッケージを作ってみます.

著者:Ryosuke Tajima

Roomblock(4): 低価格なレーザ距離計 RPLIDAR A2

前回はルンバと通信するための計算機として用いているラズベリーパイについて紹介しました.今回は,自律移動のためのキーパーツである,レーザ距離センサについて紹介します.レーザースキャナ,LIDAR(Laser Imaging Detection And Ranging)とも呼ばれます.

弱いレーザービームを発光し,物体への反射光を計測して,その時間差により物体までの距離を測ります.計測部分を回転させながら計測(スキャン)すれば,平面内の物体までの距離が計測できます.レーザービームを複数並べたり,細かく向きを変える機構を使うことで,平面内だけでなく3次元的な計測点が得られる3次元レーザ距離センサもあります.

一般的にレーザー距離センサは,2次元のものでも数十万円していたので,そう手軽に使えるものではありませんでした.しかしRoomblockで使っている SlamTech社のRPLIDAR A2 は,なんと5万円程度と破格なのです.

自律移動のキーパーツ,LIDAR

自律移動のキーパーツ,LIDAR

RPLIDAR用のROSドライバが公開されています.

$ sudo apt install ros-kinetic-rplidar-ros

として,

$ roslaunch rplidar_ros view_rplidar.launch

とするだけで,rvizで計測した点が表示されるお手軽さです.

rvizで表示した距離データ

rvizで表示した距離データ

計測可能距離は16m, 更新周期は10Hzと,高価なレーザスキャナと比べて性能では劣るものの,通常の屋内であれば地図生成や自己位置推定に問題はありません.スキャンは1度刻みで360度なので死角がありませんが,センサ上部がむき出しのままぐるぐると回転するので,動作中に触ってしまわないように注意が必要です.インターフェースはUSB2.0で,バスパワー駆動なのもうれしいところです.

laser_scan_matcherパッケージで少し遊んでみましょう.

$ roslaunch rplidar_ros view_rplidar.launch

としてセンサを起動した後,

$ rosrun laser_scan_matcher laser_scan_matcher_node _base_frame:=laser

として,センサの水平を保ちながら,ゆっくりと動かしてみます.

スキャンマッチング

スキャンマッチングの様子

初期状態ではworld座標系と一致していたlaser座標系が,センサの動きに応じて位置と姿勢がレーザのスキャンマッチングにより更新されていきます.センサを元の位置,姿勢に戻すと,だいたいworld座標系に一致しています.ただ,レーザのスキャンマッチングでは,フレーム間の移動量を推定してこれを積算するので,長く移動させるとエラーも積算されていきます.これを避けるためには,より高度な自己位置推定のアルゴリズムが必要になります.

次回はこれらの部品をルンバにのせるフレームを3Dプリンタで出力します.

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.

著者:Ryosuke Tajima

ルンバとラズベリーパイとレーザ距離センサによる自律移動ロボット Roomblock(3)

前回はルンバと通信するためのROIコネクタについて紹介しました.今回はルンバと通信するための計算機として用いている,ラズベリーパイ(Raspberry Pi)について書きます.

ラズベリーパイについては改めて言うまでもないかもしれませんが,低価格なARM搭載のボードコンピュータです.Roomblockで用いているのはラズベリーパイ2です.通常のPCと同じように,Ubuntuをインストールしたあと,ROSをインストールすることができます.

IMG_2457

Raspberry Pi 2

ルンバのROIコネクタとラズベリーパイは,USB-シリアル変換器を使って接続します.変換器を内蔵したケーブル秋月電子で購入できます)を使うと,ミニDINコネクタとはんだ付けするだけで写真のようなケーブルが出来上がります.Roomblockで唯一のはんだ付けが必要な部品ですが,3,4箇所をはんだ付けするだけなのでそれほど難しくないと思います.


IMG_2328IMG_1720 (1)
USB-シリアル変換ケーブル
「ラズベリーパイ自身がシリアルポートを持っているのではなかった?」と思った方,その通りです.工作の手間ができるだけ少なくなるようにUSB-シリアル変換器を使っていますが,おそらくラズパイの内蔵シリアルポートを配線しても動作すると思います.興味のある方は試してみてください.

ラズベリーパイの電源はどうしましょうか?ルンバのROIポートにも電源が出ているのですが,これはルンバのバッテリの電圧がそのまま出ているので,使う場合には電圧の変換が必要になってしまいます.Roomblockでは市販のUSBモバイルバッテリーを別電源として使用することにしました.10000mAのものが3000円程度で購入できる,良い時代になりました…これでラズベリーパイを数時間は動作させることができます.

IMG_1618

USBモバイルバッテリー

今回はここまでです.次はレーザースキャナについて紹介します.

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.

著者:Ryosuke Tajima

ルンバとラズベリーパイとレーザ距離センサによる自律移動ロボット Roomblock(2)

前回紹介したRoomblockに使えるルンバは,500, 600, 700, 800 シリーズと呼ばれるものです.これらの機種は,外部と通信するためのシリアルポートを備えています.ただし,現在の最上位機種のルンバ900シリーズは,画像による地図生成までできるすごいものですが,シリアルポートを備えていないのでRoomblockのベースとしては使用できないので注意してください.

ところでそのシリアルポートはルンバのどこにあるのでしょう?シリーズにより位置が異なります.500シリーズ,600シリーズは,上面のカバーを外さなければなりません.このカバーは4か所のツメで固定されていて,最初は少し硬いので外すのに力が必要です.ケガや破損に十分注意してください.


IMG_2455IMG_2453
Roomba 500シリーズのROIコネクタ
カバーを外すと,ミニDIN7ピンのコネクタが現われます.これがROI(Roomba Open Interface)コネクタと呼ばれるものです.

700シリーズ,800シリーズは,ルンバ上面の取っ手の下にROIコネクタがあります.カバーを外す必要はなく,取っ手を持ち上げるだけでアクセスできます.


IMG_2450IMG_2451
Roomba 700シリーズのROIコネクタ
以前は,このROIコネクタをPCと繋げるためのケーブルや,BluetoothWiFiで無線化するモジュールが販売されていましたが,,今は手に入らなくなっています.Roomblockでは,ルンバの上に搭載した計算機(ラズベリーパイ)をROIコネクタに接続しますが,これについては次回紹介します

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.

著者:Ryosuke Tajima

Roomblock: ループを含む大きな建物での地図生成

名城大学構内で実験させていただいたデータから,ROSの地図生成パッケージで地図を生成してみました.データはROSのbagファイルとして取得したので,同じデータに対して異なる地図生成パッケージを適用することが可能です.

ROSの地図生成のパッケージとして,

  •  gmapping
  •  slam_karto
  • hector_slam
  • Google cartographer

の4つのパッケージを用います.

これまで家屋や廊下など,比較的狭い環境で地図を作ってきました.それらの環境ではどの地図生成パッケージも,(誤差はともかくとして),自律移動に使えないような大きく矛盾する地図を作成することはありませんでした.狭い部屋では,基本的にレーザセンサのデータをずっとつなぎ合わせ続けることで,部屋の地図を作ることが可能です.

しかし,今回のデータは非常に大きな建物の長方形の廊下を一周したものです.廊下を一周回って元の場所に戻ってきた時,それが元の場所であることを認識せず,そのままレーザセンサのデータをつなぎ合わせていくと,最初に作った地図と矛盾したものを上書きし続けてしまいます.これを避けるためには,現在居る場所が以前来たことのある場所であると認識した上で,地図全体を辻褄があうように生成しなければなりません.これは”loop closure”と呼ばれ,地図生成では非常に難しい問題です.

以下の動画は,4つのパッケージで地図を生成した結果をまとめたものです.地図のグリッドサイズは5cmとし,各パッケージのパラメータのほとんどはパッケージの規定値のままで,一部のパラメータのみ少し調整しました.

gmappingは非常に健闘しました.途中の廊下は真っ直ぐになっておらず,地図の形は後半にかけて不正確になっています.これはルンバのあまり正確でないオドメトリを少し信頼しすぎているようです.しかし,一周回ってきた最後に注目してください.以前来たことのある場所だと認識し,辻褄があうように地図全体を変形させました.矛盾のない,ほぼ正しい地図が出来上がりました.

slam_kartoは,今回はloop closureの検出に失敗してしまいました.一周回ってきた後,最初に作った地図を破壊しながら,新しい地図を上書きしていきます.矛盾した地図となってしまいました.

hector_mappingには,じつはloop closureの機能がありません.また,車輪の回転速度(オドメトリ)を使っていません.そのため,この環境ではうまく地図を作ることはできませんでした.

Google cartographerは最後発で,しかもこのような大規模環境の地図を作るために開発されたアルゴリズムです.やはりループを正しく閉じることに成功しました.


gmapping_mapkarto_maphector_mapcartographer_map

最終的に生成された地図(左から,gmapping, slam_karto, hector_slam, cartographer)

 

以上の結果は,どのパッケージやアルゴリズムが優れているか,どのパッケージを選ぶべきかということを示すものではないことに注意してください.今回,パラメータはほとんどチューニングしなかったので,それぞれのパッケージの最高の性能が出ているわけではありません.また,それぞれのアルゴリズムには得意不得意があるので,課題に対してどれが良いかは,実際に試してみないと分からないことが多いはずです.

現在のところROSはこのような様々な地図生成パッケージを比較検討できる唯一のプラットフォームです.オープンソースの利点を活かし,ぜひご自分の手で確かめてみることをお勧めします.

TORKでは,自律移動編を含むROS初級,中級のワークショップ,企業や大学でのプライベートワークショップのご依頼も承っております.お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Ryosuke Tajima

ルンバとラズベリーパイとレーザ距離センサによる自律移動ロボット Roomblock(1)

弊社のROS中級ワークショップ・自律移動編では,ルンバをベースとした自律移動ロボット”Roomblock”を教材として使用しています.不定期なエントリとして,このRoomblockの内容を紹介していきます.

まず,Roomblockは車輪移動台車として,iRobot社のお掃除ロボット,ルンバ(Roomba)を使用しています.驚かれる方もいるかもしれませんが,ルンバは実は通信用のシリアルポートを持っていて,パソコン等から操作したりセンサ情報を取得することが可能なのです.ルンバのこの機能は,発売当初から一部のエンジニアやホビイストの間で話題になり,ルンバを操作して楽しむ”Roomba Hacking”がブームとなったほどです.ROSが登場するよりもずっと前の話です.

IMG_1704

もう壊れてしまいましたが,2007年に私が初めて購入したRoombaです

iRobot社からは,”iRobot Create”という,掃除機能を省いた教育向けのルンバが発売されていたこともありました.ROSでも初期のTurtlebotプラットフォームは,このCreateをベースにしていました.現在はiRobot Createの販売は終了しており,TurtlebotもKobukiを用いたTurtlebot2, そしてRobotis社による独自プラットフォームTurtlebot3へと進化しています.

そんな中,なぜ今お掃除ロボット,ルンバを教材のベースとしたのでしょうか?3つ理由があります.

1つめは,ロボットの全体の価格をできるだけ抑えるためです.発売当初は割高に感じたルンバも,普及が進み今では3万円台から手に入るようになっています.屋内での自律移動に適したサイズ,車輪,センサなどを備えたロボットとしては破格です.

2つめは,ROSのパッケージがすでに存在していることです.それらを利用して,自律移動技術の本来的な目的である,地図生成や経路計画のソフトウェアの学習をすぐに始めることができます.

3つめは,ルンバが掃除をしてくれるからです…当たり前ですね.しかし,余暇にロボティクスを勉強したいエンジニアが,家族に「自律移動ができる10万円のロボットを買いたい」と言って納得してもらえるでしょうか?「ルンバなら掃除もしてくれるよ!」というとみんな喜んでくれます.

IMG_2278

最近では「ルンバ対応」のリビングチェアなるものまであります

おっと,つい話が長くなってしまいました.私ルンバが大好きなもので….今回はここまでです.

次回はルンバのシリアルポートについて紹介します.

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.

著者:Ryosuke Tajima

名城大学にて自律移動ロボットのデモ&実験をさせていただきました

 
ROS初級と中級・自律移動編を受講頂いた名城大学メカトロニクス工学科様のご好意で,自律移動ロボット”Roomblock”のデモンストレーションをさせていただきました.

ものの数分で部屋の地図を作った後,障害物を避けながら自律的に移動するロボットに,学生さんたちも興味津々でした.

2017-06-28 12.32.23 navigation_stage_3
その後,名城大学の真新しくてモダンな構内で,ロボットを動かしてデータを取る機会をいただきました.大きな長方形の通路を一周し,これまでにない大きなループの経路のデータを取ることができました.果たして,RoomblockとROSの地図生成パッケージはちゃんと地図を作ることができたのか,後ほど報告したいと思います.

IMG_2401 IMG_2414
名城大学の目黒先生,学生の皆様方,ご協力どうもありがとうございました.

TORKでは,自律移動編を含むROS初級,中級のワークショップ,企業や大学でのプライベートワークショップのご依頼も承っております.お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Isaac Saito

NEXTAGE OPEN も登場:MoveIt! 5周年記念モンタージュビデオ

ROS の動作計画ライブラリ MoveIt! が,5周年を記念してアプリケーション例のビデオを公開しました.

MoveIt! チームがこのようなビデオを公開するのは4年前・2013年に次いで2度目ですが,ソフトウェア公開間もなかった当時と比べ,だいぶ Pick&Place,物を掴んで目的地に設置するというタスクが多く,技術の進展が窺えます.個人的には MoveIt! の課題領域としても挙げられている台車,水中ローバ等の移動体に取り付けられたアームの制御例が数件含まれ,既に実現されてるのかも気になります (このページの “Mobile base integration”).

また弊社がその opensource 版ソフトウェアのメンテナンスに積極的に関わり,サポートサービスも提供させて頂いているカワダロボティクス社製 NEXTAGE OPEN も登場します.弊社ブログ上でもお馴染み?の Spain のシステムインテグレータ・Tecnalia 社が手がける Airbus 向けアプリと思われます.

Hironx in motion from MoveIt! 5-year montage. Image courtesy of Tecnalia

Hironx in motion from MoveIt! 5-year montage by courtesy of Tecnalia

TORK では2013年の創業以来,ROS,MoveIt! のソフトウェア改良,普及に貢献し続けています.貴社ロボットへの MoveIt! の導入御検討であれば,弊社ワークショップで体験もできますので,参加を是非御検討下さい.

P.S. 今回のビデオの開発者一覧も公開されました.

(0:06) Delft Robotics and TU Delft Robotics Institute
(0:09) Techman Robot Inc.
(0:13) Correll Lab, CU Boulder
(0:37) Nuclear & Applied Robotics Group, Unv Texas
(0:50) Beta Robots
(0:55) GIRONA UNDERWATER VISION AND ROBOTICS
(1:03) Team VIGIR
(1:34) Honeybee Robotics
(1:49) ROBOTIS
(1:58) TECNALIA
(2:05) Correll Lab, CU Boulder
(2:26) TODO Driving under green blocks
(2:38) ROBOTIS
(2:54) Fetch Robotics
(3:05) Hochschule Ravensburg-Weingarten
(3:12) TU Darmstadt and Taurob GmbH – Team ARGONAUTS
(3:20) isys vision
(3:27) Technical Aspects of Multimodal System Group / Hamburg University
(3:33) Clearpath Robotics
(3:43) Shadow Robot

著者:Isaac Saito

MoveIt! 計画された軌道のビジュアライゼーション

2017年6月初のパッケージ更新により MoveIt! が更新され,これまで要望のあった軌道の目視確認機能が追加されました.
これまでは,生成させた経路を確認するには,RViz 上で “Loop Animation” をオンにして経路を反復再生させる手があったかと思います.この方法だと経路の途中の任意の経由点で止めることはできませんでした.
今回追加された機能を使うと,RViz 上でスライダを移動することにより,軌道の経由点を静止した状態で目視確認できます.

Introspect waypoints in a planned trajectory on MoveIt! on NEXTAGE Open.

As you see on the slider on the left side, you can now introspect each waypoint in a planned trajectory on MoveIt! on NEXTAGE Open.

本機能を有効にする方法はチュートリアルを参照下さい.

著者:Ryosuke Tajima

ROS Intermidiate (Navigation) Workshop in Nagoya 名古屋にてROSワークショップ中級・自律移動編を開催しました

We had the intermidiate ROS workshop on navigation at Meijo University, Nagoya, Aichi. They learned the navigation features of ROS using simulation and a real robot named “Roomblock”, Roomba based robot. Mapping, localization, control are

Thanks everyone, and well done!!


前回の初級編に続き,名古屋市の名城大学メカトロニクス工学科で,プライベートROSワークショップ中級・自律移動編を開催しました.この自律移動編は今年度から新しく始まったもので,初めての開催となります.

中級・自律移動編では,まずシミュレータを用いた自律移動技術のハンズオンを行います.つぎに,iRobot社の掃除ロボット,ルンバをベースにした自律移動ロボット”Roomblock”を用いて実際に地図生成と自律移動を行います.”Roomblock”はラズベリーパイとLIDAR(レーザ距離スキャナ)を備えた立派な自律移動ロボットで,部屋の地図を作り,目的地を設定してそこに移動することができます.最後に,ROSの自律移動機能の解説(全体の構成,関連するtopic, move_baseの仕組みなど)を受け,ハンズオンで出てくる疑問点を解消していきます.

車輪移動ロボットの操作方法,地図の生成,自律移動を実際にやってみることで,自律移動技術の理解がより深まるものと思います.参加者の皆様方,お疲れ様でした.今後の研究開発の一助となれば幸いです.

このように,TORKでは企業や大学でのプライベートワークショップのご依頼も承っております.また,本年からは中部地区での開催を増やしていこうと考えています.お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

IMG_2340

IMG_2346

IMG_2347

著者:Ryosuke Tajima

ROS Basic Workshop in Nagoya. 名古屋にてROSワークショップ初級編を開催しました

We had ROS Workshop at Meijo University, Nagoya, Aichi. They run through the basic of ROS, such as sensing, actuating and connecting them together. Many questions and answers was made, for comprehensive understanding to use ROS.

Great work, everyone!!

名古屋市の名城大学メカトロニクス工学科で,プライベートROSワークショップ初級編を開催しました.

初級編では環境の構築からセンシングデバイス(LeapMotion),ラジコンサーボ(Dynamixel)をROSで動かすところまでを半日で行いました.その中で出てくる疑問点(たとえばROSの概念的な部分から具体的な操作など)にもお答えいたしました.

これからバリバリ研究して行こうという学生のみなさんに,まずはROSを効率よく使っていくお手伝いができたのではないかと思います.

ROSを初めて勉強する人へのブログも公開しています. 合わせてご参考になさってください.

このように,TORKでは企業や大学でのプライベートワークショップのご依頼も承っております.また,本年からは中部地区での開催を増やしていこうと考えています.お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp


IMG_2313

IMG_2308

著者:Yumiko Suzuki

ROS Workshop for Beginners on 14th June ROSワークショップ初級編を開催しました

We had ROS Workshop at Yurakucho, Tokyo.
We used custom ROS-preinstalled LiveUSB, so people had ROS experience without change your PC environment.
All of attendee ran through the all topics.

Great work, everyone!!



今回も有楽町の会議室にてROSワークショップ初級編を開催しました.
参加者の方が開発中のシステムの質問もお受けしました.皆様お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.

7-8月のワークショップ日程を公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

著者:Isaac Saito

(図面付き) NEXTAGE OPEN の頭部カメラのキャリブレーションHead-mount stereo camera calibration for NEXTAGE OPEN


NEXTAGE OPEN で頭部ステレオカメラを利用する際の,カメラの姿勢を手軽にキャリブレーションする方法を公開しました

ROS では幾つかカメラを用いたキャリブレーション用パッケージが利用できます.ROS 初期の代表的ロボット PR2 向けに作られた calibration,産業用ロボット向けに豊富な機能を持つ industrial_extrinsic_cal,最近ではキャリブレーション結果を用いてロボットのキネマティクス情報を更新してくれる robot_calibration というのもあります.いづれもハードウェア and/or ソフトウェアの前準備が大変だったり,高機能ゆえに計算に時間がかかったりと,扱いに慣れが必要です.

今回ご紹介する方法は基本的にチェッカーボードをロボットに固定さえすれば実施可能です.詳しい方法を ROS wiki に記載しています.ステレオカメラで胸部あるいは腰部に固定したチェッカーボードを認識することにより,頭部カメラのロボット上の相対姿勢を取得します.カメラの据付位置座標が分かれば,Gazebo シミュレータ上でもキャリブレーションを行い相対姿勢を取得することが可能です.


胸部に付けたチェッカーボードを認識中


ロボットに固定したチェッカーボードを認識することで,ROS の座標変換ライブラリ “tf” により,カメラの正確な相対姿勢が判明します.


Gazebo 上の Kinect でチェッカーボードを認識している様子.

なお,キャリブレーションに用いたチェッカーボードの NEXTAGE OPEN 本体への取付けに必要な部品一式の図面もGitHub 上で公開しています.また,TORK では Xtion をかっこ良く頭部に取り付けたい場合 外装を御用意しています (日本国内のみ).

現状では上記 wiki ページで紹介されている方法は Kinect 或いは Xtion を利用しています.NEXTAGE OPEN がデフォルトで搭載する頭部の Ueye カメラ二基を用いても同じ方法は有効のはずですが,Ueye 個別の操作方法は未だ記載していません.ROS wiki は誰でも編集できるので,もし Ueye でキャリブレーションに成功した方がいたら是非情報を追記頂けると,全世界の NEXTAGE OPEN ユーザが喜ぶと思います!


Recently we’ve updated the instruction for the NEXTAGE OPEN’s calibration using head-mount stereo cameras.

There has been mutilple camera/robot calibration packages in ROS; calibration package worked well for the PR2 robot, a high-functional reference model of ROS in the early era until very recently. Then for industrial usage industrial_extrinsic_cal was developed with abundant functionalities to cope with complexed needs. Relatively newer robot_calibration package, which is maintained by the warehouse robot manufacturer Fetch, even updates the robot’s kinematics parameters using the calibration result. Almost all of these practical features come with a cost of labor in hardware and/or software, however.

The approach we’re presenting is simple enough since all you need is a checkerboard — not even a board but a plain or even a piece of paper will do as long as checker matrix is printed on it. Detailed steps are available on ROS wiki. Basically get the pose of the camera mounted on top of the head or actually anywhere on the robot, by recognizing the checkerboard. You can also carry out the calibration on Gazebo simulation as long as you know the location to attach the camera so that you can spawn the camera’s 3D model in the virtual world.


Detecting a checkboard at the chest.


Recognizing the checker pattern, which is in a fixed pose w.r.t the robot, yields the camera’s relative pose w.r.t the robot as a result of “tf” computation.


Seeing checkerboard through a simulated Kinect on Gazebo.

We’ve also made the design of the checkerboard kit publicly available on NEXTAGE OPEN’s GitHub repository so that any handyperson can go through these steps.

As of now the instruction in the wiki above only uses Kinect or Xtion, i.e. the operation of the Ueye cameras that NEXTAGE OPEN comes with by default is a bit different but that’s not documented yet, although the calibration part is intended for any ROS-based stereo camera so it should work for Ueye too. Every one is welcomed to edit ROS wiki to add your findings in this regard. Power of opensource!

著者:Yumiko Suzuki

ROS Workshop for Beginners on 22th March ROSワークショップ初級編を開催しました

We had ROS Workshop at Hongo, Tokyo.
We used custom ROS-preinstalled LiveUSB, so people had ROS experience without change your PC environment.
All of attendee ran through the all topics.

Great work, everyone!!



本日も本郷のミーティングスペースにてROSワークショップ初級編を開催しました.
ご自分のPCでUubuntu環境が準備できなくても,LiveUSB等でワークショップを体験できます.
一つ一つのタスクに対して積極的な質問をいただきながら最後まで完遂しました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.

4-6月のワークショップ開催日程も公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp


IMG_20170322_172936

著者:Yumiko Suzuki

ROS Workshop Schedule, from February to March 20172017年2月-3月のROSワークショップ日程


Here are the schedule of our ROS workshop series during the first three months of 2017!

Feb. 22 Wed 13:30- Introductory
Mar. 02 Thu 13:30- Introductory
Mar. 16 Thu 13:30- Introductory
Mar. 22 Wed 13:30- Introductory
Mar. 29 Wed 13:30- Introductory

Venue: Hongo, Tokyo

Inquiries: info[at]opensource-robotics.tokyo.jp



以下日程でROSワークショップを行います.

2月22日(水)13:30~ ROSワークショップ初級編
3月02日(木)13:30~ ROSワークショップ初級編
3月16日(木)13:30~ ROSワークショップ初級編
3月22日(水)13:30~ ROSワークショップ初級編
3月29日(水)13:30~ ROSワークショップ初級編

場所は都内・本郷のミーティングスペースでの実施を予定しています.
中級編についてはご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Yumiko Suzuki

ROS Workshop for Intermediate Manipulation on 31th January プライベートROSワークショップ中級・マニピュレーション編を開催しました


We had ROS Workshop for Intermediate Manipulation at Nagoya, Japan.

The participants also joined our Beginners Workshop a few weeks ago, then re-setup own PC and review all contents.

Thanks you for joining us!!


今回は企業様の会議室をお借りして,プライベートROSワークショップ中級・マニピュレーション編を開催しました.

長時間の講習お疲れ様でした.ご依頼いただきありがとうございました.

2017年4-6月の初級編のスケジュールを公開しています.

プライベートワークショップ,出張ワークショップ,カスタマイズワークショップ,その他ご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

IMG_20151118_175839

著者:Isaac Saito

2017 MoveIt! 新機能その2;動作の停止.求ム実機テスター!2017 MoveIt! update pt.2; Stopping motion on NEXTAGE needs your help


MoveIt! の年初一発目の更新については前回機能を一つ,NEXTAGE Open を利用してお伝えしました.今日ご紹介する動作計画の停止機能は,弊社でも要望を何度もユーザ様から伺っていた機能です.

平たく言えば,ロボットが任意の動作を実行している最中に,途中で停止する機能です.動作を停止したい状況は安全に関わるケース以外でもいろいろ考えられるため,非常停止装置などを用いて危険回避目的でロボットの全動作を停めるのではなく,プログラミングのレベルで特定の動作だけを停止ができるとアプリケーション開発上嬉しいことがあります.MoveIt! ではこの停止する標準的な方法がなかったのですが,今回追加されました (ちなみに本機能の作成は GSoC で日本人の修士学生が主導した模様).

早速 Pepper のシミュレーションで使ってみました.


In the previous post we introduced one of the many new features that were added to MoveIt! with its first update in 2017. Next feature we want to mention is the “stop motion”, which we’ve received many questions from our NEXTAGE users about.

Other than situations where you need to stop robots to move for the safety reasons, there can be many cases you want to stop/cancel/halt your robot for your application. The standard way to achieve this in MoveIt! had been lacking, which is finally organized this time (lead by a student at GSoC project by the way).

It works well with Pepper robot on simulation. You see the arm stops as soon as the “stop” button on RViz was clicked.



RViz 画面上に新たに追加された “Stop” ボタンを押すと,腕の動作が止まっているのがわかりますでしょうか.

この便利機能なのですが,弊社がサポートする NEXTAGE Open のオープンソースソフトウェアではまだ動作しません.修正パッチが作成され,シミュレーション上では期待通り動作することが確認されましたが,ロボット実機の挙動への影響があり得るため,実機テストが必要となっています.NEXTAGE Open をお持ちの方々で,もしテストに協力しても良いという方がいらっしゃれば,info[a_t]opensource-robotics.tokyo.jp 宛に連絡頂くか,Github 上の当該の問題のチケットに書き込みいただければ,ご支援させて頂きます.


This nice feature, however, does not YET work with the NEXTAGE Open. Don’t worry much, there’s a work going on already and we confirmed a patch submitted from a community member solves the issue on simulation! We just need to test the patch on the real NEXTAGE Open robot, and this is where we need a help from the robot owners. If you think you can help us testing with your own robot, please contact TORK at info[a_t]opensource-robotics.tokyo.jp or joint the discussion at the ticket for this issue on Github so that we’ll communicate with you. Thank you for your understanding toward opensource!

著者:Isaac Saito

First MoveIt! Update in 2017. Using it on NEXTAGE pt.12017年始早々 MoveIt! 新バージョンがリリース.NEXTAGE で使ってみる その1

MoveIt! の最新バージョンが公開になりました.昨2016年にメンテナンスチームがリニューアルして以降,MoveIt! の開発が活発になり,それまで溜まっていた問題報告やパッチ候補の処理が加速しました.今日現在利用可能な ROS の3つの異なるディストリビューションそれぞれに最新版がリリースされています (Indigo 0.7.6, Jade 0.8.3, Kinetic 0.9.3).今回のリリースではバグ修正に加え,ユーザの要望の高かった機能も幾つも追加されています.その内の一つの機能をカワダロボティクス社の NEXTAGE Open のシミュレータを用いて見てみます.

1.軌道実行時の際の速度・加速度をの動的に変更

MoveIt! の RViz プラグイン上に新たな機能が追加されました.スピンボックス上の値を 0-1 の間で変更することでロボットアームの軌道実行の速度,加速度を変更できます.
御自身のロボットの3次元モデルファイル (URDF 或いは SRDF) 内に指定している関節速度/加速度を0-1の間でスケールすることができるようになっています.


New version of MoveIt! binary 0.7.6 is just released for ROS Indigo, first time in 2017 (for sure!) and first release since June 2016. This version comes with some long-wanted features (along with bug fixes of course) that we’re trying out using NEXTAGE simulator.

1. Changing trajectory velocity and acceleration during runtime

Changing the speed of the trajectory during runtime has been one of FAQs from NEXTAGE users who use MoveIt!, let alone many MoveIt! users on the globe. Now through MoveIt! RViz plugin you can conveniently configure that on the fly on the spinboxes added.

moveit-rviz_vel-accel_nxo_2

RViz 上でなくプログラマティックに変更したい場合は MotionPlanRequest トピックの値を変更することで runtime/プログラム実行中に変更できます.

次回に続く.


To configure that programmatically, see this tutorial that explains chainging MotionPlanRequest topic would do the work.

TORK is very actively contributing the development and maintenance of MoveIt!.

著者:Yumiko Suzuki

【2016年プレゼント企画】Opensourceに貢献しましょう!

皆様,2016年お世話になりました.また,特にロボティクス関連のオープソースへご協力頂いた皆様,ありがとうございました.
皆様のご貢献への感謝として,ささやかではありますが以下の写真にあるROS初級編資料やROS対応LiveUSBをプレゼントする企画を実施します.

2016年中に皆様自身が行った,

  • ROS JAPAN Users GroupのMLへの投稿やanswers.ros.orgへの質問/回答
  • roswikiへの情報追加・修正
  • githubでのソフトウェア公開

など,オープンソースへの貢献についてリンクを頂いた皆様に,何らかのプレゼントを送付させていただく予定です.是非ご応募下さい.また,質問等されていない方は,ぜひ今からでも間に合いますので,ML等へのご質問をしていただければと思います.

まだオープンソースに貢献できていないけれどどうしても今プレゼントがほしい方も,アンケートにお答えいただければ数がある限り対応いたします.是非アンケートに回答して応募してみてください!
プレゼントは要らないけれどアンケートに答えたい方も大歓迎です!

締め切りは2017年1月10日(火)です.
ご応募お待ちしております!
応募アンケートリンク

※応募多数の場合は抽選になります.ご容赦くださいませ.

弊社の情報発信はこのblogとFacebook,twitterアカウントがあります.
FBにいいね!やtwitter投稿のリツイートもお待ちしております!

2017年もオープンソースコミュニティを盛り上げて行きましょう!
IMG_5633

著者:Isaac Saito

TORK to co-host Toyota HSR workshop for usersトヨタ HSR ユーザ向けセミナを行いました


トヨタ自動車株式会社 (以降トヨタ) 様 の生活支援ロボット “HSR”のユーザ様向け技術者セミナを,全国4箇所にて開催しました.

TORK はこれまでにも2014年の第1回昨・2015年の第2回のハッカソン開催へのご支援を中心に HSR 開発に御協力をさせて頂いてきました.昨年までは HSR を所有するユーザが未だあまり居ない中での開催でしたが,HSR 開発者コミュニティが昨年発足し,HSR を所有する組織が拡大したのを受け,今回はそれら所有者で形成されるコミュニティのメンバー向けでした.

HSR の扱い方や ROS を用いたプログラミングといった技術的内容に加え今回は,トヨタ様の意向もあり,開発者コミュニティの積極的な利用に重きを置きました.
ユーザがネット上でグループを形成し議論する”コミュニティ”は,ROS をはじめ多くのソフトウェアのプロジェクトが汎く普及するにあたってその整備が欠かせないと言われています.HSR 用の開発コミュニティはトヨタ様が直接運営し,メンバ間での情報共有や議論に必要なツールが提供された本格的なものです.コミュニティをうまく利用することにより,御自身の開発を加速できると共に,開発者コミュニティ自体が成長し,それによって御自身の開発に更にメリットが還ってくる,という良い循環が生まれます.そうして一組織だけでなく,HSR 開発者コミュニティ全体で成果を共有し発展していくのが狙いです.


TORK has been partnering with the “HSR” welfare robot’s dev team at Toyota Motors Corporation (TMC). In 2014 and the last year 2015 we worked together with them for the hackathon.

This year we worked with TMC again to host developers workshop at 4 venues in Japan. In addition to going over the robot’s unique features and programming using ROS, we particularly focused on utilizing the online community designated for HSR owners, which TMC initiated in 2015 and maintains by themselves (membership-only as of today). Goal is that participants get hands on experience in interacting on the developers community so that they can accelerate their own development, which also contributes to develop the community size and maturity, which the developers ultimately appreciate. That said the seminar series this time is the beginning of building the communiy’s life cycle as TMC’s dev team intended.

CIMG3657 CIMG3749 tokyo20_crop S2060008 IMG_20161108_112241 IMG_20161108_111225 DSC_0312 DSC_0302

本セミナ期間中は,プログラムを実行しても動かないだとか,実装の方法が分からないといった問題に当たったら,問題解決を自分だけで行うのではなく,コミュニティに質問し意見を伺いながら進めるよう提案しました.質問文を作成すること自体慣れないと時間が取られますし,技術者として他人に質問するのも,研究室ごとの質問に関する文化もあってか,勇気がいることでしょう.最初は中々質問が出ないこともありましたが,トヨタ様はじめ積極的な回答者の適切な回答のおかげもあり,質問するメリットを感じて頂けたかと思います.何より,セミナ実施後は実施前に比べ開発者コミュニティでの情報の流通量が大きく増えました.

またセミナ中,HSR に依存しない問題 (ROS 一般に言える問題等) についてはそれぞれのコミュニティを利用することをお伝えし,コミュニティ例として ROS 日本語ユーザグループ “ros-japan-users” を紹介し,セミナ中に何度か試しに投稿して頂きました.その効果なのかどうか分かりませんが,セミナ開始した2016年10月以降の同グループの投稿数が下図のように一気に増えました.もし本セミナの参加者様が質問することに抵抗が減ったのであったり,セミナ無関係の方でも投稿が増えたのを見て質問する心理的障壁が少しでも下がった結果であったりするなら幸いです.


Also discussed is problem isolation – engineers often need to figure out the types of problems and post questions at the best community per incident. This is more an advanced subject, but participants well exceeded our expectation to separately post HSR-specific questions and generic-ROS questions on the forums of each. This may have resulted in the positive spike of the number of posts at the ROS Japanese user groups as you see in the graph below (workshop series started in October).

graph_num-newPost_ros-japan-users_2016


最後に幾つか,各セミナ回の最後に行ったコーディングチャレンジの動画をご紹介して終わります.HSR・ロボットコミュニティの益々の発展に微力ながら貢献できていれば何よりです.


Closing this blog post with some videos from the code challenge at the end of the workshops. We truly hope that we’ve contributed to the HSR and the world of robotics community by encouraging community involvement.






著者:Kei Okada

How to Ask Question質問の仕方


メール,掲示板での質問の仕方のTipsです.初心者の方は何を質問しても,「それだけだと分からない.もっと情報をください」と言われることが多いかと思います.どのように質問したらいいか?一番の目安は「困っている人のトラブルを再現できるかどうか」です.以下に例を見てみましょう.

もし,他の人も使っている汎用のプログラムだったら,

  $ rviz
  と打ち込み,rvizを実行しました

または,

  $ roslaunch urdf_tutorial xacrodisplay.launch model:=`rospack find pr2_description`/robots/pr2.urdf.xacro
  と打ち込みました.

など,相手も同じ問題を再現する方法が質問に含まれているか確認しましょう.

もし,自分しか使っていないプログラムの場合は,そのプログラム一式を圧縮ファイルにして質問に添付するのが簡単です.圧縮ファイルの作り方は,catkinワークスペースで

  $ tar -cvzf my_package.tgz ./src

としましょう.これで生成されたmy_package.tgzを添付すればOKです.

また,添付ファイルを使えないようなメール,掲示板の場合は,ソースコード一式をGitHubにアップロードする方法もよく使われます.GitHubが初めての場合は,http://qiita.com/dev-neko/items/28ac253ea295ad6c2b73 などが参考になるでしょう.

もし,開発しているソースコードに秘密情報が入っておりアップロードすることが困難な場合は,秘密情報を抜いて一般的な問題として再定義し,そのプログラムを作ってアップロードするとと良いかと思います.また,私達のようなROS専門のコンサルタント業者にお問い合わせいただくことも可能です.

また,困っている人と同じ状況を再現するまでもなく,プログラムの出力ログを見ると原因がわかる場合も有ります.プログラムの出力ログを貼り付ける時は,自分でここは重要な箇所ではない等と判断せずに,プログラムの全ての出力を添付するのが重要です.

ROSプログラムのログの取得方法はいくつか有ります.
roslaunchを使ってプログラムを立ち上げた場合,以下のようにlogging to..というメッセージが紹介されます.

  $ roslaunch urdf_tutorial xacrodisplay.launch model:=`rospack find pr2_description`/robots/pr2.urdf.xacro
  ... logging to /home/tork-a/.ros/log/abfd7cb2-b476-11e6-907c-e4a7a00bd84e/roslaunch-ubuntu-14449.log

このとき,/home/tork-a/.ros/log/abfd7cb2-b476-11e6-907c-e4a7a00bd84e/ にあるファイルを全て提出すれば,質問された人も何が起こっているか理解することができます.
また,最新のログファイルは常に~/.los/log/latest/ から参照できるようになっています.
上記の様にtarコマンドで圧縮ファイルを生成してもよいですし,最近はテキストファイルのアップロード場所として gist.github.com もよく利用されます.
gist が初めての場合は http://tyoshikawa1106.hatenablog.com/entry/2013/04/10/000026 などが参考になるでしょう.

他には

  $ rviz 2&>1 > rviz.log

として標準出力とエラー出力の両方をリダイレクトしてファイルに書き出す方法もよく利用されます.この場合,全ての出力がファイルに書きだされ画面では見ることができないですね.teeコマンドを使うと入力を標準出力に書き出しながらファイルにも書き出します.

  $ unbuffer rviz 2&>1 | tee rviz.log

unbufferを付けないと,rvizの出力がバッファされてなかなか表示されません.unbufferがインストールされていない場合は,`sudo apt-get install expect-dev` として下さい.

roslaunchはデフォルトでは各ノードの出力を標準出力には表示しません.表示したい場合は,

  $ roslaunch --screen urdf_tutorial xacrodisplay.launch model:=`rospack find pr2_description`/robots/pr2.urdf.xacro

と,screenオプションをつけると良いでしょう.ログファイルを作るのは

  $ roslaunch --screen urdf_tutorial xacrodisplay.launch model:=`rospack find pr2_description`/robots/pr2.urdf.xacro 2>&1 urdf.log

または,

  $ unbuffer roslaunch --screen urdf_tutorial xacrodisplay.launch model:=`rospack find pr2_description`/robots/pr2.urdf.xacro 2>&1 | tee urdf.log

ですね.

大量の添付ファイルや情報を添付することに躊躇する方も多いかもしれませんが,それらの情報がなければ問題を解決できないので嫌がれることはありません.

質問する際には,相手が自分と同じ問題を再現できるか,あるいは再現しなくても状況が理解できるような十分なログを提供しているかをぜひ再確認して,質問には十分すぎる情報を添付してみましょう.


Today, we’ll show some tips on how to ask question on mailing list or message board. If you are beginner and asked question, sometimes you’re required to provide more information. So most of cases, we believe people have trouble because they do know to know how to ask question. One criteria is “Do you provide enough information that others can RE-PRODUCE your problem”. Let’s see some examples.

If you’re using general program, which someone may using. Information such as

  I executed rviz program by
  $ rviz

Or,

  I typed as follows
  $ roslaunch urdf_tutorial xacrodisplay.launch model:=`rospack find pr2_description`/robots/pr2.urdf.xacro

enable others reproduce your situation.

If you’re using a program that no other people is using, you can create compressed files as running following command at catkin workspace and attach your question e-mails.

  $ tar -cvzf my_package.tgz ./src

If you’re asking to the mailing list or board which can not use attached file, a common way is to upload a entire source code to GitHub, if you are not familiar with GitHub, http://qiita.com/dev-neko/items/28ac253ea295ad6c2b73 may help.

If your code contains non-disclosed information and does not allow to upload on public place, you can re-define the problem without private information and upload that pgram. Or, you may ask for professional consultants as us.

Sometimes, the problem can be solved by looking at output log of the program, without re-produce the situation. In this case, it is very important not to edit your self by judging this part is important and this part is not, but to put entire log information.

To get output log of ROS program has several ways.

If you started your programs with roslaunch, you can find `logging to..` message as follows

  $ roslaunch urdf_tutorial xacrodisplay.launch model:=`rospack find pr2_description`/robots/pr2.urdf.xacro
  ... logging to /home/tork-a/.ros/log/abfd7cb2-b476-11e6-907c-e4a7a00bd84e/roslaunch-ubuntu-14449.log

Then, if you provide all files under /home/tork-a/.ros/log/abfd7cb2-b476-11e6-907c-e4a7a00bd84e/ directory, people who questions also understand what exactly going one. You may find latest logfile from ~/.los/log/latest/
You may use tar command as we described earlier or gist.github.com is widely used recent days as a public textfile upload service.
If you haven’t used gist, you can refer http://tyoshikawa1106.hatenablog.com/entry/2013/04/10/000026

Other way is to run command like

  $ rviz 2&>1 > rviz.log

to output both standard output and error to files. In this command all information is redirected to the file and no message appeared to the file. tee command will split input information into both standard output and file

  $ unbuffer rviz 2&>1 | tee rviz.log

without unbuffer command, rviz output is buffered and there is delay in the message. If you do not have unbuffer command, try`sudo apt-get install expect-dev`.

sometimes roslaunch do not outputs standard output information of each node, to enable this,use –screen option as follows.

  $ roslaunch --screen urdf_tutorial xacrodisplay.launch model:=`rospack find pr2_description`/robots/pr2.urdf.xacro

To create log file, you can use

  $ roslaunch --screen urdf_tutorial xacrodisplay.launch model:=`rospack find pr2_description`/robots/pr2.urdf.xacro 2>&1 urdf.log

or

  $ unbuffer roslaunch --screen urdf_tutorial xacrodisplay.launch model:=`rospack find pr2_description`/robots/pr2.urdf.xacro 2>&1 | tee urdf.log

Sometimes people hesitate to attach large text files or information, but without that information, we can not solve your problem. So everyone need huge information.

Whenever you ask someting, please keep in your mind that “Does other people can reproduce your program?” “Did you provide enough information that equivalent to reproduce your program” and attach enough information with your question.

著者:Yumiko Suzuki

ROS Workshop Schedule, from October to December 20162016年10月-12月のROSワークショップ日程


Here are the schedule of our ROS workshop series during the last three months of 2016!

Oct. 27 Thu 13:30- Introductory
Nov. 02 Wed 13:30- Introductory
Nov. 22 Tue 13:30- Introductory
Dec. 01 Thu 13:30- Introductory
Dec. 06 Tue 13:30- Introductory
Dec. 09 Fri 13:30- Introductory
Dec. 21 Wed 13:30- Introductory

Venue: Hongo, Tokyo

Inquiries: info[at]opensource-robotics.tokyo.jp



以下日程でROSワークショップを行います.

10月27日(木)13:30~ ROSワークショップ初級編
11月02日(水)13:30~ ROSワークショップ初級編
11月22日(火)13:30~ ROSワークショップ初級編
12月01日(木)13:30~ ROSワークショップ初級編
12月06日(火)13:30~ ROSワークショップ初級編
12月09日(金)13:30~ ROSワークショップ初級編
12月21日(水)13:30~ ROSワークショップ初級編

場所は都内・本郷のミーティングスペースでの実施を予定しています.
中級編についてはご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

日程の調整,その他ご相談,企業内ワークショップ,カスタマイズワークショップも承っております.お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Isaac Saito

catkin-tools – our OSS contribution pt.2 catkin-tools 便利機能に貢献しました その二


Following our previous post about a nice hidden tip for catkin-tools, here’s another one.

When finishes compilation, `catkin build` shows a pop-up window at the top-right on your screen (if you’re on Ubuntu Linux), which indicates `Build Finished` or `Build Failed`. This is nice in that you can work on another windows without payting attention to catkin’s progress. Caveat is, though, that “Finished” and “Failed” aren’t that obviously differentiating whatsoever.

With the newer version of catkin-tools, 0.4.3 or higher, the window pops up with a distinguishable colors; Green for success and red for failure.

This little but significantly effective change is done by our TORK associates again. The change was made swiftly and neatly as it has always been in the opensource software community.


先日ROS の非公式ビルド/コンパイルツールである catkin-tools について便利な技を紹介しましたが,今日ももうひとつ便利機能を紹介します.

`catkin build` を実行してコンパイルしたあと,ディスプレイの右上に `Build Finished` または `Build Failed` というポップアップウィンドウが表示されますね.これで,catkin-tools を実行しているターミナルで以外のウィンドウで作業していても,コンパイルが終わったことを瞬時に知ることができます.でも,これ,英語に慣れていないと,Finished (終了,正常) なのか Failed (失敗) なのかを瞬時に把握するのが難しいですよね.いや,英語に慣れていても紛らわしいですかね.

そこで catkin-tools のバージョン 0.4.3 からは,成功していたら緑色,失敗していたら赤色のアイコンが表示されるように改善されました.

ちなみにこれも TORK 関係者のプルリクエスト (変更案の提供) によるものでした.こういう小さい改良を根気よく皆で続けることがオープンソースの強みですね.

UPDATE 1/6/2017 catkin_tools 0.4.3 がやっとリリースされ,ここで取り上げている機能が使えるようになりました.記事先行してしまいお待たせしていたら失礼しました.

catkintools_failure

catkintools_success

著者:Yumiko Suzuki

ROS Workshop for Beginners on 13th September ROSワークショップ初級編を開催しました

We had ROS Workshop at Hongo, Tokyo.
One participant prepared own Ubuntu PC and installed indigo, the other used our LiveUSB.

You can experience ROS workshop by the LiveUSB without installation of Ubuntu on your machine.

Thanks you for joining us!!



今回も本郷のオープンスペースにてROSワークショップ初級編を開催しました.
ご自分のPCでUubuntu環境が準備できなくても,LiveUSB等でワークショップを体験できます.

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
実施時間中にROSに関するお困りごとだけでなく,オープンソースを社内で運用していく際の疑問点等にも随時お答えしています.

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

出張セミナー,カスタマイズワークショップ,個別コンサルティング,プライベートワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

IMG_20160913_162032 IMG_20160913_162027

著者:Isaac Saito

catkin-tools tipcatkin-tools 隠れ便利機能その一

ROS ではコンパイルを行う catkin_make という独自ツールが用意されています.CMake というソフト開発でとてもよく使われるコンパイルようツールを拡張したもので,沢山のソフトウェアパッケージを一気にコンパイルする必要も往々にして発生するロボティクスにおいて便利なツールです.一方で,遅い!だとか,コンパイル実行の度にいちいちフォルダ移動めんどい!等課題も多く指摘されており,非公式ではありますが改良版の catkin-tools というのがあります.先に述べたような根本的な問題から,痒い所に手が届く的なウレシイ機能までよく出来たツールで,人気を集めています.

使い方等は上記リンクを辿っていただくことにして,今日はまったく知られていないもののなかなか便利な機能を紹介します.

catkin_make あるいは (catkin-tools だと) catkin build を実行しコンパイルした後に,コンパイル成功したソフトの情報をターミナルに読み込ませるために次のようなコマンドを実行することになっているかとおもいます.

    source ~/catkin_ws/devel/setup.bash

コンピュータ上の path を意識させないのが ROS なので,上のコマンドには違和感を感じ続けてきた方も居たのでしょうか.catkin-tools はやってくれました.まず

    source `catkin locate --shell-verbs`

とすると,catkin source というコマンドがつかえるようになります (back quote に注意).このコマンドは絶対 path を意識せずに環境情報の読み込みが可能にします.例えば,

cd ~/catkin_ws/src/ros_seminar
catkin source

と実行すると,上記の絶対 path コマンドと同じことをしたことになります.どのディレクトリにいても大丈夫なので,例えば次のどれでも結果は同じになります.

 cd ~/catkin_ws/src/ros_seminar
 cd ~/catkin_ws/src/ros_seminar/rosseminar_hironx
 cd ~/catkin_ws/src/

便利ですね!ROS ではコンパイルを行う catkin_make という独自ツールが用意されています.CMake というソフト開発でとてもよく使われるコンパイルようツールを拡張したもので,沢山のソフトウェアパッケージを一気にコンパイルする必要も往々にして発生するロボティクスにおいて便利なツールです.一方で,遅い!だとか,コンパイル実行の度にいちいちフォルダ移動めんどい!等課題も多く指摘されており,非公式ではありますが改良版の catkin-tools というのがあります.先に述べたような根本的な問題から,痒い所に手が届く的なウレシイ機能までよく出来たツールで,人気を集めています.

使い方等は上記リンクを辿っていただくことにして,今日はまったく知られていないもののなかなか便利な機能を紹介します.

catkin_make あるいは (catkin-tools だと) catkin build を実行しコンパイルした後に,コンパイル成功したソフトの情報をターミナルに読み込ませるために次のようなコマンドを実行することになっているかとおもいます.

source ~/catkin_ws/devel/setup.bash

コンピュータ上の path を意識させないのが ROS なので,上のコマンドには違和感を感じ続けてきた方も居たのでしょうか.catkin-tools はやってくれました.まず

source `catkin locate --shell-verbs`

とすると,catkin source というコマンドがつかえるようになります.このコマンドは絶対 path を意識せずに環境情報の読み込みが可能にします.例えば,

cd ~/catkin_ws/src/ros_seminar
catkin source

と実行すると,上記の絶対 path コマンドと同じことをしたことになります.どのディレクトリにいても大丈夫なので,例えば次のどれでも結果は同じになります.

cd ~/catkin_ws/src/ros_seminar
cd ~/catkin_ws/src/ros_seminar/rosseminar_hironx
cd ~/catkin_ws/src/

便利ですね!

著者:Yumiko Suzuki

ROS Workshop for Beginners on 7th September ROSワークショップ初級編を開催しました

We had ROS Workshop at Hongo, Tokyo.
The participant prepared own Ubuntu PC and installed indigo.
You can experience ROS workshop by the LiveUSB without installation of Ubuntu on your machine.

Thanks you for joining us!!



今回も本郷のオープンスペースにてROSワークショップ初級編を開催しました.
ご自分のPCでUubuntu環境が準備できなくても,LiveUSB等でワークショップを体験できます.

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,オープンソースを社内で運用していく際の疑問点等にも随時お答えしています.

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

出張セミナー,カスタマイズワークショップ,個別コンサルティング,プライベートワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

IMG_20160907_160749

著者:Yumiko Suzuki

ROS Workshop for Beginners on 2nd September ROSワークショップ初級編を開催しました

We had ROS Workshop at Hongo, Tokyo.
We used custom ROS-preinstalled LiveUSB, so people had ROS experience without change your PC environment.
All of attendee ran through the all topics.

Great work, everyone!!



今回も本郷のオープンスペースにてROSワークショップ初級編を開催しました.
皆さん,ご自身のPCにROSをインストールしてのご参加でした.
ご自分のPCでUubuntu環境が準備できなくても,LiveUSB等でワークショップを体験できます.

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp

IMG_20160902_175735 IMG_20160902_175741

著者:Isaac Saito

NEXTAGE Open in Singapore revisited: both hands assembly using camera imageNEXTAGE Open in シンガポールその2:画像処理と両手を使った物品組み立て


ROS が普及したことで,ロボット開発者の間である種の共通言語となりつつあると言っても過言ではありません.既に多くのロボットの可動実績があり,ユーザ数は10万人を超えるとも言われ (2015年 ROSCon より),ロボットのシステム構築において着実に情報が蓄積されており,それを元に更に益々ユーザ層が厚くなるといった良い循環ができています.

とはいえロボット毎のハードウェアの違いを基にした差異は避けられないもの.同じロボットを扱う開発者間の情報は貴重でしょう.
弊社がソフトウェアのメンテナンスを中心となって行わせて頂いている NEXTAGE Open (カワダロボティクス社) も世界中にユーザがおり,私達も情報共有に微力ながら貢献しています.NEXTAGE Open の ROS 版ソフトウェアの利用に際して,議論はメーリングリストへ,御質問は github へどうぞ.

[github-issues username=”tork-a” repository=”rtmros_nextage” limit=”10″]
表.github 上で議論中のチケット一覧

nxo_ntu_bothhands_pickplace
今日は,先日もお伝えしたシンガポールの Nanyang Technological University (NTU) の研究者が公開している,NEXTAGE Open の動画を紹介します.今回はカメラからの入力を元に幾つかの Pick&Place を行っているようです.今のところこれら動画中のアプリケーションソフトウェアは公開されていないようですが,御興味があれば動画サイトのコメント機能でコメントで開発者に連絡してみると良いでしょう.


One of its many achievements as ROS being used for more and more robots is that it’s becoming a common language for the robot developers. One estimate (which is actually made by the CEO at OSRF, the maintenance organization of ROS) indicates that the userbase has now well reached 100,000 at the time of 2015 ROSCon. With vast amount of userbase with accumulated information for robot system development, we’re seeing a very successful lifecycle of ROS collectively expanding more info and users.

Still, flesh side of robots – hardware – inevitably differentiates the application level of development per robot, and therefore the conversation among the users of the same robots is valuable. For NEXTAGE Open (Kawada Robotics Inc.), the one that we TORK has been actively maintaining, there are a couple of active forums: discussion can be started at mailing-list and questions at its github.

[github-issues username=”tork-a” repository=”rtmros_nextage” limit=”10″]
Table. Current issues of NEXTAGE Open ROS software on github

Today we have a few videos from researchers from NTU (Nanyang Technological University) (there was one blog post before already) in Singapore that utilize vision input for pick & place application. Code for these app are likely not yet publicized but you can contact the researchers’ group by commenting on each video on the video sharing website.



著者:Isaac Saito

3周年とサポート・コンサルティングサービスの実績経過TORK’s 3rd year mark and our support/consulting progress


2016年8月8日,おかげさまで TORK は設立3年を迎えました.

ロボティクス技術を使った製品開発に対する世間の関心の高まりに呼応してか,弊社としてもロボットへのオープンソースソフトウェア適用について企業様の関心の高まりを感じる一年でした.2014年度から行ってきた ROS ワークショップ (初級編中級編等) は引き続き好評を頂き毎月開催しています.

また,創業以来続けさせて頂いているカワダロボティクス様の双腕ロボット NEXTAGE Open 用オープンソースソフトウェアのサポートサービスも順調にご利用頂いています.それに加えこの一年で,新たにロボットの種類を限定せずにお問合せに応えるチケット制コンサルティングサービスを開始し,企業様の多種多様なリクエストにより柔軟にお応えできるよう努めてまいりました.

これらのサポート・コンサルティングサービスはこの1年間で合計72回のお問合せを頂き,94%にあたる68件が解決・終了したか,或いは解法案をご提示済です.分野別では NEXTAGE Open で41件,それ以外の分野でのコンサルティングで31件頂戴しました.1年毎のお問合せ件数ですと,2015年8月時点では46.7件のペースでしたので (参考:昨年同時期の記事によると2014年1月から2015年8月までで74件の問合せ),1.5倍超のペースでお問合せ頂いていることとなります.

コンサルティングサービスの内容は,既存のオープンソースロボットに関するもの (BaxterTurtlebotFetch 等),ROS のモジュールの使い方やカスタマイズ方法,自社開発への ROS 適用上のお悩み等を頂いています.カスタマイズのお問合せが転じてカスタム開発の依頼を頂くケースも出てきました.

これからも,お客様のご要望に応え,産業・学術界でのオープンソースロボティクスの進展に寄与できるよう,より一層努力して参ります.


TORK has just passed 3rd annual mark on August 8th, 2016.

Along with the global trend of robotics business and research boost, we’ve been happilly receiving interests and requests for opensource robotics technology development that we’ve contributed to and have been supporting for since our day 1 in 2013. Our ROS workshop series (beginnersintermediate etc.) are successfully running multiple times every month.

Our ticket-based support service for the dual-arm industrial robot NEXTAGE Open (Kawada Robotics) is growing its user base as well. This year round, in addition, we started opensource robotics consulting service. This new service is not restricted to a certain robot nor technology, but only limitation is “opensource robotics”, so that we can work with corporate engineers and managers for their problems regarding their robotics projects.

During the last 1 year period, we’ve received 72 tickets for total, 41 for NEXTAGE Open and the rest of 31 for other subjects. 68 tickets (94% of overall tickets) are solved/closed or possible solution is proposed to the customers. Compared to the previous year, we’re getting 1.5 times more requests (46.7 tickets/year at Aug 2015 according to the last year’s post).

Thank you all for your business with us, and understanding toward the opensource robotics.

TORK Montage 2015-2016

著者:Yumiko Suzuki

ROS Workshop for Beginners on 3rd August ROSワークショップ初級編を開催しました

We had ROS Workshop at Hongo, Tokyo.
We used custom ROS-preinstalled LiveUSB, so people had ROS experience without change your PC environment.
All of attendee ran through the all topics.

Great work, everyone!!



今回も本郷のオープンスペースにてROSワークショップ初級編を開催しました.
ご自分のPCでUubuntu環境が準備できなくても,LiveUSB等でワークショップを体験できます.
一つ一つのタスクに対して積極的な質問をいただきながら最後まで完遂しました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.

7-9月のワークショップ開催日程も公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp


IMG_20160727_162345

著者:Isaac Saito

How to create a page of your robot on ROS wikiROS wiki に自社/自分のロボットを掲載する方法


ROS で動くロボット,ROS が使われているロボットは一体幾つあるのですか?というのはとてもよく耳にする質問です.全貌の把握を試みるのは別な方に譲るとして,ROS の情報が一元的にまとまっている ROS wiki 上には,ROS 対応ロボット一覧ページがあります.たった今ざっと数えたところ,100種類は確実に超えていることを確認したところで,思考が停止しました.このページは手動で管理されているものなので,勿論これで全部ではないと思うと,多いですね.

このロボット一覧ページは前述の,ROS 対応しているロボットを知りたい,といったニーズに応える現状の最適な場所だと思われます.アクセス数も ROS wiki 全ページ群の中で9番目に多い (2015年7月の調査) とのことで,自社のロボットをここに掲載することはそれだけでロボット業界への効果的な告知になり得る,と考えられるのではないかと重います (ただしあくまで中立のコミュニティですから,やり過ぎな商業的告知には指摘が入る可能性もあります).

さて,ではどうやってこのページヘの自身のロボットを掲載するか.この方法が分からないという声も最近頻繁に耳にするようになりましたので,ROS wiki 上にその方法をまとめました.このページをご覧ください.

#私も自己流で編集して叱られたりコンテンツ削除されたり,時には褒められたりしながら学びました*

本件でご不明点があれば,ROS に関する質問はいつも通りの answers.ros.org か,日本語 ML でお問合せされるのが良いと思います.あと,弊社も有償でコンサルティングサービスを行っています 🙂


One of the common questions surrounding ROS is that how many robots are “ROS-compatible”? While we wait for someone else for figuring out the exact number, on ROS wiki, central source of information regarding ROS, there’s a manually-maintained list of robots that work with/on ROS. Skimming through it yields easily over 100 robots.

This listing page apprently functions as the best monolithic source of all ROSified robots as far as we are aware of, and it’s proven to work for the purpose; access rate of the page is 9th highest among all pages on ROS wiki (according to metrics in July 2015). So it makes a total sense to list your own robot on that page to get a good, effective exposure to the global robotics community (you just have to respect that the entire ROS wiki is commercial-free zone; No aggressive advertisement should take place).

Then, to answer the next common questions we’ve recently heard of, which is how we can add a list on the wiki page, we just added an instruction. Please go to this page on ROS wiki for that.

Questions regarding the instructions should go to answers.ros.org as always.

roswiki_robotspage_denso
Image: Part of the robot list. Robots we (TORK) maintain the ROS packages (NEXTAGE Open, Denso etc.) are there too.

著者:Yumiko Suzuki

Thank you for the wonderful souvenirs ! お土産ありがとうございます!


We had a meeting with a customer at Hongo, Tokyo.
We received Ebi-sembeis as souvenirs today.
This Ebi-sembeis (shrimp cracker) is a very famous gift in Japan.
Thank you for the wonderful souvenirs !!!

ROS Seminar courses will be held in summer 2016 by TORK in Tokyo, Japan. Any inquiry can be posted at info[a-t]opensource-robotics.tokyo.jp


打ち合わせでお客様からお土産を頂きました.お気遣い頂き恐縮です.
坂角総本舗の海老煎餅です!最高です!!ありがとうございます!!!
いつも以上に仕事を頑張っております!

ROSやオープンソースに関わるコンサルティング,出張ワークショップ,カスタマイズワークショップも承っております.
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp

7-9月のワークショップ開催日程も公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

その他,こういった企画を実施して欲しい等,TORKにやってもらいたいことのご意見ご要望もお待ちしております!
メール以外にもfacebooktwitterアカウントもございますのでそちらにメッセージ,リプライにてご意見いただくことも可能です.
お気軽にお問い合わせください.

IMG_20160727_154445 IMG_20160727_154619

著者:Yumiko Suzuki

ROS Workshop for Beginners on 13th JulyROSワークショップ初級編を開催しました

We had ROS Workshop at Hongo, Tokyo.
We used custom ROS-preinstalled LiveUSB, so people had ROS experience without change your PC environment.
All of attendee ran through the all topics.

Great work, everyone!!



今回も本郷のオープンスペースにてROSワークショップ初級編を開催しました.
ご自分のPCでUubuntu環境が準備できなくても,LiveUSB等でワークショップを体験できます.
本日も全員が最後まで完遂しました.お疲れ様でした!

初級編ではROSの環境の構築からセンシングデバイス,サーボの実機を動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.

7-9月のワークショップ開催日程も公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

IMG_20160713_153735

著者:Yumiko Suzuki

ROS Workshop Schedule, from July to September 20162016年7月-9月のROSワークショップ日程


Here are the schedule of our ROS workshop series during the third three months of 2016!

Jul. 07 Thu 13:30- Introductory
Jul. 13 Wed 13:30- Introductory
Jul. 15 Fri 13:30- Introductory
Jul. 22 Fri 10:30- Intermediate
Aug. 03 Wed 13:30- Introductory
Aug. 10 Wed 13:30- Introductory
Aug. 16 Tue 13:30- Introductory
Aug. 19 Fri 10:30- Intermediate
Sept. 01 Thu 13:30- Introductory
Sept. 07 Wed 13:30- Introductory
Sept. 13 Tue 13:30- Introductory
Sept. 16 Fri 10:30- Intermediate
Sept. 27 Tue 13:30- Introductory
Sept. 29 Thu 10:30- Intermediate

Venue: Hongo, Tokyo

Inquiries: info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120



以下日程でROSワークショップを行います.

7月07日(木)13:30~ ROSワークショップ初級編
7月13日(水)13:30~ ROSワークショップ初級編
7月15日(金)13:30~ ROSワークショップ初級編
7月22日(金)10:30~ ROSワークショップ中級・マニピュレーション編
8月03日(水)13:30~ ROSワークショップ初級編
8月10日(水)13:30~ ROSワークショップ初級編
8月16日(火)13:30~ ROSワークショップ初級編
8月19日(金)10:30~ ROSワークショップ中級・マニピュレーション編
9月01日(木)13:30~ ROSワークショップ初級編
9月07日(水)13:30~ ROSワークショップ初級編
9月13日(火)13:30~ ROSワークショップ初級編
9月16日(金)10:30~ ROSワークショップ中級・マニピュレーション編
9月27日(火)13:30~ ROSワークショップ初級編
9月29日(木)10:30~ ROSワークショップ中級・マニピュレーション編

場所については都内・本郷のミーティングスペースでの実施を予定しています.

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編
ROSワークショップ中級・マニピュレーション編

日程の調整,その他ご相談,企業内ワークショップ,カスタマイズワークショップも承っております.お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Isaac Saito

Easy Teaching Operation for NEXTAGE Open by MoveIt! JoystickMoveIt! のジョイスティック機能で NEXTAGE Open を楽々ティーチング


ROS の動作計画アプリ MoveIt! を使った開発を行っている方々の中には,MoveIt! のバイナリ提供は更新が滞ってるから仕方なくソースコードをコンパイル (そしてコンパイルエラーと格闘) して時間を費やしてしまっている方もいるのではないでしょうか.ご安心下さい.最近メンテナンスチームが刷新されソフトウェアの更新が再び活発になってきており,今年に入って既にバイナリは3回更新されました.TORK もメンテナンスに積極的に貢献しています.

当協会のブログでも最近何度か MoveIt! の利用法についてご紹介してきました ([1][2]).今回も新機能のご紹介です.今日紹介するのはジョイスティックから MoveIt! を制御する方法です.ロボットの動作生成・実行が,今までのように Rviz 上でマウスを使うことなく,ジョイスティックで可能になりました.

joystick_moveit-0_7_1_nxo

使い方は簡単.ジョイスティックが刺さったマシン上で,図のように Planning タブの AllowExternalExecution にチェックをして下さい.
あとは,以下の launch ファイルを立ちあげればジョイスティックでロボットを動かすことができます.ジョイスティックのコマンド等詳細な利用方法はこちらの WEB ページをご覧ください.

<!-- https://github.com/ros-planning/moveit_setup_assistant/pull/90 -->
<launch>
  <arg name="dev" default="/dev/input/js0" />

  <!-- Launch joy node -->
  <node pkg="joy" type="joy_node" name="joy">
    <param name="dev" value="$(arg dev)" /> <!-- Customize this to match the location your joystick is plugged in on-->
    <param name="deadzone" value="0.2" />
    <param name="autorepeat_rate" value="40" />
    <param name="coalesce_interval" value="0.025" />
  </node>

  <!-- Launch python interface -->
  <node pkg="moveit_ros_visualization" type="moveit_joy.py" output="screen" name="moveit_joy"/>
</launch>

また,NEXTAGE Open であれば,MoveIt! が起動している状態で次のコマンドひとつ起動すればジョイスティックが有効になります (jsX の値は変えて下さい).NEXTAGE Open 用の利用法をこちらにも記載しています.


One of good news about ROS community is that the maintenance of MoveIt! got revitalized where TORK is contributing to as well. In 2016 there has already been three binary update releases so far. No more building from source if you were forced to!

We’ve mentioned about MoveIt! a few times recently ([1][2]), so do we today again. With the version 0.7.2 (on ROS Indigo), you can operate robot arms by joystick via MoveIt!

joystick_moveit-0_7_1_nxo

Running the feature is as simple as joystick. On RViz on the host where the joystick is plugged, check “Planning” tab –> “AllowExternalExecution” (see the image below).
Then run a launch file, either the one in your XXXX_moveit_config package if there’s already the aforementioned launch file, or simply make a launch file with the following:

<!-- https://github.com/ros-planning/moveit_setup_assistant/pull/90 -->
<launch>
  <arg name="dev" default="/dev/input/js0" />

  <!-- Launch joy node -->
  <node pkg="joy" type="joy_node" name="joy">
    <param name="dev" value="$(arg dev)" /> <!-- Customize this to match the location your joystick is plugged in on-->
    <param name="deadzone" value="0.2" />
    <param name="autorepeat_rate" value="40" />
    <param name="coalesce_interval" value="0.025" />
  </node>

  <!-- Launch python interface -->
  <node pkg="moveit_ros_visualization" type="moveit_joy.py" output="screen" name="moveit_joy"/>
</launch>

For the detail follow the usage page.

To run on NEXTAGE Open, make sure MoveIt! is running then run a single command below (modify jsX). You can also refer to wiki for joystick usage for NEXTAGE Open.

roslaunch nextage_moveit_config joystick_control.launch dev:=/dev/input/js1


(At the top window, the human operator plans the movement on RViz visualizer. Once the plan looks good then operator executes the plan so that the simulated robot in the bottom window conducts the movement. This is a screen capture so joystick isn’t invisible, but yes, all the robot’s movement is commanded from a Sony PS3 joystick.)

 

著者:Isaac Saito

Investigating unexplored region while making a map ROS で地図作成中に未開拓領域を探す

ROS でロボットが地図を作成する際に,大抵の場合はジョイスティックやキーボード等を使い,テレオペレーションでロボットに指示を即時で与えながらロボットを移動させているかと思います.中には,地図を作るためにロボットが”探索”する領域を事前に計画したい方もいるのではないでしょうか.

frontier_exploration というパッケージはそのための ROS インタフェイスを提供しています.今回 Turtlebot に frontier_exploration を組込んでみました.下の動画 (長いです…) では Gazebo シミュレータ上でサンプルの地図上に Turtlebot を出現させ,地図が無い領域/地点にロボットを向かわせています.画面下半分がシミュレータの,上半分が操作用の RViz のウィンドウです.

始めに探索したい領域をポリゴンで指定し,その中の一点を最後にクリックすることで,ロボットがその領域の探索に向かいます.ロボットが移動し始めてからはロボットは自律で移動し,ユーザは一切指示を与えていません.

手早く挙動を確認したい方はこちらの動画を (Turtlebot ではありませんが).

ここでは,探索計画は RViz 上で手動で行っていますが,向かわせたい地点を actionlib で送信しているため,API に従って計画をプログラムすることも可能です.

gmapping で地図作成を行い,move_base で移動を行うロボットであれば適用が可能です (他のパッケージを使う移動ロボットは試していませんが,難しくないはず?).


When making a map using ROS, you’re likely tele-operating your robot for every single move via keyboard or joystick at best. But I know a demand exists for “planning” in advance a region that robot explores to make a map.

That’s where a package called frontier_exploration gets useful; it provides ROS actionlib interface, through which users can send the location to explore. We just made a sample using Turtlebot to show how to integrate frontier_exploration package into your own robot. Resulted package can be seen at turtlebot_samples. As the following movie (It’s long! You’re warned…) shows, you can run by a single command Gazebo simulator, spawn Turtlebot on a sample map and send a command for the exploration.

You set the region to be visited by drawing a polygon on RViz, then after clicking a point within the polygon robot will move. Once it starts moving user isn’t sending anything (robot moves autonomously to the given goal along the computed path).

Shorter video is also available (it’s not Turtlebot. Video was taken by the original developer of the frontier_exploration package)

In these videos the robot is commanded manually on RViz window. You can also send commands programmatically using its API.

So far we confirmed that frontier_exploration can be applied to the robots with gmapping and move_base (incorporating with other navigation packages may be as simple?).

著者:Yumiko Suzuki

ROS Workshop for Intermediate Manipulation on 22th June ROSワークショップ中級・マニピュレーション編を開催しました


We had ROS Workshop for Intermediate Manipulation at Hongo, Tokyo.

The participant also joined our Beginners Workshop a few weeks ago, then re-setup her own PC, purchased robot parts and review all contents. Her fast learning and active question make a lecture really enjoied the event.

Thanks you for joining us!!


今回は本郷のオープンスペースにて,ROSワークショップ中級・マニピュレーション編を開催しました.
本郷のオープンスペースはコーヒーが一日中無料です!

本日の参加者の方は初級編の機材一式を購入し完璧に復習してから中級・マニピュレーション編にご参加いただきました.
「いつも新しい知識を得られるので中級編も参加できてよかったです」とのコメントをいただきました.
長時間の講習お疲れ様でした.ありがとうございました.

7-9月のワークショップ開催日程も公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp


IMG_20160622_160213 (1)

著者:Yumiko Suzuki

ROS Private Workshop on 8th June プライベートROSワークショップを開催しました


We also had a private ROS Workshop at the seminar room in the company.

The participants prepared own Ubuntu PC and installed indigo. Their active questions make a lecture really enjoied the event.

Thanks you for joining us!!


本日は某企業様の会議室をお借りして,企業内でのプライベートROSワークショップを開催いたしました.
実践的な質問をいただきながらの活発なワークショップとなりました.
長時間のワークショップ,皆様お疲れ様でした.

出張ワークショップ,カスタマイズワークショップも承っております.
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp

7-9月のワークショップ開催日程も公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

お申込みお問い合わせお待ちしております!

IMG_20160608_170919 IMG_20160608_170900

著者:Isaac Saito

Thanks to opensource community, issue with NEXTAGE Open software (3D model geometry, tf) got resolved promptlyNEXTAGE Open ソフトウエアに不具合,オープンソースコミュニティにより迅速に修正完了 (3D モデル,tf の問題)

ユーザからの報告により NEXTAGE Open の tf の挙動に問題点がみつかりました.既に修正版をバイナリ (Ubuntu の apt-get でインストールする版のことです) で提供しています.修正版の適用方法等,詳しくは告知をご覧下さい.

製品のソフトウェアをオープンソースにするメリットの一つは,テストし報告してくれる人を多く集められることにあると,TORK は考えています.今回はまさにソフトウェアをオープンソースにしていたから起こり得た問題解決でした.解決までの流れはまさにオープンソースコミュニティのそれで,異なる組織から意見が共有された結果として,迅速に解決することができました;本問題現象を議論する github 上のチケットを時系列で追っていくと:

  • ユーザが問題点を指摘
  • –> メーカ開発者からコメント
  • –> 別の組織のユーザからもコメント
  • –> メンテナンス元 (我々です) が修正候補を作成
  • –> ユーザが修正候補をテストし問題が修復されることを確認
  • –> メンテナンス元修正候補が採用

4つの組織から一週間程度の間に意見が出され,解決にたどり着いているのがわかります.そしてこの特定の問題に義務がある人は (我々以外は) 居ないのです.これだけクイックに組織の壁を超えた問題解決が行えるのはコミュニティがオープンになっているからこそではないでしょうか.

更にその後のバイナリ作成と公開は,(これまで通り) ROS 管理チーム (OSRF) が運営するネット上の仕組みを利用させてもらっています.そこに至る手順は至ってシンプル (*1):

TORK は,ソフトウェアを公開することで,企業様が開発を加速し品質を高めていくことができると信じて,日々オープンソースに貢献しています.

*1 初回公開時にはやや長いプロセスを経る必要があります.しかしひとたび公開作業が終了すれば,その後の更新版の公開は上に書いたようにいたって簡単です.


A user reported an issue in tf with NEXTAGE Open software that got resolved in a quick fashion thanks to opensource collaboration across organizations/userbases. Binaries (the ones installable by apt-get) including the fix is already available online. Please see more detail of the issue and how to apply the fix this ticket on github.

We, TORK, thinks without any doubts that the big advantage of making software public is that you get testers from across the globe. The fix this time is a true realization of this opensource dogma; if I review the ticketed report for this issue on github now, you’ll see the flow:

  • A user reported the issue.
  • –> Someone from robot’s manufacturor gave a comment.
  • –> Another heavy user commented.
  • –> Maintainer (us) created a fix candidate.
  • –> Reporter user tested fix candidate and confirmed that it fixes.
  • –> Maintainer pulled in the fix.

At least four persons from different organizations contributed so far up to this point, within only a week timeframe. And everybody is not obligated to this ticket (but us).

Going further, once the fix is pulled then it’s also important to make the fix easily accessible by the users. Having them as binary form is the way to go. We do that by relying on the platform the ROS maintenance team (OSRF) runs, as have we already done so. Steps for that is really simple (*1):

TORK believes that opensource software development contributes to improving quality and fastening the engineering cycle for the corporations. That’s why we have and will continue contribution to the opensource community.

*1 Initial release takes a bit more steps. But once done so it’s really easy!

著者:Isaac Saito

MoveIt! motion planner 0.7.1 may be a fix to long, unorganizaed planning timeROS, MoveIt! バージョン0.7.1 で経路計算のより安定化が可能に


We talked about the latest MoveIt! update to 0.7.1. That change introduced several important/convenient new features, one of which is that you can now set the default planning algorithm (relevant ticket on github).

Before this change, LBKPIECE was set as a default planner and it wasn’t clear for the users how to make a change for it. The algorithm has reportedly not been finding solutions when working with MoveIt!, e.g. in our ROS introductory workshop we have to ask participants to go through counter-intuitive steps to change the algorithms for DENSO robot.

The new feature allows you to choose algorithm of your choice, e.g. RRTConnect.
If your robot already comes with moveit_config package but has not utilized this feature, you might as well do so.

In NEXTAGE Open's software, you can set the default planner like this in config/ompl_planning.yaml file in your moveit_config package.

In NEXTAGE Open’s software, you can set the default planner like this in config/ompl_planning.yaml file in your moveit_config package (see this pull request for the full change).




前回紹介した MoveIt! バージョン更新により,0.7.1に上がり幾つか新機能が利用可能となりました.
その内の一つがデフォルトの経路探索アルゴリズム指定機能です (github 上の関連チケット)
いままでは起動時の経路探索アルゴリズムは LBKPIECE で,MoveIt! 上で動作させると解を見つけないことも多く,たとえば弊社のワークショップでは DENSO ロボットの MoveIt! 応用をご紹介しますが,その際にややこしい手順を経て経路探索アルゴリズムの変更する手順としていました.
本機能により,RRTConnect 等の解が出やすいアルゴリズムを MoveIt! 起動の際に 選択できるようになりました.もし,ご自分のロボットでデフォルトのアルゴリズムをカスタマイズしていない方がいらっしゃいましたら是非ご参考ください.

In NEXTAGE Open's software, you can set the default planner like this in config/ompl_planning.yaml file in your moveit_config package.

デフォルトプランナの設定は,NEXTAGE Open のソフトウエアの場合,お使いのロボットの moveit_config パッケージの config/ompl_planning.yaml に図のように変更することで行うことができます (参考 pull request).


著者:Isaac Saito

Real-time Impedance Control on NEXTAGE Open Dual-arm Robot Using Dynpick F/T Sensor双腕ロボット NEXTAGE Open での実時間 impedance 制御が Dynpick F/T センサにも対応


カワダロボティクス社製の双腕ロボット NEXTAGE Open (/ Hironx) の力センサを用いた実時間制御は以前のブログ記事でお伝えしました.当時の例で用いていた JR3 力センサは日本国内では販売が終了 (*1) していますが,今回日本国産,ワコーテック社の Dynpick センサに対応しました.



Dynpick 小型静電容量型6軸力覚センサ (画像元)
動画がまだありません,すみません!挙動自体は JR3 のものと同様なので,上記記事中のものと同じ動画でイメージを掴んでいただけるとこれ幸いです.


https://www.youtube.com/watch?v=USp4H2MVRQs&feature=youtu.be
例によって,必要なソースコードはすべて公開しております ([1], [2]).

実装上の留意点が幾つかあります:

  • 現状では wdf-6m200-3 (廃番,USB-Serial 接続) にのみ対応しています.同社の新型製品 (USB-Serial ではない) ではドライバの都合でそのままでは本機能はおそらくつかえません.
  • 本機能の適用には QNX ライセンスに基づいたコントローラボックス上のソフトウェアの改変が必要なのと,ノウハウが必要なのとで,適用方法は公開しておりません.

FAQs:

  • Q: F/T センサを追加で装着しても,装着前に使っていたグリッパは使えますか? A: はい,問題ありません.気をつけるべきは,キネマティクスが変わるのでロボットの3次元モデルをセンサを含めるよう更新が必要となります.また,センサ装着,グリッパの再装着等の据付作業はお客様御自身で行って頂くこととなります.
  • Q: 配線変更やケーブル追加,その他電子機器の追加設置は必要になりますか? A: はい,F/T センサとその出力をを処理するコンピュータとの通信のために必要です. なお本ページ中で取り上げている JR3・Dynpick は USB/RS232C を使います.
  • Q: F/T センサを Ubuntu に接続してインピーダンス制御機能を利用できますか? A: Dynpick の場合,はい,ただし得られる結果は要件により異なります.Dynpick には ROS で使える Ubuntu 用デバイスドライバパッケージが無償入手でき,デバイスを繋げばすぐ使いはじめることが出来るのですが,Ubuntu は基本的にはリアルタイム性を担保しないため,やや限定的となります.本ページでご紹介しているのは F/T センサを QNX に接続し,そのリアルタイム機能を活かす方法です.インストール方法が複雑となります.
  • Q: インピーダンス制御機能の導入費用は? A: TORK サポート窓口までお問合せ下さい.

なお本件に関わるソースコードの公開は,株式会社豊田中央研究所様の御厚意により実現しています.

*1 米国メーカ JR3 Inc. は今日現在存続しています.連絡したら返信も返ってきました.


Earlier this year we mentioned that for Kawada’s industrial dual-arm robot NEXTAGE Open (/ Hironx), a force-torque sensor “JR3” can be integrated into its real-time control loop. Now that then-sales agency discontinued import so that JR3 becomes not easily available for Japanese users, another sensor support has been desired. Recently we’ve added Wacohtech’s Dynpick to the lineup.



“Dynpick” Miniature capacitive 6-axis force sensor (image source)
Fresh out of the lab, we haven’t shot any video of the robot with this! For now you can get an idea from the same video that uses JR3.


https://www.youtube.com/watch?v=USp4H2MVRQs&feature=youtu.be
We believe the best practical approach to sustainably develop software is to make it opensouce. So did we put them online as usual ([1], [2]).

To implement the necessary changes, a few thiings to be noted:

  • Currently only the product wdf-6m200-3 is tested (discontinued,USB-Serial), and other newer type of Dynpick products shouldn’t work as it is, since some tweaks are most likely needed for them to work on QNX.
  • Because the work requires modification on the software on ControllerBox (QNX), we have no plan so far to write publicly about how to apply the change.

FAQs:

  • Q: Can the same gripper be used after F/T sensor attached? A: Yes, no problem. Robot’s kinematics changes, however, so updating robot’s 3D model will be necessary. Attaching the F/T sensor and re-attach the gripper is your responsibility.
  • Q: Is adding/changing cabling or electronics to provide communication between sensor and the robot necessary? A: Yes, for the communication between the F/T sensors and the computer. JR3 and Dynpick are USB/RS232C.
  • Q: Can the F/T sensor be connected to Ubuntu for impedance controller feature? A: Depending on the requirement of your application. Dynpick has a device driver package for ROS that works on Ubuntu This works out-of-the-box, but Ubuntu is not a real-time OS perse by default. The solution explained on this page is to connect the sensor to QNX to take advantage of its real-time capability. Installation isn’t easy as mentioned earlier.
  • Q: How much is the cost to activate the impedance control? A: Please contact us.

The opensource contribution of this project was realized thanks to Toyota Central R&D Labs., Inc..

著者:Yumiko Suzuki

ROS Workshop for Beginners on 25th MayROSワークショップ初級編を開催しました


We had ROS Workshop for Beginners at Hongo, Tokyo.
You can experience ROS workshop by the LiveUSB without installation of Ubuntu on your machine.

Thanks you for joining us!!


今回も本郷のオープンスペースにて,ROSワークショップ初級編を開催しました.
本郷のオープンスペースはコーヒー・アイスコーヒーが一日中無料です!

ROSワークショップ初級編はLinuxが初めての人でも参加可能です.
UbuntuPCを準備出来なくても弊社のLiveUSBを使ってワークショップを実施可能です.
時間中時間後にROSを社内に導入する際のお困りごとにもお答えしています.

7-9月のワークショップ開催日程も公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,出張ワークショップ,カスタマイズワークショップも承っております.
詳細はWebページをご覧いただくか,メールにてお気軽にお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp


IMG_20160727_162345

著者:Isaac Saito

Update; Programming for NEXTAGE Open via MoveIt! motion plannerアップデート) ROS の経路計画用ライブラリ MoveIt! 経由での NEXTAGE Open のプログラミング


ロボットを扱う上で必要な機能がたくさん収められている ROS の中でも,経路計画用ライブラリ MoveIt! は代表的なツールの1つです.

腕をはじめとして,ロボットの体の部位は我々人間のそれと同じように,複数の関節からなりますが,それらを直感的に操作できるようにするためのプログラミング・インタフェイスを備えています.

その機能は当社がソフトウェアのサポートを行っているカワダロボティクス社製双腕ロボット NEXTAGE Open でもフルに活用可能です (既に MoveIt! を用いて NEXTAGE Open を動作させているユーザ様事例がこのページに掲載しております).

MoveIt! を利用してプログラミングを行う際のサンプルの拡充も続けてまいります.既存のユーザ様からよくいただく質問として,”hrpsys ( / OpenRTM) 経由でのプログラミング方法はわかったが,ROS でプログラムを書く方法がわからない” というものがあります.これに応えるために ROS_Client と呼ばれる NEXTAGE Open 専用の ROS クライアントクラスを用意しました.使い方はこちらの wiki をご覧ください.ご不明点などは github 上で聞いていただくと,当社かユーザグループのどなたか 😉 から返信が入ると思います.

また,MoveIt! 自体のメンテナンスにも TORK は積極的に参加しており,最新の機能やバグフィックスの利用を開発者ができるだけ手軽に利用することができるよう貢献しています.

caption_is_here

(MoveIt! が NEXTAGE Open の左腕の関節グループを認識するように設定を行っている所.難しい設定も GUI 上で行うことができます.)



MoveIt! not just comes with state-of-art algorithms but also a programming interface that you can program complicated manipulation tasks in an intuitive fashion.
It’s not an exception with Kawada Robotics’ dual-arm NEXTAGE Open robot, which we provide professional, full-fledged software support for. We’ve been maintaining so-called ROS_Client, a designated ROS programming interface for NEXTAGE Open in Python, to utilize MoveIt!’s simple interface while trying to minimize users’ effort to learn new stuff like MoveIt! as much as possible. If you’re a programmer for NEXTAGE Open and like to write your code in Python and ROS, please have a look at this wiki page. You’re always welcomed for questions and discussions at its github issue page where some of us or developers on the internet land 😉 will respond fairly quickly.

TORK also contributes to maintaining MoveIt! itself, to make the new feature and bugfixes available in the easiest way for all the users in the world.

caption_is_here

(MoveIt! configuration going on for the NEXTAGE Open; grouping joints as “left-arm”. Complicated tasks regarding manipulation becomes handy too with GUI tools on MoveIt!.


著者:Yumiko Suzuki

ROS Workshop for Intermediate Manipulation on 19th May ROSワークショップ中級・マニピュレーション編を開催しました


We also had ROS Workshop for Intermediate Manipulation at Hongo, Tokyo.

They took part a workshop using our LiveUSB. You can experience ROS workshop by the LiveUSB without installation of Ubuntu on your machine.

Thanks you for joining us!!


今回も本郷のオープンスペースにて,ROSワークショップ中級・マニピュレーション編を開催しました.
本郷のオープンスペースはコーヒー・アイスコーヒーが一日中無料です!

UbuntuPCを準備出来なくても弊社のLiveUSBを使ってワークショップを実施可能です.

ROSを使うために新しくマシンを購入されるという方でどんなマシンを購入したらよいかというご質問を受けることがあります.
そんな方は「ゲーミングPC」とカテゴライズされている商品から選ぶと良いかもしれません.
可能であればNvidia搭載のものをおすすめします.

7-9月のワークショップ開催日程も公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,出張ワークショップ,カスタマイズワークショップも承っております.
詳細はWebページをご覧いただくか,メールにてお気軽にお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp


IMG_20160519_180008

著者:Yumiko Suzuki

ROS Workshop for Beginners on 11th MayROSワークショップ初級編を開催しました

We had ROS Workshop at Hongo, Tokyo.
We used custom ROS-preinstalled LiveUSB, so people had ROS experience without change your PC environment.
All of attendee ran through the all topics.

Great work, everyone!!



今回も本郷のオープンスペースにてROSワークショップ初級編を開催しました.
ご自分のPCでUubuntu環境が準備できなくても,LiveUSB等でワークショップを体験できます.
本日も全員が最後まで完遂しました.お疲れ様でした!

ROSのワークスペースは複数作ることができます.
まず最初に”catkin_ws”と言う名前でワークスペースを作るお手本が多いですが,
catkin_wsという名前である必要はありません.自分の好きな名前でワークスペースを作ることができます.
バリバリROSで開発されている方にとっては当たり前のことでも,ROSを初めたばかりの人にとっては気付けないことが案外あったりするものです.

ROSワークショップに参加すると実際にROSで開発する際のちょっとしたコツが習得できますよ!
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

6月のワークショップ開催日程も公開中です!

IMG_20160511_183858

著者:Isaac Saito

Happy Mother’s Day 2016 for the robotics2016 母の日に贈る! ロボティクス便利ツール


Happy Mother’s Day (一日遅れ)!

さて,お母さんに限らずロボティクスの作業において,本質的でない作業はできるだけ減らしたいもの.新しいコンピュータを扱う際に必ず発生するインストール作業はそのうちの最たるものの一つではないかと思います.
ROS の Linux コンピュータへのインストールは,チュートリアルに従いコマンドをたった数回実行すれば終了するので,これがあまり面倒だという意識はないかも知れません.それにしても,その数回のコマンドの実行すら望ましくないケースがあります.コマンドの打ち間違いや,元来面倒くさがりとされるエンジニアのエゴだとか.

コマンド1行でインストール完了するスクリプトファイルを用意しました.
元々は,韓国の ROS ユーザグループ OROCA がコマンド2行でインストールできるように作成したものを,TORK が改良に貢献したものです.

例えば次のコマンドによってお手元の Ubuntu Linux コンピュータ上で1行インストーラを実行すると,ROS Indigo の desktop-full (基本パッケージ全部入りの贅沢版とでも言えば良いでしょうか) のバイナリがインストールされ,かつご自身で ROS の作業する場合に必要なフォルダ “Catkin Workspace” まで生成され,すぐにご自身の開発作業に入ることができます.

wget https://raw.githubusercontent.com/oroca/oroca-ros-pkg/master/ros_install.sh && chmod 755 ./ros_install.sh && ./ros_install.sh catkin_ws_tork indigo

この1行インストーラは現状では ROS Indigo の他,Jade,2016年版の Kinetic Kame にも対応しています.
問題報告等は OROCA プロジェクトの github ページに是非御連絡下さい.


Happy Mother’s Day!

To help busy mothers in robotics, TORK made a script to install ROS with just a single line of command (well, this helps not just moms).
Installing ROS on Linux computers is already made simple as only a few lines of commands. However, our experience tells that it’s sometimes not ideal, e.g. when a command skipped by mistake, typos happen. Besides those, engineers are inherently lazy.

Here’s a ROS single-line installer script. It is originally made by a ROS user group in Korea “OROCA” and TORK contributed to adding features.

For example, by running the following single command on your Ubuntu Linux machine, ROS Indigo desktop-full will be installed, along with your source workspace called “Catkin Workspace” and you can start your own work from the next command.

wget https://raw.githubusercontent.com/oroca/oroca-ros-pkg/master/ros_install.sh && chmod 755 ./ros_install.sh && ./ros_install.sh catkin_ws_tork indigo

It’s capable of ROS Jade and the 2016 version called Kinetic Kame, in addition to ROS Indigo.
Report and discussion is encouraged at OROCA project github page.

著者:Yumiko Suzuki

Private ROS Workshop on 19th AprilプライベートROSワークショップを開催しました


We also had a private ROS Workshop at the seminar room in the company.

The participants prepared own Ubuntu PC and installed indigo. Their active questions make a lecture really enjoied the event.

Thanks you for joining us!!


本日は某企業様の会議室をお借りして,企業内でのプライベートROSワークショップを開催いたしました.
実践的な質問をいただきながらの活発なワークショップとなりました.お疲れ様でした.

出張ワークショップ,カスタマイズワークショップも承っております.
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp
お申込みお問い合わせお待ちしております!

IMG_20151112_182120

著者:Yumiko Suzuki

ROS Workshop for Intermediate Manipulation on 15th April ROSワークショップ中級・マニピュレーション編を開催しました


We had ROS Workshop for Intermediate Manipulation at Hongo, Tokyo.

The participant prepared own Ubuntu PC and installed indigo.
You can experience ROS workshop by the LiveUSB without installation of Ubuntu on your machine.

Thanks you for joining us!!


今回は本郷のオープンスペースにて,ROSワークショップ中級・マニピュレーション編を開催しました.
本郷のオープンスペースは一日中コーヒーが無料です!

本日の参加者の方はROS歴1年でタスクが順調に消化されていきました.
「独学で知ることが出来なかった基本を知ることが出来て参加出来てよかった」とのコメントをいただきました.
長時間の講習お疲れ様でした.ありがとうございました.

ワークショップはUbuntuで実施します.Ubuntuマシンをお持ちで無い場合は弊社のLiveUSBを使うことでご自分のマシン環境を変更することなくワークショップを体験することが可能です.
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.

4-6月のワークショップ日程を公開しています.
プライベートワークショップ,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp


IMG_20160415_150136

著者:Yumiko Suzuki

ROS Workshop Schedule, from April to June 20162016年4月-6月のROSワークショップ日程


Here are the schedule of our ROS workshop series during the second three months of 2016!

Apr. 13 Wed 13:30- Introductory
Apr. 15 Fri 10:30- Intermediate
Apr. 26 Tue 13:30- Introductory
May 11 Wed 13:30- Introductory
May 19 Thu 10:30- Intermediate
May 25 Wed 13:30- Introductory
June 09 Thu 13:30- Introductory
June 16 Thu 13:30- Introductory
June 22 Wed 10:30- Intermediate

Venue: Hongo, Tokyo

Inquiries: info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120



以下日程でROSワークショップを行います.

4月13日(水)13:30~ ROSワークショップ初級編
4月15日(金)10:30~ ROSワークショップ中級・マニピュレーション編
4月26日(火)13:30~ ROSワークショップ初級編
5月11日(水)13:30~ ROSワークショップ初級編
5月19日(木)10:30~ ROSワークショップ中級・マニピュレーション編
5月25日(水)13:30~ ROSワークショップ初級編
6月09日(木)13:30~ ROSワークショップ初級編
6月16日(木)13:30~ ROSワークショップ初級編
6月22日(水)10:30~ ROSワークショップ中級・マニピュレーション編

場所については都内・本郷のミーティングスペースでの実施を予定しています.

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編
ROSワークショップ中級・マニピュレーション編

日程の調整,その他ご相談,企業内ワークショップも承っております.お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120

著者:Yumiko Suzuki

ROS Workshop for Intermediate Manipulation on March ROSワークショップ中級・マニピュレーション編を開催しました


We also had ROS Workshop for Intermediate Manipulation at Yushima, Tokyo.

They took part a workshop using our LiveUSB. You can experience ROS workshop by the LiveUSB without installation of Ubuntu on your machine.

Thanks you for joining us!!


今回も湯島のミーティングスペースにて,ROSワークショップ中級・マニピュレーション編を開催しました.

ワークショップはUbuntuで実施します.弊社のLiveUSBを使うことでマシン環境を変更することなくワークショップを体験することができます.
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp

長時間の講習お疲れ様でした.ありがとうございました.

4-6月のワークショップ日程を公開しています.
https://opensource-robotics.tokyo.jp/?p=1470
プライベートワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp


IMG_20160329_172456 IMG_20160329_172459

著者:Yumiko Suzuki

Private ROS Workshop on 25th MarchプライベートROSワークショップを開催しました


We also had a private ROS Workshop at the seminar room in the company.

Their active questions make a lecture really enjoied the event.

Thanks you for joining us!!


本日は某企業様の講演ホールをお借りして,企業内でのプライベートROSワークショップを開催いたしました.
活発にご質問をいただき1時間延長してのワークショップとなりました.お疲れ様でした.

出張ワークショップ,カスタマイズワークショップも承っております.
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp
お申込みお問い合わせお待ちしております!

IMG_20151112_182120

著者:Yumiko Suzuki

ROS Workshop for Beginners on 7th MarchROSワークショップ初級編を開催しました

We also had ROS Workshop at Yushima, Tokyo.

Beginner’s Workshop covers the Leap Motion, 3D gesture sensor. The Leap is capable of tracking the fingers and palm of a user with millimeter accuracy.
leap_motion is a ROS driver for interfacing with the Leap, provides single hand 3D palm information.
The participants use its source code and study how to publish/subscribe a ROS topic in the workshop.

Thanks you for joining us!!

IMG_20160307_145944



今回も湯島のミーティングスペースにてROSワークショップ初級編を開催しました!
初級編ではLeap Motionを使います.Leap MotionはROSのパッケージがあり,ワークショップではソースコードをダウンロードして使います.
Leap Motionに初めて触れる方は,自分の手の動きに連動するVisualizerに感激されます.
本日も順調に進んで最後まで完遂しました.お疲れ様でした!

IMG_20160307_145944

著者:Yumiko Suzuki

Private ROS WorkshopプライベートROSワークショップを開催しました


We also had a private ROS Workshop at the seminar room in the company.

The participants prepared own LiveUSB and installed indigo. Their active questions make a lecture really enjoied the event.

Thanks you for joining us!!

IMG_20151112_182120


本日は某企業様のセミナールームをお借りして,企業内でのプライベートROSワークショップを開催いたしました.
市販のROS日本語本に沿って事前にROSをインストールしてご参加いただきました.
活発に質問もいただき時間を延長してのワークショップとなりました.ご依頼いただきありがとうございました.

出張ワークショップ,カスタマイズワークショップも承っております.
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp
お申込みお問い合わせお待ちしております!

IMG_20151112_182120

著者:Yumiko Suzuki

ROS Workshop for Beginners on 25th FebruaryROSワークショップ初級編を開催しました

We also had ROS Workshop at Yushima, Tokyo.

He joined our Beginners Workshop with own PCinstalled Ubuntu and ROS indigo.
The participant is emacs user.
( I love emacs!!! ).

Thanks you for joining us!!

IMG_20160225_173126



今回も湯島のミーティングスペースにてROSセミナー初級編を開催しました!
今日の参加者の方は事前のご自分のマシンにROS indigoのインストールまで完了した状態でご参加くださいました.
お疲れ様でした!

IMG_20160225_173126

著者:Yumiko Suzuki

ROS Workshop for Intermediate Manipulation on Feburary ROSワークショップ中級・マニピュレーション編を開催しました


We also had ROS Workshop for Intermediate Manipulation at Yushima, Tokyo.

They took part a workshop using our LiveUSB. You can experience ROS workshop by the LiveUSB without installation of Ubuntu on your machine.

Thanks you for joining us!!

IMG_20160218_162646 IMG_20160218_162709


今回も湯島のミーティングスペースにて,ROSワークショップ中級・マニピュレーション編を開催しました.
今日の参加者は皆vi使いの方でした.(私はemacs派です!)

弊社のLiveUSBを使うことでマシン環境を変更することなくワークショップを体験することができます.
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp

長時間の講習お疲れ様でした.ありがとうございました.

IMG_20160218_162646 IMG_20160218_162709

著者:Kei Okada

ROS Workshop at Municipality相模原ロボット制御用オープンソース講習会を開催しました

We held ROS Workshop at Sagamihara ROBOT SUPPORT CENTER (SIC) and Okada-Lab at Tamagawa University on 16th, 30th Jan, and 6th Feb.

SIC is an industrial training facility in the city of Sagamihara in Kanagawa prefecture, where global and local businesses are located in electronics and heavy industry. The center aims to assist the local economy by providing training and support for the robotics technologies.

We, TORK, have been holding technical workshop for opensource robotics for several dozen times at different levels (this, this, this, and this to name a few). This time we worked with SIC to give a series of dedicated workshop for the engineers and managers from the local tech companies.

The contents consists of following three parts. We also would like to thank to students from Okada-Lab@Tamagawa University for their assistance.

  • 1. ROS Workshop for beginners.
    • Learning basics of ROS system through the hands-on workshop.
      • ROS Setup
      • Recognition human hand with vision sensor(LeapMotion)
      • Recognition based motor control
  • 2. ROS Workshop for intermediates
    • Learning how to control original robot arm. This tutorial uses original manipulator using Dynamixel servo motors. Learn how to create URDF model and MoveIt Setup.
      • Robot arm modeling and visualization
      • Connecting real robot and robot on rviz
      • Control simulated robot on rviz using MoveIt!
      • Control real robot using MoveIt!
      • Recognizing AR marker and transformations
      • Wringing vision based robot motion control program
  • 3. ROS + Nextage/HIRO Dual-arm robot
    • Learning ROS and OpenRTM using HIRO robots, including how to plan motions using MoveIt!, using Kinect Depth sensor for realtime obstacle avoidance, grasping object using hand-eye cameras.

IMG_20160206_100355IMG_20160206_100714IMG_20160206_154010IMG_20160130_154328IMG_20160206_154043IMG_20160130_144350

1月16日,30日,2月6日と,三回にわたって相模原ロボット導入支援センター様および玉川大学岡田研究室にてロボット制御用オープンソース講習会を開催しました.

内容は以下の三回構成.地域の経営者,技術者の皆さんにオープンソースのロボット制御方法を学んでいただきました.玉川大学の岡田研究室の学生の皆さんに運営サポートで参加していただき大変助かりました.ご参加いただいた皆様,運営の皆様,玉川大学岡田先生と学生の皆さん,お疲れ様でした.ありがとうございました!

  • 第一回( ROSワークショップ初級編)
    • ロボットの基本ソフトである ROS の概要を基礎から紹介する.ワークショップを通して手を動かしROSの概要を知る.ROS を使ったプロジェクトを始めようと考えている初学者に適している.
      • ROS 開発環境設定
      • 認識センサ(LeapMotion)を用いた手の検出プログラム
      • 認識に基づくサーボモータ制御
  • 第二回(ROSワークショップ中級編)
    • オリジナルのロボットアームを作成して動かす場合に必要な知識の獲得を目的とする.具体的には,Dynamixel サーボモータを使用した4軸ロボット「StackIt!」により,マーカのついたパックの pick&place を通じてロボットモデル(URDF)の作成方法や MoveIt! の設定方法を学ぶ.
      • ロボットアームのモデル作成と表示
      • 実物のロボットとシミュレータ(RViz)上のロボットの接続
      • MoveIt! を使ってシミュレータ(Rviz)上のロボットを動かす
      • MoveIt! を使って本物のロボットを動かす
      • カメラによる AR マーカの認識と座標変換
      • ロボットの動作プログラムの作成
  • 第三回(ROS+HIROセミナー特別編)
    • ロボット制御用のオープンソースソフトウェア ROS と OpenRTM を用いたロボットの動作例として双腕ロボット.動作計画ツール MoveIt!,体外に設置した点群カメラを用いた障害物を考慮した動作生成や,手先カメラで認識したマーカを掴む等,既存ユーザから要望の高い認識を用いたアプリケーション例を体験する.

IMG_20160206_100355IMG_20160206_100714IMG_20160206_154010IMG_20160130_154328IMG_20160206_154043IMG_20160130_144350

著者:Yumiko Suzuki

ROS Workshop for Beginners on FebruaryROSワークショップ初級編を開催しました

We also had ROS Workshop at Yushima, Tokyo.

We made a LiveUSB with his usb-memory at the same time for reviewing the beginner’s course today.
The participant is vi user and completed today’s tasks in a short time.
( I like emacs, anyway ).

Thanks you for joining us!!

IMG_20160203_162901



今回も湯島のミーティングスペースにてROSセミナー初級編を開催しました!
弊社のLiveUSBを使って参加予定の方でしたが,帰ってから復習したいとのことでその場でご自分のUSBにisoを焼きこんで再スタート.
Ubuntuは初めてと仰っていましたが,vi使いの方でした.サクサクと課題が進みました.
お疲れ様でした!

IMG_20160203_162901

著者:Kei Okada

NEXTAGE Open in Singapore[ユーザ事例] NEXTAGE Open @ シンガポール

NEXTAGE Open (Hironx) を利用されているユーザ様事例を紹介します.
ROS をサポートしている NEXTAGE Open (カワダロボティクス社) は海外ユーザにも好評です.最近の大学ランキングでは京大,東大よりも上位で評価されている Nanyang Technological University (NTU) もその一つ.
NEXTAGE Open を使ってティーチングシステムの研究をされています.


TORK は NEXTAGE Open のオープンソース・ソフトウェアに関するサービスを行っております.


Let’s look at another usecase of NEXTAGE Open (Hironx), this time from Singapore.

ROS-capable dual-arm robot NEXTAGE Open (Kawada Robotics) has got a momentum over the world and south-east Asia isn’t an exception. At Nanyang Technological University (NTU), one of the most prominent research institutes, researchers are working on teaching system.


TORK has been providing software solution for NEXTAGE Open.

著者:Yumiko Suzuki

ROS Workshop for Beginners on JanuaryROSワークショップ初級編を開催しました


We also had ROS Workshop at Yushima, Tokyo.

The beginner course’s last topic is Moveit! installation and it’s experience.
It’s the best workshop for a beginner at ROS and Moveit!.

Thanks you for joining us!!

Screenshot from 2016-01-12 12_05_01


今回も湯島のミーティングスペースにてROSワークショップ初級編を開催しました.
初級編の最後の章はMoveit!のインストールと操作体験です.
ROSを初めて学習される方に最適なワークショップとなっております.
Linux環境が準備出来ない方もLiveUSBにてハンズオン講習を体験することができます.

2-3月のワークショップ日程も公開中です.
https://opensource-robotics.tokyo.jp/?p=1364

詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp
お申込みお問い合わせお待ちしております!

Screenshot from 2016-01-12 12_05_01

著者:Yumiko Suzuki

ROSを初めて勉強する時に

ROSを初めて勉強する時には何をしたら良いかという質問をいただくことが多くなりましたので
少しまとめてみました.

ROSWiki,チュートリアル
ROSのwikiには概要も詳細も含まれています.英語がメインですが日本語もあります.
http://wiki.ros.org/
http://wiki.ros.org/ja
また,チュートリアルを一通りやってみると,どのような要素が含まれているのかを掴み使い方を知ることが出来ます.
http://wiki.ros.org/ja/ROS/Tutorials

◆Linuxに触れるのが初めてという方は,Linuxの使い方がまとまったサイトなどを利用して
Linuxの道具の使い方を一度学んでからROSに取り掛かると,チュートリアルを実施するのがとても楽になります.
以下のページはLinuxコマンドやエディタについてとても良くまとまっていて大変おすすめです.
http://robotics.naist.jp/edu/text/?Robotics%2Flinux-command

answers.ros.org
困ったことが出てきたら,answers.ros.orgで質問を投げましょう.
http://answers.ros.org/questions/

ROS Japan User Group : 日本のROSコミュニティ
ROSはコミュニティが盛んです.日本のROSコミュニティにも是非参加してください.
http://www.ros-users.jp/

日本語本:ROSではじめるロボットプログラミング―フリーのロボット用「フレームワーク」 小倉 崇
Webの情報だけは体系がつかみにくい場合があります.本の流れに従って学習を進めることで理解しやすい人もいますのでおすすめしています.
http://www.amazon.co.jp/dp/4777519015/ref=cm_sw_r_tw_dp_H5vCwb1ZHF61C

無料配布本:詳説 ROSロボットプログラミング Kurazume Laboratory
PDFで配布されています.無料で配布されていますが大変ボリュームがあり解説も大変詳しいです.使いたい機能の章だけを参照するという使い方もできます.
http://irvs.github.io/rosbook_jp/

ROSワークショップ
もちろん弊社のROSワークショップ初級編もお薦めです.ROSを使ってハードを動かすところまで体験できます.
ROSワークショップ初級編

ROSを初めて勉強する方や途中であやふやになってしまった方は,上記リンクを参考にROSを体験してみてはいかがでしょうか.

2016年も引き続きワークショップを開催いたします.お申込みお待ちしております!
FullSizeRender