5
1

More than 3 years have passed since last update.

VS-RC003を搭載した"KUMACO"をROSで動かす(中編)「VS-RC003を制御するROSノード」

Last updated at Posted at 2019-12-16

概要

VS-RC003というVstone社のロボット用制御ボードを搭載したロボットをROSと接続して利用するお話を投稿させていただきます。
課題としては、"KUMACO(クマコ)"という名前のぬいぐるみ型のホビーロボットを用いて、"いないいないバァ(顔が見えたら喜ぶ)"させたいと思います。

完成形はこんな感じです。

前回は、ハードウェアとして、KUMACOがPCと繋がりました。
今回は、ROSノードとしてKUMACOをコントロールするお話です。

環境

この記事は以下の環境で動いています。

項目
CPU Core i7-9750H
Ubuntu 18.04
ROS Melodic

インストール

ROSのインストール

まずはROSをインストールしましょう。
こちら"ROS講座02 インストール"の記事がとても参考になります。

ros2vsrcパッケージインストール

つぎに、ROSからVS-RC003をシリアル経由で制御するROSパッケージros2vsrcをインストールします。
(頑張って作ってみました。)

$ cd ~/catkin_ws/src
$ git clone https://github.com/dreamdrive/ros2vsrc.git
$ cd ..
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash

以上でインストール完了です。

ros2vsrc/vsrc_connectの起動方法

使い方ですが、1つめのターミナルでROSMASTERを起動します。

$ roscore

2つめのターミナルで、vsrc_connectノードを起動します。
_serialdevに、デバイスファイルのパスを指定してください。

$ rosrun ros2vsrc vsrc_connect _serialdev:=/dev/ttyUSB0

これで、ROSとVS-RC003が繋がりました。

ros2vsrc/vsrc_connectの使い方

ros2vsrc/vsrc_connectで使えるメッセージトピックは下記の通りです。

  • ros2vsrc/VsrcState (オリジナルメッセージ) (VS-RC003 -> ROS)
    VS-RC003から読み取ったCPUの状態を配信するトピックです。

    • r_torque (bool) : 変数(251)から読み出した現在のサーボトルクの状態(ON/OFF)
    • r_mode (int32) : 変数(238)から読み出したCPUボードのモード
    • r_map (int32) : 変数(248)から読み出したマップ番号
    • r_idle (bool) : 変数(253)から読み出したアイドル中のフラグ(モーション再生中かどうか)
    • r_ctltype (int32) : 変数(240)から読み出したコントローラーの種類
  • ros2vsrc/VsrcControl (オリジナルメッセージ) (ROS -> VS-RC003)
    VS-RC003に対して、仮想のVS-C1(コントローラー)の状態を配信するトピックです。

    • w_torque (bool) : トルクON/OFFの指示
    • s_ry (int32) : 仮想コントローラー右スティック上下
    • s_rx (int32) : 仮想コントローラー右スティック左右
    • s_ly (int32) : 仮想コントローラー左スティック上下
    • s_lx (int32) : 仮想コントローラー左スティック左右
    • b_up (bool) : 仮想コントローラー十字キー上
    • b_triangle (bool) : 仮想コントローラー△ボタン
    • b_start (bool) : 仮想コントローラーSTARTボタン
    • b_square (bool) : 仮想コントローラー□ボタン
    • b_select (bool) : 仮想コントローラーSELECTボタン
    • b_right (bool) : 仮想コントローラー十字キー
    • b_R3 (bool) : 仮想コントローラーR3ボタン
    • b_R2 (bool) : 仮想コントローラーR2ボタン
    • b_R1 (bool) : 仮想コントローラーR1ボタン
    • b_left (bool) : 仮想コントローラー十字キー左
    • b_L3 (bool) : 仮想コントローラーL3ボタン
    • b_L2 (bool) : 仮想コントローラーL2ボタン
    • b_L1 (bool) : 仮想コントローラーL1ボタン
    • b_down (bool) : 仮想コントローラー十字キー下
    • b_cross (bool) : 仮想コントローラー×ボタン
    • b_circle (bool) : 仮想コントローラー○ボタン
  • sensor_msgs/BatteryState
    VS-RC003から読み取ったバッテリーの電圧を配信するトピックです。

    • voltage (float32) : 電源電圧(V)

以上、3つのトピックを使って、VS-RC003を制御します。

試しに、トピックを送ってKUMACOを動かしてみます。
まず、w_torqueに1を書き込むとロボットの全身のサーボがトルクオンになります。

$ rostopic pub /vsrc_control ros2vsrc/VsrcControl "w_torque: 1"

b_R3に1を書き込むと、R3が押された状態になり、前編で作成した「やったぁ.txt」モーションが実行されます。

$ rostopic pub /vsrc_control ros2vsrc/VsrcControl "b_R3: 1"

b_R3に0を書き込むと、ボタンを離した状態になり、アイドルモーションに戻ります。

$ rostopic pub /vsrc_control ros2vsrc/VsrcControl "b_R3: 0"

w_torqueに0を書き込むと脱力します。

$ rostopic pub /vsrc_control ros2vsrc/VsrcControl "w_torque: 0"

また、battery_stateを購読すると現在の電圧が取得できます。

$ rostopic echo /battery_state/voltage
7.39499998093
---
7.39499998093
---
7.39499998093
---
...

ros2vsrc/vsrc_connectで何をやってるの?

VS-RC003は、内部はメモリマップで変数が管理されており、もともと外部のシリアルポートを用いて、メモリを書き換える機能が備わっています。
データのやりとりはアスキーコードで行われるため、そのまま人間が見てわかるようなプロトコルになっています。

たとえば、VS-RC003のメモリ情報をPCに読み込む場合はこんな感じです。

メモリマップ2009eaのデータを5バイトを読み出す
Send   : r 2009ea 05[¥r][¥n]
Return : r 2009ea 05[¥r][¥n]#2009ea 00 00 00 00 00

メモリマップでは1アドレスが2byteで、一度に16byte読み込めるため、最大8アドレス分の読み出しが可能です。
また、メモリに書き込む場合は、こんな感じです。

メモリマップ2009f6に1を書き込む(サーボモータON)
Send   : w 2009f6 01 00[¥r][¥n]
Return : w 2009f6 01 00[¥r][¥n]

これらを利用して、ros2vsrc/vsrc_connectでは必要なメモリマップだけを抽出し、ROSメッセージとメモリマップをゲートウェイする役割を担っています。

VS-RC003のシリアル通信については、こちらのvstone公式資料をご覧ください。
また、アドレス一覧はこちらです。


これで、仮想コントローラーから、KUMACOのモーションを再生するところまで、完成しました。
次はいよいよROSのリソースを用いて、KUMACOをROSの世界で制御したいと思います。

参考

一連の記事へのリンク

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1