本シリーズ前回の記事 SwitchBot を ROS から利用する – データ取得編 掲載以降,手元にある SwitchBot デバイスの種類が増えてきました.
そこで今回の記事では switchbot_ros でまだ対応していないデバイスのデータを取得・パブリッシュするためにコードを追加する様子を紹介します.追加例としてデバイス「SwitchBot CO2センサー(温湿度計)」のデータを取得して ROS Topic としてパブリッシュできるようにします.
追加したいデバイスが SwitchBot API で対応していないと switchbot_ros 側でも対応はできないので最初に SwitchBot API のドキュメントを調べます.
SwitchBot API v1.1 ドキュメント にデバイスのリスト取得とステータス取得の項目に「Meter Pro CO2」の記述があり,これが今回追加してみたデバイス「SwitchBot CO2センサー(温湿度計)」に対応したものとなっていました.
制御コマンドの一覧には CO2 センサーらしき記述が(少なくとも本記事執筆時には)ありませんので「SwitchBot CO2センサー(温湿度計)」には取得系コマンドのみが対応していて,制御系コマンドは無いようです.
SwitchBot API ドキュメントにある「SwitchBot 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 CO2センサー(温湿度計)」について SwitchBot API が対応していることと API により取得できる測定値が分かりましたので実装してゆきます.もう少し具体化すると「SwitchBot CO2センサー(温湿度計)」から API 経由で得られた
の4つの値を ROS Topic としてパブリッシュします.
SwitchBot API によるデータの取得と ROS Topic のパブリッシュプロセスは switchbot_ros にある既存のルーチンをそのまま利用できますので今回新たに実装する部分は大まかには次の2つです.
先に結論としてコードの追加部分を下に記載してしまいます.ファイルとしては3点,追加箇所としては5点です.
今回追加する「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 内で利用するためにメッセージクラス MeterProCO2
を import
しておきます.
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 デバイス名リストを取得・確認してから,得られた新規追加したデバイス名を指定して SwitchBot デバイスのステータスデータの取得と ROS Topic へのパブリッシュを行い,実際にパブリッシュされているかを ROS Topic を表示して確認します.
実行方法は今回機能追加するより前の方法と同じで,launch 時にオプション指定するデバイス名を変えるだけです.
ターミナル 1 : switchbot_ros の実行
SwitchBot API 経由で今回追加した「SwitchBot CO2センサー(温湿度計)」の「デバイス名」と「デバイスタイプ」が取得できることを確認します.ユーザの SwitchBot アカウントで登録されているデバイスの「デバイス名」と「デバイスタイプ」は 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/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 CO2センサー(温湿度計)」のステータスデータを取得してパブリッシュされている ROS Topic を表示して確認してみます.前述の switchbot.launch の実行出力例からデバイス名が co2sensor-ba1
となっています.
ステータスデータを取得する場合は switchbot.launch 実行時に次の2つのオプションを追加します.
pub_status:=true
ステータスを取得・パブリッシュを実行するオプション true/falsepub_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
YOUR_TOKEN
と YOUR_SECRET
は各々の SwitchBot アカウントのトークンとシークレットに置き換えて実行してください.pub_status:=true
でステータスを取得・パブリッシュを実行します.pub_device_name:=co2sensor-ba1
の co2sensor-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 にパブリッシュされている様子が見て取れるかと思います.
今回の記事はここまでです.
本シリーズ前回の記事では 900 シリーズのルンバと Ubuntu PC を USB ケーブルで 接続して ROS からルンバを有線操縦する方法を紹介しました.
今回の記事ではルンバが独立して動きやすいようにバッテリー駆動のラズベリーパイ(ラズパイ・Raspberry Pi)をルンバと USB 接続し,併せて USB カメラもそのラズパイに接続することで,ルンバ 900 シリーズを WiFi を介した ROS 遠隔操作ロボットのようにしてみる様子を紹介します.
前回の記事においてルンバを Ubuntu PC から ROS を使って USB 有線操縦することを目的としたハードウェア・ソフトウェア構成は以下のようになっていました.
今回はこれらのハードウェアに加えて下記のラズパイとその周辺機器のセットをルンバに接続したシステムも使用します.
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 と必要なソフトウェアをインストール・ビルドします.
Ubuntu 24.04 ディスクイメージを microSD カードに書き込みます.
Install Ubuntu on a Raspberry Pi を参照して microSD カードに Ubuntu 24.04.1 以降ののインストーライメージを書き込みます.
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
その場合は本記事最後にあるトラブルシューティングの項目を参考に nano
や gedit
その他お好みの 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 側にはゲームコントローラなどを接続します.
次の画像はルンバ側のハードウェアを接続した様子です.
次の画像は Ubuntu PC 側のハードウェアを接続した様子です.この画像内の PC ディスプレイには後述する「ソフトウェアの実行」を行ったときのルンバに設置した USB カメラからの映像が映し出されています.
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 互換ゲームパッド使用の場合 >
joy_teleop.launch
を起動します.
$ source ~/roomba_ws/install/setup.bash $ ros2 launch create_bringup joy_teleop.launch
< 3Dマウス( 3DConnexion SpaceMouse Wireless )使用の場合 >
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 で終了してください.
ルンバから派生した趣味や教育用をターゲットとした 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
Ubuntu 24.04.1 でターミナルが起動しなかったのですが,その時は /etc/default/locale の内容を LANG="en_US.UTF-8"
に修正したら起動するようになりました.
/etc/default/locale
LANG="en_US.UTF-8"
gnome-text-editor がコマンドラインから起動できない場合は他のテキストエディタ nano や gedit などを使用してください.
$ nano ~/roomba_ws/src/libcreate/include/create/packet.h
$ sudo apt update $ sudo apt install gedit $ gedit ~/roomba_ws/src/libcreate/include/create/packet.h
今回の記事はここまでです.
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 有線操縦することを目的とした今回の記事におけるハードウェア・ソフトウェア構成は以下のようになっています.
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
上記手順の 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 ブランチにマージされた後は不要となります.
Ubuntu PC のソフトウェアのセットアップが終了したら Ubuntu PC にルンバとゲームパッドもしくは 3D マウスを接続します.
ルンバ 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 互換ゲームパッド使用の場合 >
$ source ~/roomba_ws/install/setup.bash $ ros2 launch create_bringup joy_teleop.launch
< 3Dマウス( 3DConnexion SpaceMouse Wireless )使用の場合 >
$ 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 遠隔操作ロボットのようにしてみる様子を紹介する予定です.
本シリーズ前回の記事 SwitchBot を ROS から利用する – コマンド操作編2 では SwitchBot を ROS から利用する switchbot_ros のサンプルのソースコードで扱われていた SwitchBot デバイス以外のものを ROS から操作するために SwitchBot API のコマンドセットを調べて control_switchbot.py に実装する過程について紹介しました.
今回は SwitchBot デバイスのステータスデータの取得と ROS トピックへのパブリッシュを行ってみます.
前回の記事 SwitchBot を ROS から利用する – コマンド操作編2 を公開した後に GitHub 上の switchbot_ros が更新されて SwitchBot デバイスのステータスデータの取得とパブリッシュを行うソフトウェアソースコードが追加されました.
更新された switchbot_ros を実際に動作させる Ubuntu PC 内の switchbot_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
ターミナル 1 : switchbot_ros の実行
前回記事と同じですがユーザの SwitchBot アカウントで登録されているデバイスの「デバイス名」と「デバイスタイプ」は 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.
利用可能なデバイス名がコンソール出力されたので一旦 Ctrl-C にて switchbot.launch を終了します.
上記の switchbot.launch 実行出力例にある SwitchBot デバイスのうち取得するステータスがない Remote 以外の次のデバイスタイプは switchbot_ros にてステータスデータを取得することができます.
また上記リスト以外のデータ取得 API 提供がされている SwitchBot デバイスについては switchbot_ros のコードに組み込まれていませんが適宜情報をコードに加えれば switchbot_ros からもデータ取得できるようになると思います.
実行例として今回は SwitchBot の温湿度計(デバイスタイプ Meter)のステータスデータを取得してパブリッシュされている ROS トピックを表示してみます.先述の switchbot.launch の実行出力例から読み取ると,該当するデバイス名が thermo-hygrometer-f7a
となっています.
ステータスデータを取得する場合は switchbot.launch 実行時に次の2つのオプションを追加します.
pub_status:=true
ステータスを取得・パブリッシュを実行するオプション true/falsepub_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
YOUR_TOKEN
と YOUR_SECRET
は各々の SwitchBot アカウントのトークンとシークレットに置き換えて実行してください.pub_status:=true
でステータスを取得・パブリッシュを実行します.pub_device_name:=thermo-hygrometer-f7a
の thermo-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
のように追加します.温湿度のように急に変化しなさそうなデータの場合はもっと長めの間隔でも良いかもしれません.
今回の記事はここまでです.
本シリーズ前回の記事 SwitchBot を ROS から利用する – コマンド操作編1 では SwitchBot を ROS から利用する switchbot_ros の導入とサンプル Python コードの実行の様子を紹介しました.
今回は前回の記事の続きとしてサンプルのソースコードで扱われていた SwitchBot デバイス以外のものを ROS から操作するために SwitchBot API のコマンドセットを調べて control_switchbot.py に実装する過程について紹介します.
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 デバイスタイプが分かればそのコマンドセットを調べます.SwitchBot API のコマンドセットは下記の Web ページで知ることができます.
今回はデバイスタイプ Plug Mini (JP) と Strip Light のデバイスを操作したいのでそれらのコマンドセットについて調べます.
電源プラグの 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つのコマンドにより構成されています.
テープライト形状の 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 色設定を行います.
デバイス名 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
デバイス名 tapelight7a1
の Strip Light (テープライト)を操作します. ROS からコマンドを送って次の動作をしてみます.
'255:255:255'
に設定'255:0:0'
に設定'0:255:0'
に設定'0:0:255'
に設定サンプルコード control_switchbot.py に下記ソースコードの18行目以降を追加します.
値を設定する setBrightness
や setColor
といったコマンドでは各数値を control_device()
の引数 parameter
に文字列として渡します.
また control_device()
の中ではコマンドを Action サーバにゴールとして送っているので新しいコマンドが前のコマンドに置き換わらないように1つ1つのコマンド実行を終えるのを待つように引数 wait
に True
を渡しています.
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()
今回の記事はここまでです.
本記事では 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 を利用しています.
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_ros は SwitchBot API を利用していますので SwitchBot API にアクセスするための SwitchBot アカウント各々に固有の「トークン(token)」と「シークレット(secret)」の2つの情報が必要になります.
SwitchBot Magazine – 【API】新バージョンAPI v1.1を公開しました にトークンとシークレットの取得方法などが書かれています.この記事から引用・まとめをするとトークンとシークレットの取得方法はつぎのようになっています.
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')
client.control_device('pendant-light', 'turnOff')
で 'turnOff'
となっているのに点灯?と思いますが筆者のペンダントライトのリモコンを SwitchBot アプリで登録する際に電源の On/Off ボタンが1つのものとして扱われていて 'turnOn'
も 'turnOff'
も On/Off の切り替えボタンとして機能してしまっているためです. ( = もう一度 client.control_device('pendant-light', 'turnOff')
を実行すると消灯になる) このように特に登録するリモコンについてはどのようにマッピングができたかに挙動が依存するのでコマンドに対する各々のデバイスの挙動を確認してから利用する必要があります.
操作コマンドの SwitchBot デバイスに至るまでの大まかな流れは次のようになっています.
それでは実際に実行してみます. SwitchBot ROS アクションサーバを起動してから別ターミナルで control_switchbot.py を実行します.
ターミナル 1 : SwitchBot ROS アクションサーバの起動
下記コマンドの SwichBot ROS アクションサーバの起動実行時に launch オプションの token:=YOUR_TOKEN
の YOUR_TOKEN
を SwitchBot アプリで取得したトークンに置き換えて, secret:=YOUR_SECRET
の 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.
ターミナル 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 にコマンドを追加する様子についてお伝えする予定です.
本シリーズ前回の記事 1. ROS Service プログラムの文脈をふまえたチャット対応 では OpenAI の Chat Completion API を利用して過去のチャット履歴もふまえたチャットを行える ROS Service プログラムを作成した様子をお伝えしました.
今回の記事では Chat Completion API を利用した「文脈をふまえたチャット」をする ROS ソフトウェアを実装してみた2つ目の方法「2. ROS Topic を介した ChatGPT チャットプログラム」を作成した様子を紹介します.
前回,比較的短文のチャットを扱う Chat Completion API へのアクセスであれば ROS Service よりも ROS Topic を介したメッセージのやり取りの方が ROS ノード内でのチャット会話に限られず,より ROS に親和的でよりシンプルな構成になるのでは?という反省がありました.
今回の ROS Topic を用いたチャットプログラムの作成方針は次のようにしました.
/request
を購読してユーザの発言を得る/response
としてパブリッシュする/request
にパブリッシュする/response
を購読して得るROS Service プログラムの場合はチャット履歴をふまえたとしてもチャット機能提供側とユーザとの1者対1者でのやり取りでしたが,ROS Topic にすることでチャット機能提供側と複数のユーザの1者対他者でのやり取りも可能になる利点もあります.
ROS Topic を介した文脈をふまえたチャットプログラムで追加したファイルは次の2つです.
サービスの定義など考慮しなくて良いので非常にシンプルです.
以下,それぞれのファイル内のコードを記載して少し説明をします.
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()
/request
を購読(Subscribe)してトピックを受け取ったら callback()
メソッドを呼び出すcallback()
メソッド内で新たなリクエストをチャット履歴に追加/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 を拾って自分で文脈を記録して解釈する必要があります.
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>
opponent
で ChatGPT 同士の会話にするかを指定
output="screen"
はなしprompt
の設定でアシスタント同士だと会話が不自然な感じがしたので(とりあえず)2つ目のプロンプトは “You are a good talker.” としてみた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 間での会話も可能であろうと思います.
今回の記事はここまでです.
本シリーズ前回の記事 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 プログラムの文脈をふまえたチャット対応」を行った様子をお伝えします.
前回作成した 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 にアクセスする方法を採ってみました.
今回も Web サービスの ChatGPT の助けを借りてプログラムを作成したのですが,まるごと Python コードを作成するための問いの仕方が下手だったのか,ChatGPT の応答でしっくり来るようなソースコードは得られませんでした.そこで Python コードを記述する際の個別具体的な問題について ChatGPT の力を借りました.
例えば Chat Completion API へのメッセージやレスポンスを文字列(string)にしてやり取りする方法を聞きました.
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のTrue
とFalse
をそれぞれtrue
とfalse
として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 に質問してみました.
Chat Completion API の渡し値の role における system と assistant の違いをおしえて?
ChatGPT
Chat Completion APIの文脈におけるrole
の値system
とassistant
は,入力メッセージのコンテキストを形成するためのものです.各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
messages
,受取るデータをresponse
というstring
型にしています.
string messages --- string response
scripts / openai_chat_server.py
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
role
の「環境やセッションの全体的な指示やコンテキストを設定する」 system
に prompt
の内容を設定します.
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
<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
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 チャットプログラム」を作成した様子を紹介する予定です.
今回の記事はここまでです.
本シリーズ前回の記事 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 の助けをかりながら作成した様子を紹介します.
本シリーズ第1回の記事 ChatGPT と ROS – 調査編 でもふれましたが OpenAI の文書生成 API について簡単にまとめますと,「1問1答形式」の Completion API と,「対話した文脈を含むチャット対話形式」の Chat Completion API の2つがあります.
前回の記事ではこの2つのうち「1問1答」形式の Completion API を利用ました.今回の記事ではもう一方の「チャット対話」形式のインタフェースである Chat Completion API を ROS から利用してみます.
今回は Web サービスの ChatGPT に Chat Completion API を使ったプログラムを生成してもらいながら進めましたのでそれも含めて開発・実行環境の構成は次のようになっています.
まずは ChatGPT の Web サービスに ChatGPT の Python API にアクセスするための Python プログラムを書いてもらいました.
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 に対応させたプログラムを作成してもらいました.
この 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 ラッパープログラムも固定プロンプトへの応答結果を出すだけになってしまいました.
そこでプロンプトを変更可能なようにプログラムを変更してもらいました.
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 と ROS – 文書生成 ROS ラッパー利用編(Completion API) で利用した ROS パッケージ https://github.com/davesarmoury/openai_ros をベースに Chat Completion API を利用する機能を付け加えるかたちで進めました.
ChatGPT が生成した Chat Completion API を利用する ROS Python プログラムを使って Chat Completion API を利用できるよう ROS パッケージに変更を加えた箇所をまとめると次のようになります.
#!/usr/bin/env python
#!/usr/bin/env python3
openai.api_key = 'your-api-key'
openai.api_key = rospy.get_param('~key')
model="gpt-4.0-turbo",
model="gpt-3.5-turbo",
print("Ready to handle GPT-4 requests.")
print("Ready to handle GPT-3.5 requests.")
GptService.srv
の記述追加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 プログラムに改造した様子をお伝えする予定です.
本シリーズ前回の記事 ChatGPT と ROS – 調査編 では ChatGPT の ROS を介した利用について少し調べてみたことをお伝えしました.
今回は OpenAI API の ROS ラッパーの中で Completion API を利用している ROS1 の Python ラッパ https://github.com/davesarmoury/openai_ros を使ってみた様子を紹介します.
今回は次の環境で OpenAI API の ROS を介した実行を行っています.
OpenAI API は新規登録後 3ヶ月 の期限がありますが 5ドル分 の無料クレジットが付与されるのでお試し利用することができます.(2023年8月中旬時点)
API Key の取得は OpenAI API の Web ページでログインした状態で下記リンク先の API keys のページから取得します.
実行環境の準備が整いましたらインストールとビルドを行います.
ROS は既にインストールされているようでしたら改めてインストールする必要はありません.
加えて下記の catkin ツール関係もインストールしておきます.
$ sudo apt install python3-osrf-pycommon python3-catkin-tools
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 の ROS プロセスを実行します.
まず1つ目のターミナルで API Key を環境変数 OPENAI_API_KEY
として export で設定しておきます.$ export OPENAI_API_KEY="sk-..."
の sk-...
の部分は各自の OpenAI API アカウントで作成した API Key の内容に置き換えてください.
OpenAI の Completion API を利用するための ROS サービスサーバを実行するために openai.launch を起動します.
$ 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” としてサービスコールを行います.
$ 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 $
文字コード表示を文字コード変換の ascii2uni で解決してみます.ascii2uni を使うため uni2ascii をインストールします.
$ sudo apt install uni2ascii
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 で表示できそうです.
文字コード化されたものは Python の print()
内で解決されて可読性のある日本語の状態で出力されますので,今回の openai_ros の ROS サービスを Python からコールするプログラム 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 を実行します.
$ 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 を実行します.
$ 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 に教えてもらいながら作成した様子を紹介する予定です.
文書生成などで何かと話題の ChatGPT の ROS を介した利用について少し調べてみました.
本記事の筆者は AI に興味はあるものの利用したことがほとんどない立場ですが,ChatGPT などについて調べてみると AI 初心者でも OpenAI の API と ROS を介して文章を生成することができました.加えて ChatGPT の文章生成機能の力を借りてその API を使った ROS ラッパープログラムも作ることができました.その様子を次のようなトピックで複数回に分けて記事にします.
ChatGPT を提供しているのは OpenAI 社ですので “OpenAI” や “ChatGPT” でネット検索してみると OpenAI Gym の利用だったり,ChatGPT だったりといろいろとあるようでした.全く体系的・網羅的ではないと思うのですが,今回調査してみて得られた情報を大まかに分類してみると次のような構成になりました.
まず OpenAI Gym というのは強化学習を行うためのものでロボットの動作経路の学習などに用いられていて,今回の目的としていた文書生成とは異なる機能を提供しているようです.文書生成 API も Completion API と Chat Completion API と複数に分かれていました.
Web ページから ChatGPT-4 に Completion と Chat Completion の API の違いを聞いてみました.
Completion APIとChat Completion APIは,OpenAIのGPT(Generative Pretrained Transformer)をベースとしたテキスト生成APIです.しかし,それぞれの使用方法や特性は少し異なります.
Completion API:
Chat Completion API:
使用するAPIは,あなたがどのようなタスクを実行したいか,またはどのような出力を期待しているかによって異なります.
Chat Completion は名前の「チャット」のとおり文脈を含む対話形式で,Completion は1問1答形式のようです.
Completion と Chat Completion の違いについて対比的に解説されている記事もあり参考になりました.
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 の記事でお伝えする予定です.
今回の記事はここまでです.
先日,長野市にある信州大学の山崎研究室を訪問して 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に会いました!
本シリーズ前回の記事 Gazebo/MoveIt のための 3D モデリング(13)MoveIt の静モデルの作成 では CAD などからエクスポートしたメッシュデータファイルを MoveIt の静モデルとしてモデルファイルに組み込んで表示する方法を紹介しました.
今回は洗濯機の URDF (Unified Robot Description Format) モデルにドアのヒンジなどの動く箇所を設定して,より機械らしい(ロボットに近い)モデルにする様子を紹介します.
前回の MoveIt の静モデル作成においては洗濯機全体として1つのメッシュデータファイル( DAE もしくは STL )をエクスポートして利用しました.
MoveIt のリンクモデル作成では各リンクに対応したメッシュをそれぞれエクスポートしてそれぞれのリンクのメッシュファイルとして利用します.
今回の洗濯機モデルでは次の3つのリンク構成にします.
今回は「洗濯機本体(main-body)」は元の洗濯機全体の座標系そのままとするので配置の変更はしません.
「洗濯槽の扉(door)」と「洗剤投入トレイ(tray)」の形状データを各リンクの座標系原点に配置します.
元々の洗濯機全体の座標系で配置されたオブジェクトを残しつつ,別途各リンクのエクスポート用にリンク座標系の原点にオブジェクトを配置してメッシュデータとしてエクスポートします.
Rhinoceros では右の図のようにオブジェクトを含む既存のレイヤを右クリックするとメニューに「レイヤとオブジェクトを複製」ができるのでこの機能で複製した先のレイヤで作業すると良いでしょう.
各リンク座標系基準の配置用レイヤでそれぞれの各リンクは次のように配置しました.
各リンク座標基準に配置したオブジェクトを選択して「選択オブジェクトをエクスポート」コマンドから DAE (Collada) か STL 形式でエクスポートします.
Rhinoceros から DAE (Collada) をエクスポートする場合はエクスポートオプションにて
「ジオメトリのみを保存」のみにチェック
を入れてファイルを書き出します.
この「ジオメトリのみを保存」でも色や単位情報も保存されます.
今回は表示(visual)用に色付きの DAE ファイルとしてエクスポートし,干渉チェック(collision)用にデータ量を少なくするため粗目の設定で STL ファイルをエクスポートしました.
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)」 と 「洗濯槽の扉(door)」 の相対座標・角度やの確認と設定可能な可動域を調べます.
扉は傾いて洗濯機本体に取り付けられているのでその角度とヒンジ回りの可動域も調べます.Rhinoceros では角度表示がラジアンでもできるのでそれを利用します.
リンクモデルに必要なメッシュファイルと情報が揃いましたので 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 内のそれぞれの要素について説明します.
<link>
要素: リンクの定義 3つ ( base_link, door, tray )<collision>
要素にメッシュに STL ファイルを使用し単位変換 [mm] → [m]<visual>
要素に DAE メッシュファイルを使用<origin>
はリンク内のメッシュの配置なので今回は全てゼロ<joint>
要素: joint1type
で関節形式 revolve
(=回転)を設定<parent>
要素で関節を介する親リンク base_link
を指定<child>
要素で関節を介する子リンク door
を指定<origin>
要素で親子リンク間の相対座標<axis>
要素で revolve
関節の回転軸のリンク座標系での方向を設定<limit>
要素effort
: 最大トルク – 今回はとりあえずの値velocity
: 最大角速度 – 今回はとりあえずの値lower
: 可動域下限 – 回転関節なので下限角度で単位はラジアン [rad]upper
: 可動域上限 – 回転関節なので上限角度で単位はラジアン [rad]<joint>
要素: joint2type
で関節形式 prismatic
(=並進)を設定<parent>
要素で関節を介する親リンク base_link
を指定<child>
要素で関節を介する子リンク tray
を指定<origin>
要素で親子リンク間の相対座標<axis>
要素で prismatic
関節のリンク座標系での移動方向を設定<limit>
要素effort
: 最大力 – 今回はとりあえずの値velocity
: 最大速度 – 今回はとりあえずの値lower
: 可動域下限 – 並進関節なので下限位置で単位はメートル [m]upper
: 可動域上限 – 並進関節なので上限位置で単位はメートル [m]下記リンク先の ROS Wiki に URDF ファイルの作成方法のチュートリアルがありますので参考にしてください.
urdf_tutorial
の display.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 も一緒に動いている様子が見られると思います.
今回の記事はここまでです.
本シリーズ前回の記事 Gazebo/MoveIt のための 3D モデリング(12)Gazebo の静モデルの作成 ではエクスポートしたメッシュデータファイルを Gazebo の静モデルとしてモデルファイルに組み込んで表示する方法を紹介しました.
今回はエクスポートしたメッシュデータファイルを MoveIt の静モデルとしてモデルファイルに組み込んで表示する方法を紹介します.
今回紹介するのは次の2通りの方法です.メッシュを MoveIt GUI で読み込んで障害物とする方法とロボットモデル作成につながる方法の URDF モデルの作成とそれを確認表示する方法です.
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 ファイルの作成は下記リンク先の 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 で,モデル構成要素の link
や collision
, geometry
, mesh
が記述されています.今回は静モデルですので 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 モデルの確認には 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 ワークスペースへのパスを記述
model:=
には URDF ファイルパスを指定正常に実行できると次の図のように洗濯機モデルが RViz 空間上に表示されます.
$ rosrun tf2_ros static_transform_publisher 0 0 0 0 0 0 /world /base_link
今回の記事はここまでです.
本シリーズ次回の記事は洗濯機の URDF モデルにドアのヒンジなどの動く箇所を設定してより機械らしい(ロボットに近い)モデルにする様子を紹介する予定です.
本シリーズ前回の記事 Gazebo/MoveIt のための 3D モデリング(10)部品作成編 で洗濯機全体の形状が完成しました.
まずはエクスポートするメッシュの確認も兼ねて,可動部分のない一番単純な Gazebo と MoveIt それぞれにおける洗濯機モデルを作ることを目標として,今回は CAD( 本記事では Rhinoceros )の形状データに色を付けるとともに Gazebo や MoveIt で利用できるデータ形式にエクスポートする手順を紹介します.
次の図は今回エクスポートするデータを Gazebo と MoveIt のシミュレーションモデルに組み込んで表示させた様子で,次回の記事のゴールになる予定です.
Gazebo/MoveIt のシミュレーションモデルにはディスプレイ表示用の visual メッシュと干渉チェック用の collision メッシュの2種類のデータが必要です.今回は大きく分けて次の ① ② ③ の 3種類 のデータを用意します.
ひとまず可動部分のない Gazebo および MoveIt のシミュレーションモデルを作成しますので,これまで作成してきた洗濯機モデルの閉じたポリサーフェス(=ソリッド)をそのまま全て選択して「選択オブジェクトをエクスポート(Export)」で干渉チェック用の STL メッシュデータファイルとしてエクスポートします.
ファイルの種類で「STL (Stereolithography) (*.stl)」を選択します.ファイル名はメッシュモデルの乗るシミュレーションモデルのリンク名にすると分かりやすいので今回は「base_link.stl」とします.
「ポリゴンメッシュ詳細オプション」の子ウィンドウが出るので各設定項目は主に下のリストのように今回は設定しました.(図はクリックで拡大表示されます.)
STL メッシュデータの粗密やデータ量を調整したい場合は主にこれらの設定値を調整します.
「STLエクスポートオプション」ではデータ量を確認してデータが大きすぎるような場合には「メッシュを調整」ボタンから再調整して,問題なければ「バイナリ(B)」でエクスポートします.
エクスポートした STL ファイルの内容を確認するにはフリーソフトウェアの MeshLab にインポートするのが良いのではないかと思います.
MeshLab は Windows・Mac・Linux のどのプラットフォームにもインストールできますので便利です.
また Windows であれば「3Dビューアー」,Mac であれば「プレビュー」でも STL ファイルを表示することが可能です.
エクスポートした STL ファイルに洗濯機全体の形状データが含まれているように表示されるかと思います.
干渉チェック(collision)用の STL ファイルへのエクスポート手順は以上です.
ディスプレイ表示用の visual メッシュは色を付けない単色での利用も可能ですが,せっかくなのでカタログから推測して次のリストの色分けをしてみます.
Rhinoceros のデフォルトではポリサーフェスで1つにまとまっていると色や反射率,透過率などの設定が含まれるマテリアル設定が1つしか反映されないので,色ごとのポリサーフェスやサーフェス,それらのグループに分解します.ソリッド(=閉じたポリサーフェス)の状態は残しておきたいので色付け用のレイヤを作成してそのレイヤに洗濯機モデル全体をコピーしたものを分解,色付けします.
色はオブジェクトの「マテリアル」を設定して付けます.
色ごとに分けたオブジェクト(=ポリサーフェスやサーフェス,グループ)を選択してから右クリックして「オブジェクトのプロパティ(S)」を表示して「プロパティ: マテリアル」タブを開きます.
マテリアルの設定時に気を付ける点があり,「金属」系の色は後の項目でエクスポートする Collada(DAE)ファイルや Gazebo,MoveIt のディスプレイ上では反映されなく,意図しない,おそらくエクスポートしたオブジェクトのあるレイヤー色か黒などに表示されてしまうので「プラスチック」系のマテリアルを使用して各色を指定するのが良さそうです.
また,Rhinoceros 上での表示形式を「レンダリング」にすることでマテリアルが反映された表示になります.
上の図では 「gray-white」を選択した例を示していますが,他の「light-gray」「dark-gray」「blue-gray」についても同様にプラスチック系マテリアルの色を調整して設定します.
MoveIt シミュレーションモデルの URDF ファイルから表示用(visual)メッシュとして使うために,マテリアルを設定して色付けしたモデル Rhinoceros から Collada(DAE)ファイルとしてエクスポートします.
Collada(DAE)のメッシュデータには色や単位の情報も含まれるので全色分のオブジェクトを一緒くたに選択して「選択オブジェクトをエクスポート(Export)」でエクスポートします.
ファイルの種類に「COLLADA(*.dae)」を選択します.ファイル名はメッシュモデルの乗るシミュレーションモデルのリンク名にすると分かりやすいので今回は「base_link.dae」とします.
エクスポートした DAE ファイルの内容の確認は Mac だと「プレビュー」で右の図のように行えます.
FreeCAD は Windows や Mac,Linux で利用でき,DAE データも表示することができます.
FreeCAD の操作感はあまり良いとは言えないのですが様々な形式の 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 で新しくリリースされた豊かなマテリアル表現機能を使えるように実装が進んだら,今回上手くいかなかった金属表現もできるようになるのかな?と期待しています.
Gazebo シミュレーションモデルの SDF ファイルから表示用(visual)メッシュを色付きで使うためには色ごとにメッシュを分けた STL データファイルに対して SDF ファイル内で色情報を指定する必要があります.
そのために Rhinoceros からは色ごとにオブジェクトを選択して各色の STL ファイルとしてエクスポートします.
一般的な STL ファイルには色情報が含まれませんので Rhinoceros 上で色を付ける必要性はないのですが,前の項目で既に色ごとに分けて色付けしたオブジェクトがありますので,ここでは「色で選択(SelColor)」でそれぞれの色を選択して「選択オブジェクトをエクスポート(Export)」すると楽にできます.
STL エクスポート自体のの手順は先ほどの「干渉チェック(collision)用 STL メッシュデータのエクスポート」内で行った手順と基本的には同じですが,色分けした,ソリッド(=閉じたポリサーフェス)ではない,開いたポリサーフェスやサーフェスをエクスポートすることが出てきますので,その場合は「STLエクスポートオプション」にて「開いたオブジェクトをエクスポート(E)」のチェックを入れる必要があります.
ファイル名はメッシュモデルの乗るシミュレーションモデルのリンク名に色名を足しておくと分かりやすいので,今回は下のリストの各ファイル名で 4色分 4つのファイルとしてエクスポートしました.
複数に分けた STL ファイルを MeshLab にインポートすると MeshLab 内のレイヤとして表示されるのでレイヤの表示・非表示を切り替えるなどしてメッシュの確認を行うと良いのではないかと思います.
今回の記事はここまでです.
本シリーズ次回の記事は
「Gazebo/MoveIt のための 3D モデリング(12)Gazebo や MoveIt の静モデルの作成」
として,今回エクスポートしたメッシュデータファイルを Gazebo や MoveIt のモデルファイルに組み込んで表示する様子を紹介する予定です.
ROS(ロス/Robot Operating System)の学習は実際にロボットがなくてもロボットのシミュレータが入手できるのでネットワークにつながるパソコンが1台あればできますので結構自習に向いています.この記事では ROS の学習を始める,進めるにあたり必要な情報がある Web へのリンクを中心に紹介します.
大まかに言うと次のインストールを行えば ROS の学習をスタートすることができます.
ROS と Ubuntu Linux のバージョンは後述する ROS 学習のチュートリアルが現時点では ROS Kinetic というバージョンを基本としているので下記の組み合わせをお勧めします.
ROS Melodic は ROS Kinetic と基本的な操作のほとんどは変わらないので ROS Kinetic で学習してから ROS Melodic に移行しても難なく可能です.
パソコンはどのようなものを使えば良いのか?については下記記事を参考にしてください.
最新高性能パソコンよりも数年型落ちや廉価の機種のほうが Ubuntu Linux をインストールしやすい傾向にあるように思います.
下記リンク先に各 ROS のバージョンにおけるインストール手順が書かれています.
また,Ubuntu のバージョンと ROS のバージョンには1対1の対応関係があるので組み合わせを気をつける必要があります.
各チュートリアルを進めるとそれらの中で ROS シミュレータなどのインストールも行います.
ROS の入門には TORK MoveIt チュートリアルをお薦めします.MoveIt は ROS のマニピュレーションロボット動作計画ソフトウェアです.このチュートリアルでは数種のロボットの ROS シミュレータのインストールや基本的な操作,プログラムでのロボット操作を学習することができます.TORK MoveIt チュートリアルではプログラミング言語に Python を用いていますが,プログラミングの経験がほとんどない人にもプログラムによるロボット操作の体験と学習ができるように構成しています.
ROS を初めて使う方に TORK MoveIt チュートリアルを学習したときのレポートも下記の記事に書いてもらっています.学習過程でいろいろと疑問をもった点などの体験を書いてもらいましたので参考にしてみてください.
より発展的な ROS プログラミングを学習したい場合は ROS-Industrial トレーニングを行ってみるのも良いでしょう.この教材で取り上げられているプログラミング言語は主に C++ と Python です.C++ によるロボット制御や画像処理,3D ポイントクラウド処理などとそれらの組み合わせのプログラムの学習ができます.
ROS Discourse やチュートリアル,パッケージの GitHub Issues に質問を投稿してみてください.
1台のパソコンだけ,シミュレータだけでなく入門的な実機マニピュレータを利用してみたいと思った方は入門的なマニピュレーションロボット2例の導入検証を行った記事を参考にしてみてください.
新しい ROS パッケージ cis_camera( https://github.com/tork-a/cis_camera )をリリースしました.
この ROS パッケージは 株式会社シーアイエス( https://www.ciscorp.co.jp/ ) ToF (Time of Flight) カメラセンサ DCC-RGBD1 のためのドライバパッケージです.
DCC-RGBD1 は小型ながら広いレンジの深度画像が取得可能な ToF カメラセンサ(ディベロップメントキット)です.
本パッケージでは CIS ToF カメラセンサの ROS ドライバに加え,ノイズ除去,平面検出・除去,対象物点群抽出とフレーム座標算出のポイントクラウド処理ならびに,それらの処理結果を RViz で 3D 表示するためのサンプルプログラムおよび launch ファイルを同梱しています.
使い方は GitHub のドキュメントをご参照ください.
もし問題にぶつかった場合は GitHub Issues で報告をお願いします.
CIS ToF カメラセンサのハードウェアの入手などに関するお問い合わせは下記連絡先までお願いします.
ハードウェアに関するお問合せ先:株式会社シーアイエス 営業担当
メールアドレス:newbiz@ciscorp.co.jp
電話番号:042-664-5568
11月20日に,World MoveIt Day 2019 in Tokyoが開催されました! 当日の様子を写真をたくさん載せながらレポートしたいと思います.参加できなかった方もWorld MoveIt Dayの雰囲気を感じていただけると幸いです.当日の実施したスケジュールをたどりながら記事にしたいと思います.
会場は株式会社オムロンサイニックエックス様のオフィスでした.オフィス玄関,エレベータ,会場などにTORK作成のWorld MoveIt Dayのポスターを貼って雰囲気を盛り上げました.
会場したときの写真です.オムロンサイニックエックス様のご提供の会場はおしゃれなオフィスでした.参加者みなさん,それぞれ開発の準備をしています.
TORKよる開会の挨拶がありました.1日の日程の説明を行いました.
早急に開会の挨拶を終了し,ハッカソン開始!みなさんそれぞれの課題を見つけ開発を行います.わからないことがあれば,スタッフに積極的に質問してくださったり,参加者同士で助け合ったりと良い雰囲気でした.
昼食はTORKの提供でした.ごはんをしっかり食べて午後からも頑張れそうです!!
お昼ごはんを食べながら,主催者によるスポンサープレゼンがありました.
オムロンサイニックエックスのフェリクスさんからのスポンサープレゼンが実施されました.オムロンサイニックエックスとしての活動,MoveItの開発スケジュールなどの説明がありました.
TORKから,TORKの会社説明,活動(セミナー,トレーニング教材の作成,MoveItへのコミット)などを説明しました.
午後もハッカソンが続きます.午後には事前に用意していたロボットを参加者さんが動かせるようになりました.そのときのトラブル事例などをシェアしたりと,開発者同士の積極的な交流がありました.またホワイトボードに今実施している内容(Issue番号なども)を書き出したりしました.
夕方17時から,今日一日の成果発表です.参加者皆さん,今日一日やったことを発表するスタイルでした.「私のやったことなんて…」みたいなことがなく,互いの成果を称え合うすばらしい時間だったと思います.たくさんの発表があったので,一部だけご紹介します.
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
MoveItプラグインで,ロボットの開始終了姿勢を指定するときにCurrentという設定があると思います.それに追加で,Previousを実装したという発表でした.これによって,プランニング実行後,更にプランニングを行う場合,以前の姿勢を目標姿勢に設定することができます.なんとこの成果はMoveItのマスターブランチにマージされました!!すばらしいです.
add “<previous>” robot state to RViz motion display #14
MoveItチュートリアルの日本語化を現在取り組んでいます.その一部を2名の方に手伝ってもらいました!ありがとうございます.
Japanese Translation #415
MoveItのプラグインは横幅のサイズが固定で.ディスプレイサイズが小さいとRvizを専有してしまいます.このIssueに取り組んでくださいました.
make MoveIt’s RViz display properly resizable #13
ロボットを持ち込んで参加してくださった方々もいらっしゃいました.xArmの動作デモを実施していただきました.xArmの実物を見たことがなかったので,新鮮でした!
本日はWorld MoveIt Day2019に参加してます.xArmというロボットを持参してます!#WMD2019 #ROS pic.twitter.com/xbyhz5d8Wu
— Connected Robotics Inc (@CROctoChef) 2019年11月20日
TORKからMoveItの新しいプランナであるTrajOptの説明を行いました.WMD当日時点では,TrajOptの機能はプルリクエストがあがっていますが,動作しなかったので,そのプルリクエストの内容のレビューを実施しました.WMDの時間内でなんとかプランニングを実行することまではできるようになりました.
Trajopt with no dependency to tesseract #1626
発表時間には多くの発表があり,この記事のボリュームの関係で紹介しきれなかったものもたくさんあります.発表してくださった方にはMoveItステッカーやTORK作成のMoveIt DayのTシャツをプレゼントさせていただきました.
集合写真もとりました.途中からの参加や,途中でお帰りになった方もいらっしゃいますが,定員で設定していた30名をお迎えすることができ非常によかったです.
閉会後スタッフとPanda,URのコラボ写真を撮影しました.
今年のWorld MoveIt Dayの日本開催では,Masterブランチへマージされるようなすばらしい成果を出してくださった参加者さんもいらっしゃいました.だんだんと日本でもMoveItを使う側から開発側に入り込めるように推進活動をしたいと思っています.参加者の皆さん,ありがとうございました! 今年参加してくださった方も,参加できなかった方も,来年お会いしましょう!
本記事はWorld MoveIt Day 2019 in Tokyo(WMD 2019 in Tokyo)へ参加するにあたり,MoveItで使用できるプランニングアルゴルリズムに関して解説します.
MoveItでは非常に多くのプランニングアルゴリズムが利用できます.プランニングアルゴリズムは理論や実装方法によって軌道の計算時間や軌道そのもののが大きく変わるため,ユーザにあまり意識させないような実装にMoveItは設計されているものの,実は非常に重要な要素です.しかしその豊富さが災いして,結局どのアルゴリズムがよいのかわからなくなっているのが現状です.そこでこの記事では現段階で実装されているアルゴリズムについて整理しようと思います.
アルゴリズム内部を理解していると,適用先のロボット,環境によってどのアルゴリズムが適しているかを判断しやすくなりますので,この記事を読んでアルゴリズムの理解を進めていきましょう.
本記事は World MoveIt Day 2019 in Tokyo(WMD 2019 in Tokyo)へ参加するにあたり,MoveItのソースコードを変更し,コミットするためのやり方を紹介します.
MoveItにはPull Requestを送るためのルールがあるので,これに沿ったやり方が出来るよう解説します.WMD 2019 in Tokyoへ参加しない方でも,MoveItを使う方なら参考になると思うので,是非ご覧ください!
なお,今回想定しているROSのバージョンは,ROS1 melodic
です. 続きを読む
MoveIt の利用者,開発者のための世界的なイベント World MoveIt Day 2019 (以下WMD 2019)のローカルイベントを,東京で開催します.
MoveItとは ROS コミュニティ が開発している,ロボットマニュピレータを対象としたROSの主要パッケージの一つで,障害物にぶつからないようなロボットアームの軌道を計画するモーションプランニングのソフトウェアパッケージです.WMD 2019 は,このMoveItの開発を世界中の人々で一気に推し進めようという開発者のためのイベントです.
和気あいあいと開発を行っていきたいと考えています.
実機 Panda Arm の用意をはじめ,開発中に詰まったポイントは随時ホワイトボードに書き出し,みんなで共有->わかる人がいれば一緒に解決する.というスタイルで開発していきます.
さらに昼食も無料ですし,閉会後も可能な時間まで開発を続けることもできます…!是非産業ロボット大国日本から一丸となってMoveItに貢献し,MoveItとロボットを楽しみましょう!!
初めてMoveItに触れる方におすすめの日本語教材が2つあります.
自分にあっている方を選んでまずはご覧ください.
はじめてMoveItに触れる方のために, ROS Industrial トレーニング教材(英語) が提供されています.しかし,これらは英語で書かれているため,日本語も欲しいところですよね!!
実はTORKでは以前にこのページを日本語化し,公開しています.MoveItの基本的な使い方,他のチュートリアルやマニュアルへのリンクなどがまとめられているので,まずはこちらをご覧ください.
また,2019年11月16〜17日には,日本ロボット学会(RSJ)の主催でMoveItとROSを用いたマニピュレータ制御に関するセミナーが開かれます.申し込み期限は2019年9月27日なので,是非参加されてみてください.
TORKからMoveItの日本語チュートリアルを無料で公開しています.是非ご覧ください.
どんなロボットを用いて開発をされても構いませんが,WMD 2019 では,Panda Arm の実機を用意しています.これは,Moveit!のチュートリアルで使用されているロボットです.
WMD 2019では,このチュートリアルの不備があれば公式リポジトリへIssueを出していただくことも推奨しています!!ただし英語のため,TORKにて部分的に日本語訳を行っていく予定です.
ここまでに登場したリンク以外にも,参考になるリンクをまとめて紹介しておきます.
MoveItが使えるようになったら,是非MoveItに貢献しましょう!WMD 2019もROS Industrial に貢献することが開催目的です!
といっても,何から始めたら良いかわからないですよね…
実は公式ページからそのガイドラインが出ています.このページの”Finding Where You Can Help” と書かれてる箇所に具体的に載っています.内容は下記のとおりです.
上記の中からとくに,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)
記事の更新情報は随時公開していきます.是非RSS等登録頂き,チェックしてください!
春ですね!春は新しく勉強をはじめる方も多いと思います.
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 柏の葉が始まりました! ハッカソンでの課題の例についての説明などがありました.
次に,会場にロボットを展示していただいた企業の方からロボットのご紹介がありました.
皆さんもくもくと作業されています.実機でプログラムを試す方もいらっしゃいました.
午前中はお疲れ様でした!お昼ご飯の時間です.
お昼ご飯を食べながらの,参加者による発表が始まりました.
WRS2018製品組立チャレンジ参加報告とオムロンサイニックエックス株式会社のご紹介をしてくださいました.
MoveIt!の新機能,Task Constructorについてご紹介してくださいました.これにより,今までできなかった,物を掴みながら移動するといった,並列タスクが可能になるそうです.
SEED-noidの実用例を,コンビニを舞台にした競技会やレストランでの実証実験のお話などを通してご紹介くださいました.
MoveIt!でロボットを動かす際,各関節の角度を知りたい時に便利なツールのご紹介です.
発表が終わったら,ハッカソンの再開です.
お疲れ様でした!ハッカソン終了です.今日一日何に取り組んだか,発表し合います.
次回参加時の参考になる取り組みがたくさんありますね!
参加者の皆さま,ありがとうございました! 来年もお会いしましょう!
今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!
初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.
出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!
初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.
出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!
初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.
出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
今回も有楽町にてROSワークショップ初級編を開催しました.
ご参加いただいた皆様,お疲れ様でした!
初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.
出張ワークショップ,プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
前回は低価格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メッセージに変換することができます.
同じ場所でデータを可視化してみました.
RPLIDAR A2はデフォルトの設定で部屋の形がよく分かります.ロボットの地図生成や自律移動に充分使えることも確認しています.
一方のSweepですが,デフォルトの状態で同じ10Hzで回転させた時のデータがこちらです.
うーん,やはり同じ速度だとSweepの粗さが目立ちますが,しかし,なんだかさすがに解像度が低すぎないかな?
と思ってチェックしたら,sweep_rosノードのデフォルトのサンプルレートが500Hzで最大仕様(1kHz)の半分になっていることに気づきました.うーんこれはデフォルトで最大性能が出るようにしておいてもらいたいところですが,サンプルレートのパラメータsample_rate
を1000に設定して,もう一度データをとってみました.
だいぶ詳細度が上がりました.しかし,RPLIDAR A2に比べると,部屋の形状がかなり分かりにくいですね.
そのまま,スキャン速度を3Hzに落としてみます.
このくらいなら部屋の形が分かりますね.回転速度が下がった分,RPLIDAR A2よりも更新周期が3倍程度長くなっています.
次は,動画でデータを比べてみましょう.
今回も有楽町にてROSワークショップ初級編を開催しました.
初めてでLinux環境を準備できなくてもLiveUSBを使って完遂できました.お疲れ様でした!
初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
今回も有楽町にてROSワークショップ初級編を開催しました.
準備万端でご参加いただきサクサクと進みました.お疲れ様でした!
初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
前回までにルンバ,ラズベリーパイ,モバイルバッテリ,そしてレーザー距離センサといったRoomblockの部品を紹介しました.これらをルンバの上に載せるための,3Dプリンタで出力できる構造材を紹介します.
棚のような構造で,1番下の段にモバイルバッテリ,2番目の段にラズベリーパイ,1番上の段にRPLIDAR A2を載せます.動作中にモバイルバッテリが落ちてしまうことがあるので,1番下の段にはバッテリー固定用のベルトがつけられるようになっています.
部品をブロックのように交換したり追加したりして,機能を拡張することを狙っているので,”Roomblock”と名付けました.安直ですね.ラズベリーパイ用のボードカメラを固定するための部品も追加しました.
ルンバとフレーム部分はベルクロテープで固定されているので,取り外しも簡単です.
この構造材は,比較的安価な3Dプリンタでも出力できるサイズで設計されています.確認には UP! plus2を使いましたが,ワークエリアが15cm x 15cm程度の3Dプリンタであれば,大抵の機種で出力できると思います.3Dデータ(STLファイル)は,Thingiverseからダウンロードすることができます.
Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.
本日2017年8月8日,おかげさまで TORK は設立4周年を迎えました.
皆様,いつもありがとうございます!
これからも,お客様のご要望に応え,産業・学術界でのオープンソースロボティクスの進展に寄与できるよう,より一層努力して参ります.
—
今回も有楽町にてROSワークショップ初級編を開催しました.
小さな疑問点にも都度お答えしながらの密度の高いワークショップとなりました.お疲れ様でした!
初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
今回も有楽町の会議室にてROSワークショップ初級編を開催しました.
参加者の方が検討中のシステムについてのご相談もお受けしました.お疲れ様でした!
初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
iPhoneのAppStoreやAndroidのGooglePlayのようなアプリのマーケットインフラを,ロボットの世界にも導入するためにはどのような課題があるでしょうか?ROSはその開発当初から「Robot App Store」を視野に入れてきていますが,まだ実現していません.
その中で,最近のUbuntu Snappy Coreと呼ばれる仕組みの登場は,Robot App Storeの開設に大きく貢献するのではないかと思われます.
今後,数回に分けて,Ubuntu Snappy CoreとROSについて書いていきたいと思います.
ROSがメインのベース・オペレーティング・システムとしているUbuntuは,年に2回のRegularリリースがあり,そのサポート期間は9ヶ月です.また,2年おきにLTS(Long Term Support)と呼ばれるリリースがあり,サポート期間は5年です.実用を求める人は安定なLTSを使いつつ,最新技術の取り入れや新規開発はRegularリリースを使う,というサイクルが続いています.
しかし,Ubuntuが対象とするデバイスは,デスクトップPCやサーバだけでなく,IoTやルータなどのエッジデバイスにも広がりつつあります.残念ながらUbuntu Phoneはついに陽の目を見ないことになるようですが…
これらのデバイスでは,セキュリティの観点から,Ubuntuのような同期的なものではなく,もっと不定期かつ細かい間隔の継続的なアップデートが欠かせません.また,耐障害性,たとえば不具合を含むソフトウェアが配信された際にロールバックする,などの機能が必要になります.
これらの要求に対して,Ubuntuでは,IoTやエッジデバイス向けに,(Snappy) Ubuntu Coreと呼ばれる仕組みが開発されています.
これは,OSとデバイスドライバの分離,またカーネルとアプリケーションを分離して,それぞれを独立に,細かい周期でアップデートできるような仕組みにしよう,というものです.
ロボットもまたIoTやエッジデバイスの一種と見ることができるため,今後ROSでも,このSnappyなパッケージシステムが主流になる可能性があります.また,ROSのリリースシステムも,ほころびが目立つようになってきています.
これまでROSはUbuntuと同様に,同期的なリリースを行ってきました.しかし,1年に1回のリリースでは,日進月歩の技術を取り入れるのに遅れが大きすぎる気もします.一方で,ROSを業務に使用する場合には,動作させることが優先され,頻繁にアップデートしない(できない)ようになってしまいがちです.
また,ROSのパッケージは,たくさんの外部ライブラリに依存しています.外部ライブラリのAPIが変更になるたびに,ROSのパッケージもそれに対応させる必要があります.仕様が変わる場合には,パッケージを対応させた上に動作確認も必要です.
そのため,リリースされるたびに,リリースから外れていくパッケージが多くなってきました.必要だしよく使われるパッケージであるにもかかわらず,リリースのために修正が必要だけど修正作業を行うメンテナがいない,という理由でリリースされなかったり,リリースが遅れたりするケースもあります.
もしROSを搭載したロボット製品を販売しようと考えた場合,UbuntuやROSが更新されたタイミングで,どのような仕様変更や不具合が混入するかわからず,それに対応するには膨大なリソースが必要であることが予想されます.
以上のようなことから,今後はSnappyなROSシステムが主流になるのではないかと,勝手ながら予想しています.
Canonicalにお勤めのロボットエンジニアの方(Kyle Fazzari氏)が精力的に情報発信をしているのも頼もしいです.4月に公開された以下の一連のブログと動画も必見です.
前回はルンバと通信するための計算機として用いているラズベリーパイについて紹介しました.今回は,自律移動のためのキーパーツである,レーザ距離センサについて紹介します.レーザースキャナ,LIDAR(Laser Imaging Detection And Ranging)とも呼ばれます.
弱いレーザービームを発光し,物体への反射光を計測して,その時間差により物体までの距離を測ります.計測部分を回転させながら計測(スキャン)すれば,平面内の物体までの距離が計測できます.レーザービームを複数並べたり,細かく向きを変える機構を使うことで,平面内だけでなく3次元的な計測点が得られる3次元レーザ距離センサもあります.
一般的にレーザー距離センサは,2次元のものでも数十万円していたので,そう手軽に使えるものではありませんでした.しかしRoomblockで使っている SlamTech社のRPLIDAR A2 は,なんと5万円程度と破格なのです.
RPLIDAR用のROSドライバが公開されています.
$ sudo apt install ros-kinetic-rplidar-ros
として,
$ roslaunch rplidar_ros view_rplidar.launch
とするだけで,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で公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.
前回はルンバと通信するためのROIコネクタについて紹介しました.今回はルンバと通信するための計算機として用いている,ラズベリーパイ(Raspberry Pi)について書きます.
ラズベリーパイについては改めて言うまでもないかもしれませんが,低価格なARM搭載のボードコンピュータです.Roomblockで用いているのはラズベリーパイ2です.通常のPCと同じように,Ubuntuをインストールしたあと,ROSをインストールすることができます.
Raspberry Pi 2
ルンバのROIコネクタとラズベリーパイは,USB-シリアル変換器を使って接続します.変換器を内蔵したケーブル(秋月電子で購入できます)を使うと,ミニDINコネクタとはんだ付けするだけで写真のようなケーブルが出来上がります.Roomblockで唯一のはんだ付けが必要な部品ですが,3,4箇所をはんだ付けするだけなのでそれほど難しくないと思います.
ラズベリーパイの電源はどうしましょうか?ルンバのROIポートにも電源が出ているのですが,これはルンバのバッテリの電圧がそのまま出ているので,使う場合には電圧の変換が必要になってしまいます.Roomblockでは市販のUSBモバイルバッテリーを別電源として使用することにしました.10000mAのものが3000円程度で購入できる,良い時代になりました…これでラズベリーパイを数時間は動作させることができます.
今回はここまでです.次はレーザースキャナについて紹介します.
Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.
前回紹介したRoomblockに使えるルンバは,500, 600, 700, 800 シリーズと呼ばれるものです.これらの機種は,外部と通信するためのシリアルポートを備えています.ただし,現在の最上位機種のルンバ900シリーズは,画像による地図生成までできるすごいものですが,シリアルポートを備えていないのでRoomblockのベースとしては使用できないので注意してください.
ところでそのシリアルポートはルンバのどこにあるのでしょう?シリーズにより位置が異なります.500シリーズ,600シリーズは,上面のカバーを外さなければなりません.このカバーは4か所のツメで固定されていて,最初は少し硬いので外すのに力が必要です.ケガや破損に十分注意してください.
700シリーズ,800シリーズは,ルンバ上面の取っ手の下にROIコネクタがあります.カバーを外す必要はなく,取っ手を持ち上げるだけでアクセスできます.
Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.
名城大学構内で実験させていただいたデータから,ROSの地図生成パッケージで地図を生成してみました.データはROSのbagファイルとして取得したので,同じデータに対して異なる地図生成パッケージを適用することが可能です.
ROSの地図生成のパッケージとして,
の4つのパッケージを用います.
これまで家屋や廊下など,比較的狭い環境で地図を作ってきました.それらの環境ではどの地図生成パッケージも,(誤差はともかくとして),自律移動に使えないような大きく矛盾する地図を作成することはありませんでした.狭い部屋では,基本的にレーザセンサのデータをずっとつなぎ合わせ続けることで,部屋の地図を作ることが可能です.
しかし,今回のデータは非常に大きな建物の長方形の廊下を一周したものです.廊下を一周回って元の場所に戻ってきた時,それが元の場所であることを認識せず,そのままレーザセンサのデータをつなぎ合わせていくと,最初に作った地図と矛盾したものを上書きし続けてしまいます.これを避けるためには,現在居る場所が以前来たことのある場所であると認識した上で,地図全体を辻褄があうように生成しなければなりません.これは”loop closure”と呼ばれ,地図生成では非常に難しい問題です.
以下の動画は,4つのパッケージで地図を生成した結果をまとめたものです.地図のグリッドサイズは5cmとし,各パッケージのパラメータのほとんどはパッケージの規定値のままで,一部のパラメータのみ少し調整しました.
gmappingは非常に健闘しました.途中の廊下は真っ直ぐになっておらず,地図の形は後半にかけて不正確になっています.これはルンバのあまり正確でないオドメトリを少し信頼しすぎているようです.しかし,一周回ってきた最後に注目してください.以前来たことのある場所だと認識し,辻褄があうように地図全体を変形させました.矛盾のない,ほぼ正しい地図が出来上がりました.
slam_kartoは,今回はloop closureの検出に失敗してしまいました.一周回ってきた後,最初に作った地図を破壊しながら,新しい地図を上書きしていきます.矛盾した地図となってしまいました.
hector_mappingには,じつはloop closureの機能がありません.また,車輪の回転速度(オドメトリ)を使っていません.そのため,この環境ではうまく地図を作ることはできませんでした.
Google cartographerは最後発で,しかもこのような大規模環境の地図を作るために開発されたアルゴリズムです.やはりループを正しく閉じることに成功しました.
最終的に生成された地図(左から,gmapping, slam_karto, hector_slam, cartographer)
以上の結果は,どのパッケージやアルゴリズムが優れているか,どのパッケージを選ぶべきかということを示すものではないことに注意してください.今回,パラメータはほとんどチューニングしなかったので,それぞれのパッケージの最高の性能が出ているわけではありません.また,それぞれのアルゴリズムには得意不得意があるので,課題に対してどれが良いかは,実際に試してみないと分からないことが多いはずです.
現在のところROSはこのような様々な地図生成パッケージを比較検討できる唯一のプラットフォームです.オープンソースの利点を活かし,ぜひご自分の手で確かめてみることをお勧めします.
TORKでは,自律移動編を含むROS初級,中級のワークショップ,企業や大学でのプライベートワークショップのご依頼も承っております.お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
弊社のROS中級ワークショップ・自律移動編では,ルンバをベースとした自律移動ロボット”Roomblock”を教材として使用しています.不定期なエントリとして,このRoomblockの内容を紹介していきます.
まず,Roomblockは車輪移動台車として,iRobot社のお掃除ロボット,ルンバ(Roomba)を使用しています.驚かれる方もいるかもしれませんが,ルンバは実は通信用のシリアルポートを持っていて,パソコン等から操作したりセンサ情報を取得することが可能なのです.ルンバのこの機能は,発売当初から一部のエンジニアやホビイストの間で話題になり,ルンバを操作して楽しむ”Roomba Hacking”がブームとなったほどです.ROSが登場するよりもずっと前の話です.
もう壊れてしまいましたが,2007年に私が初めて購入したRoombaです
iRobot社からは,”iRobot Create”という,掃除機能を省いた教育向けのルンバが発売されていたこともありました.ROSでも初期のTurtlebotプラットフォームは,このCreateをベースにしていました.現在はiRobot Createの販売は終了しており,TurtlebotもKobukiを用いたTurtlebot2, そしてRobotis社による独自プラットフォームTurtlebot3へと進化しています.
そんな中,なぜ今お掃除ロボット,ルンバを教材のベースとしたのでしょうか?3つ理由があります.
1つめは,ロボットの全体の価格をできるだけ抑えるためです.発売当初は割高に感じたルンバも,普及が進み今では3万円台から手に入るようになっています.屋内での自律移動に適したサイズ,車輪,センサなどを備えたロボットとしては破格です.
2つめは,ROSのパッケージがすでに存在していることです.それらを利用して,自律移動技術の本来的な目的である,地図生成や経路計画のソフトウェアの学習をすぐに始めることができます.
3つめは,ルンバが掃除をしてくれるからです…当たり前ですね.しかし,余暇にロボティクスを勉強したいエンジニアが,家族に「自律移動ができる10万円のロボットを買いたい」と言って納得してもらえるでしょうか?「ルンバなら掃除もしてくれるよ!」というとみんな喜んでくれます.
最近では「ルンバ対応」のリビングチェアなるものまであります
おっと,つい話が長くなってしまいました.私ルンバが大好きなもので….今回はここまでです.
Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.
ROS初級と中級・自律移動編を受講頂いた名城大学メカトロニクス工学科様のご好意で,自律移動ロボット”Roomblock”のデモンストレーションをさせていただきました.
ものの数分で部屋の地図を作った後,障害物を避けながら自律的に移動するロボットに,学生さんたちも興味津々でした.
TORKでは,自律移動編を含むROS初級,中級のワークショップ,企業や大学でのプライベートワークショップのご依頼も承っております.お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
ROS の動作計画ライブラリ MoveIt! が,5周年を記念してアプリケーション例のビデオを公開しました.
MoveIt! チームがこのようなビデオを公開するのは4年前・2013年に次いで2度目ですが,ソフトウェア公開間もなかった当時と比べ,だいぶ Pick&Place,物を掴んで目的地に設置するというタスクが多く,技術の進展が窺えます.個人的には MoveIt! の課題領域としても挙げられている台車,水中ローバ等の移動体に取り付けられたアームの制御例が数件含まれ,既に実現されてるのかも気になります (このページの “Mobile base integration”).
また弊社がその opensource 版ソフトウェアのメンテナンスに積極的に関わり,サポートサービスも提供させて頂いているカワダロボティクス社製 NEXTAGE OPEN も登場します.弊社ブログ上でもお馴染み?の Spain のシステムインテグレータ・Tecnalia 社が手がける Airbus 向けアプリと思われます.
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
2017年6月初のパッケージ更新により MoveIt! が更新され,これまで要望のあった軌道の目視確認機能が追加されました.
これまでは,生成させた経路を確認するには,RViz 上で “Loop Animation” をオンにして経路を反復再生させる手があったかと思います.この方法だと経路の途中の任意の経由点で止めることはできませんでした.
今回追加された機能を使うと,RViz 上でスライダを移動することにより,軌道の経由点を静止した状態で目視確認できます.
本機能を有効にする方法はチュートリアルを参照下さい.
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
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
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に関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
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!
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に関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
プライベートワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
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ワークショップ初級編
場所は都内・本郷のミーティングスペースでの実施を予定しています.
中級編についてはご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページをご参照ください)
お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.
日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp
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ワークショップ中級・マニピュレーション編を開催しました.
長時間の講習お疲れ様でした.ご依頼いただきありがとうございました.
プライベートワークショップ,出張ワークショップ,カスタマイズワークショップ,その他ご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
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!
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.
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!.
皆様,2016年お世話になりました.また,特にロボティクス関連のオープソースへご協力頂いた皆様,ありがとうございました.
皆様のご貢献への感謝として,ささやかではありますが以下の写真にあるROS初級編資料やROS対応LiveUSBをプレゼントする企画を実施します.
2016年中に皆様自身が行った,
など,オープンソースへの貢献についてリンクを頂いた皆様に,何らかのプレゼントを送付させていただく予定です.是非ご応募下さい.また,質問等されていない方は,ぜひ今からでも間に合いますので,ML等へのご質問をしていただければと思います.
まだオープンソースに貢献できていないけれどどうしても今プレゼントがほしい方も,アンケートにお答えいただければ数がある限り対応いたします.是非アンケートに回答して応募してみてください!
プレゼントは要らないけれどアンケートに答えたい方も大歓迎です!
締め切りは2017年1月10日(火)です.
ご応募お待ちしております!
応募アンケートリンク
※応募多数の場合は抽選になります.ご容赦くださいませ.
弊社の情報発信はこのblogとFacebook,twitterアカウントがあります.
FBにいいね!やtwitter投稿のリツイートもお待ちしております!
トヨタ自動車株式会社 (以降トヨタ) 様 の生活支援ロボット “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.
本セミナ期間中は,プログラムを実行しても動かないだとか,実装の方法が分からないといった問題に当たったら,問題解決を自分だけで行うのではなく,コミュニティに質問し意見を伺いながら進めるよう提案しました.質問文を作成すること自体慣れないと時間が取られますし,技術者として他人に質問するのも,研究室ごとの質問に関する文化もあってか,勇気がいることでしょう.最初は中々質問が出ないこともありましたが,トヨタ様はじめ積極的な回答者の適切な回答のおかげもあり,質問するメリットを感じて頂けたかと思います.何より,セミナ実施後は実施前に比べ開発者コミュニティでの情報の流通量が大きく増えました.
またセミナ中,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).
最後に幾つか,各セミナ回の最後に行ったコーディングチャレンジの動画をご紹介して終わります.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.
メール,掲示板での質問の仕方の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.
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ワークショップ初級編
場所は都内・本郷のミーティングスペースでの実施を予定しています.
中級編についてはご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.
お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.
日程の調整,その他ご相談,企業内ワークショップ,カスタマイズワークショップも承っております.お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp
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 がやっとリリースされ,ここで取り上げている機能が使えるようになりました.記事先行してしまいお待たせしていたら失礼しました.
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
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/
便利ですね!
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
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
ROS が普及したことで,ロボット開発者の間である種の共通言語となりつつあると言っても過言ではありません.既に多くのロボットの可動実績があり,ユーザ数は10万人を超えるとも言われ (2015年 ROSCon より),ロボットのシステム構築において着実に情報が蓄積されており,それを元に更に益々ユーザ層が厚くなるといった良い循環ができています.
とはいえロボット毎のハードウェアの違いを基にした差異は避けられないもの.同じロボットを扱う開発者間の情報は貴重でしょう.
弊社がソフトウェアのメンテナンスを中心となって行わせて頂いている NEXTAGE Open (カワダロボティクス社) も世界中にユーザがおり,私達も情報共有に微力ながら貢献しています.NEXTAGE Open の ROS 版ソフトウェアの利用に際して,議論はメーリングリストへ,御質問は github へどうぞ.
[github-issues username=”tork-a” repository=”rtmros_nextage” limit=”10″]
表.github 上で議論中のチケット一覧
今日は,先日もお伝えしたシンガポールの 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.
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倍超のペースでお問合せ頂いていることとなります.
コンサルティングサービスの内容は,既存のオープンソースロボットに関するもの (Baxter,Turtlebot,Fetch 等),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 (beginners,intermediate 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.
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に関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
プライベートワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
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.
Image: Part of the robot list. Robots we (TORK) maintain the ROS packages (NEXTAGE Open, Denso etc.) are there too.
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
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
その他,こういった企画を実施して欲しい等,TORKにやってもらいたいことのご意見ご要望もお待ちしております!
メール以外にもfacebookやtwitterアカウントもございますのでそちらにメッセージ,リプライにてご意見いただくことも可能です.
お気軽にお問い合わせください.
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に関するお困りごとだけでなく,社内で運用していく際の疑問点等にも随時お答えしています.
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
以下日程で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
ROS の動作計画アプリ MoveIt! を使った開発を行っている方々の中には,MoveIt! のバイナリ提供は更新が滞ってるから仕方なくソースコードをコンパイル (そしてコンパイルエラーと格闘) して時間を費やしてしまっている方もいるのではないでしょうか.ご安心下さい.最近メンテナンスチームが刷新されソフトウェアの更新が再び活発になってきており,今年に入って既にバイナリは3回更新されました.TORK もメンテナンスに積極的に貢献しています.
当協会のブログでも最近何度か MoveIt! の利用法についてご紹介してきました ([1],[2]).今回も新機能のご紹介です.今日紹介するのはジョイスティックから MoveIt! を制御する方法です.ロボットの動作生成・実行が,今までのように Rviz 上でマウスを使うことなく,ジョイスティックで可能になりました.
使い方は簡単.ジョイスティックが刺さったマシン上で,図のように 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!
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.)
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?).
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ワークショップ中級・マニピュレーション編を開催しました.
本郷のオープンスペースはコーヒーが一日中無料です!
本日の参加者の方は初級編の機材一式を購入し完璧に復習してから中級・マニピュレーション編にご参加いただきました.
「いつも新しい知識を得られるので中級編も参加できてよかったです」とのコメントをいただきました.
長時間の講習お疲れ様でした.ありがとうございました.
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
プライベートワークショップ,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp
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
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
お申込みお問い合わせお待ちしております!
ユーザからの報告により 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:
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!
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.
カワダロボティクス社製の双腕ロボット NEXTAGE Open (/ Hironx) の力センサを用いた実時間制御は以前のブログ記事でお伝えしました.当時の例で用いていた JR3 力センサは日本国内では販売が終了 (*1) していますが,今回日本国産,ワコーテック社の Dynpick センサに対応しました.
実装上の留意点が幾つかあります:
FAQs:
なお本件に関わるソースコードの公開は,株式会社豊田中央研究所様の御厚意により実現しています.
*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.
To implement the necessary changes, a few thiings to be noted:
FAQs:
The opensource contribution of this project was realized thanks to Toyota Central R&D Labs., Inc..
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を社内に導入する際のお困りごとにもお答えしています.
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
プライベートワークショップ,出張ワークショップ,カスタマイズワークショップも承っております.
詳細はWebページをご覧いただくか,メールにてお気軽にお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp
ロボットを扱う上で必要な機能がたくさん収められている ROS の中でも,経路計画用ライブラリ MoveIt! は代表的なツールの1つです.
腕をはじめとして,ロボットの体の部位は我々人間のそれと同じように,複数の関節からなりますが,それらを直感的に操作できるようにするためのプログラミング・インタフェイスを備えています.
その機能は当社がソフトウェアのサポートを行っているカワダロボティクス社製双腕ロボット NEXTAGE Open でもフルに活用可能です (既に MoveIt! を用いて NEXTAGE Open を動作させているユーザ様事例がこのページに掲載しております).
MoveIt! を利用してプログラミングを行う際のサンプルの拡充も続けてまいります.既存のユーザ様からよくいただく質問として,”hrpsys ( / OpenRTM) 経由でのプログラミング方法はわかったが,ROS でプログラムを書く方法がわからない” というものがあります.これに応えるために ROS_Client と呼ばれる NEXTAGE Open 専用の ROS クライアントクラスを用意しました.使い方はこちらの wiki をご覧ください.ご不明点などは github 上で聞いていただくと,当社かユーザグループのどなたか 😉 から返信が入ると思います.
また,MoveIt! 自体のメンテナンスにも TORK は積極的に参加しており,最新の機能やバグフィックスの利用を開発者ができるだけ手軽に利用することができるよう貢献しています.
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.
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搭載のものをおすすめします.
ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.
プライベートワークショップ,出張ワークショップ,カスタマイズワークショップも承っております.
詳細はWebページをご覧いただくか,メールにてお気軽にお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp
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を初めて勉強する人へのブログも公開しています. ご参考になさってください.
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.
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
お申込みお問い合わせお待ちしております!
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
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
以下日程で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
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
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
お申込みお問い合わせお待ちしております!
We also had ROS Workshop at Yushima, 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等でワークショップを体験できます.
本日も全員が最後まで完遂しました.お疲れ様でした!
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!!
今回も湯島のミーティングスペースにてROSワークショップ初級編を開催しました!
初級編ではLeap Motionを使います.Leap MotionはROSのパッケージがあり,ワークショップではソースコードをダウンロードして使います.
Leap Motionに初めて触れる方は,自分の手の動きに連動するVisualizerに感激されます.
本日も順調に進んで最後まで完遂しました.お疲れ様でした!
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!!
本日は某企業様のセミナールームをお借りして,企業内でのプライベートROSワークショップを開催いたしました.
市販のROS日本語本に沿って事前にROSをインストールしてご参加いただきました.
活発に質問もいただき時間を延長してのワークショップとなりました.ご依頼いただきありがとうございました.
出張ワークショップ,カスタマイズワークショップも承っております.
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp
お申込みお問い合わせお待ちしております!
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!!
今回も湯島のミーティングスペースにてROSセミナー初級編を開催しました!
今日の参加者の方は事前のご自分のマシンにROS indigoのインストールまで完了した状態でご参加くださいました.
お疲れ様でした!
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ワークショップ中級・マニピュレーション編を開催しました.
今日の参加者は皆vi使いの方でした.(私はemacs派です!)
弊社のLiveUSBを使うことでマシン環境を変更することなくワークショップを体験することができます.
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp
長時間の講習お疲れ様でした.ありがとうございました.
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月16日,30日,2月6日と,三回にわたって相模原ロボット導入支援センター様および玉川大学岡田研究室にてロボット制御用オープンソース講習会を開催しました.
内容は以下の三回構成.地域の経営者,技術者の皆さんにオープンソースのロボット制御方法を学んでいただきました.玉川大学の岡田研究室の学生の皆さんに運営サポートで参加していただき大変助かりました.ご参加いただいた皆様,運営の皆様,玉川大学岡田先生と学生の皆さん,お疲れ様でした.ありがとうございました!
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!!
今回も湯島のミーティングスペースにてROSセミナー初級編を開催しました!
弊社のLiveUSBを使って参加予定の方でしたが,帰ってから復習したいとのことでその場でご自分のUSBにisoを焼きこんで再スタート.
Ubuntuは初めてと仰っていましたが,vi使いの方でした.サクサクと課題が進みました.
お疲れ様でした!
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.
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!!
今回も湯島のミーティングスペースにてROSワークショップ初級編を開催しました.
初級編の最後の章はMoveit!のインストールと操作体験です.
ROSを初めて学習される方に最適なワークショップとなっております.
Linux環境が準備出来ない方もLiveUSBにてハンズオン講習を体験することができます.
2-3月のワークショップ日程も公開中です.
https://opensource-robotics.tokyo.jp/?p=1364
詳細はWebページをご覧いただくか,メールにてお問い合わせ下さい.
info[at]opensource-robotics.tokyo.jp
お申込みお問い合わせお待ちしております!
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年も引き続きワークショップを開催いたします.お申込みお待ちしております!