
Petoi Bittle 入門 (12) - ROSとRaspberry PiによるBittleの遠隔操作
以下の記事を参考に書いてます。
・Bittle Teleoperation with ROS and Raspberry Pi
前回
1. はじめに
この記事では、「ROS Melodic」を使用して、現在「Kickstarter」にあるPetoiのロボット犬「Bittle」の遠隔操作を行います。
「Bittle」を購入する予定がなくても、「ROS」がロボットと対話して動きを制御するための、カスタムドライバーを作成する方法についての情報を探している場合は、この記事が役立つ可能性があります。
2. ROSを使用したロボットの遠隔操作
エンジニアリングには、問題を解決する方法が複数あります。「ROSを使用したロボット遠隔操作」の場合、移動制御用のROSノードをマイクロコントローラーで直接実行するか、シングルボードコンピュータでROSノードを実行できます。ノードは、ビデオフィードと移動コマンドをマイクロコントローラに中継する役割を担います。
最初に「オプション1」について説明します。
Bittleには既にマイクロコントローラ「ATMega328」があり、動きとバランスを担当しています。
ros_arduino_bridgeパッケージを使用して、マイクロコントローラチップで直接ROSノードを実行することは可能ですが、このアプローチにはいくつかの欠点があります。まず、「ATMega328」に残っているメモリ量では、移動アルゴリズムとROSノードの両方を同時に安定して動作させるには不十分な可能性があります。第2に、「ATMega328」にはワイヤレスインターフェイスや画像処理機能がないため、遠隔操作のためにはシングルボードコンピューターと組み合わせる必要があります。
そこで、「オプション2」に移ります。
この場合、「SBC」はROSノードを実行し、カメラからビデオストリームを受信して画像トピックに公開し、コマンド速度トピックをサブスクライブし、線形速度と角速度のメッセージを受信し、シリアルを介して 「ATmega328」に転送します。
3. Raspberry Piの準備
「Bittle」で推奨される「SBC」は2つあります。「Raspberry Pi 3A+」と「Raspberry Pi Zero」です。「Raspberry Pi 4」と「3B+」は互換性がありますが、「Bittle」のコンパクトボディにはサイズが大きすぎます。今回は「Raspberry Pi 3A+」を使用しました。
動画での私の「Raspberry Pi」と「NyBoard」の配線は、正しい方法ではないことに注意してください。適切な接続方法は、以下に示すように、「NyBoard」の左上隅にあるヘッダーを使用することです。
その理由は、これらのヘッダーにはTX/RXピン用のレベルシフターがあるためです。「Raspberry Pi」にはUARTで3.3Vがあり、「Arduino」は一般に5V があります。この方法での「Raspberry Pi」と「Arduino」の接続は、魔法の煙が出て一日を台無しにすることはありませんが、長時間操作は「Raspberry Pi」のUARTに損傷を与える可能性が非常に高いことに注意してください。
ボードを接続したら、イメージを「Raspberry Pi」にフラッシュします。現在、「Raspberry Pi」に「ROS」をインストールするには、「Ubuntuイメージ」でコンパイル済みのROSを使用するか、「Raspbianイメージ」でROSをソースからビルドするという2つの方法があります。
「Ubuntuイメージ」を使用するとROSのインストールが非常に簡単になりますが、「Ubuntu」は全ての「Raspberry Pi」の周辺機器を完全にサポートしていないようです。Raspberry Piカメラの使用する際に問題がありました。そのため、最終的には、ROSが既にインストールされいる自分の「Raspbianイメージ」を使用することにしました。
4. ロボット用のカスタムドライバーの作成
ROSを使用したRaspbianを準備できたら、次はロボット用のカスタムドライバーを作成します。
catkinビルドツールをインストールし、catkin worskpaceを作成して、このプロジェクトのGitHubリポジトリをsrcフォルダに複製します。
sudo pip install -U catkin_tools
catkinワークスペースのsrcフォルダから次のコマンドを実行してください。
git clone https://github.com/AIWintermuteAI/bittle_ROS.git
catkinワークスペースフォルダに戻り、Githubからクローンしたばかりのパッケージをビルドします。
catkin build
リポジトリの内容を見てみましょう。「NyBoard」と対話するためのドライバーは、scriptsフォルダにあります。これは、cmd_velトピックのTwistメッセージへのサブスクライバーを持つ単純なノードです。
def __init__(self, port='/dev/ttyS0'):
self.dir = 0
rospy.init_node('cmd_vel_listener')
rospy.Subscriber("/cmd_vel", Twist, self.callback)
self.ser = serial.Serial(
port=port,
baudrate=57600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1)
Twistメッセージには、3軸の直線速度と角速度の6つのコンポーネントがあります。
rospy.loginfo("Received a /cmd_vel message!")
rospy.loginfo("Linear Components: [%f, %f, %f]"%(msg.linear.x, msg.linear.y, msg.linear.z))
rospy.loginfo("Angular Components: [%f, %f, %f]"%(msg.angular.x, msg.angular.y, msg.angular.z))
私たちの場合、線形のx速度(前後)と角度のz速度(左右)のみに関心があります。メッセージを受信したら、PySerialを使用して、組み込みの通信APIを使用して「BIttle」と通信します。
if msg.linear.x > 0:
dir = 1
elif msg.linear.x < 0:
dir = -1
elif msg.angular.z > 0:
dir = 2
elif msg.angular.z < 0:
dir = 3
else:
dir = 0
if self.dir != dir:
self.wrapper([dir_dict[dir],0])
self.dir = dir
簡単にするために、基本的な歩行を有効にします。サーボ角度をシリアル経由でマイクロコントローラに直接送信することは可能ですが、その場合、ジャイロスコープと加速度計はバランス調整に使用されません。
ジャイロスコープと加速度計のバランスを使用したきめの細かいサーボ角度制御は簡単には適合しませんが、「BIttle」のソフトウェアはオープンソースであり、将来的にはESP32コントローラボード(ROSノードと移動調整アルゴリズムの両方を実行できる)がリリースされるため、達成できると思います。これにより、さまざまな種類の障害物を通過する際の「Bittle」の能力が大幅に向上します。
リポジトリフォルダの中にはbittle_teleop_robot.launchとbittle_teleop_server.launchという2つの起動ファイルも入っています。起動ファイルはROSでは大きなロボットのセットアップを便利に立ち上げるために使われます。遠隔操作の起動ファイルでは、ロボットはロボットドライバーとUSBカメラドライバーを同時に起動します。「Ubuntu」で実行されるサーバ用の起動ファイルは、rqt_robot_steeringとRVIZを起動し、イメージビューを開きます。
「Ubuntu」と「Raspberry Pi」の両方でROS_MASTER_URIとROS_IP環境変数をエクスポートして、ROSが複数のマシンで動作するように設定します。
Ubuntu :
export ROS_MASTER_URI=http://[your-ubuntu-computer-ip-here]
export ROS_IP=[your-ubuntu-computer-ip-here]
Raspberry Pi :
export ROS_MASTER_URI=http://[your-ubuntu-computer-ip-here]
export ROS_IP=[your-raspberry-pi-ip-here]
ROS_MASTER_URIは、roscoreを実行する「Ubuntu」を指し、ROS_IPは、同じネットワーク上のマシンのそれぞれのIPアドレスに設定する必要があります。
catkinワークスペースをソースにして、piユーザーをダイヤルアウトおよびttyグループに追加することを忘れないでください。これは、PySerialがシリアル接続を開くために必要です。「ROS Melodic」は引き続きデフォルトで Python 2.7を使用し、ドライバースクリプトはシステム「Python 3」を使用するように設定されているため、インポートエラーが発生する可能性があります。その場合、pip installを使用して必要なパッケージをインストールします。通常、インストールする必要があるのはrospkgだけです。
pip install rospkg
すべて完了したら、「Ubuntu」でbittle_teleop_server.launchを起動し、「Raspberry Pi」でbittle_teleop_robot.launchを起動します。
スライダーを動かしてロボットを動かしましょう。「Bittle」以外のロボットを使用している場合、速度メッセージを受信した後に実行される正確なコードは、セットアップ、特に速度メッセージを受信した後のこの部分と一致する必要があります。
if msg.linear.x > 0:
dir = 1
elif msg.linear.x < 0:
dir = -1
elif msg.angular.z > 0:
dir = 2
elif msg.angular.z < 0:
dir = 3
else:
dir = 0
if self.dir != dir:
self.wrapper([dir_dict[dir],0])
self.dir = dir
Kickstarterキャンペーンが終了するまでまだ時間があります。プロジェクトのKickstarterメインページで「Bittle」と何ができるかを見てみましょう。より高度なロボット工学プロジェクトで「ROS」と「Bittle」を使用する予定がある場合は、より強力な制御チップ、520Kb RAMと16Mb ROMを備えた ESP32を備えた「BiBoard V0」のバックアップを検討してください。
この記事が、ROSのロボットドライバーについて理解を深めるのに役立つことを願っています。