ROSを使用したOMower、最初のステップ

OMowerは当初、単純なpfodAppおよびModbus制御インターフェース用に設計されました。 1つ目はメニューと制御コマンドが送信される高レベルのテキストプロトコルで、2つ目はよく知られていますが、使用されているすべてのセンサーのステータスを「手動」でポーリングする必要があるため、このアプリケーションではあまり便利ではありません。 そのため、さまざまなロボットを制御するために広く使用されているフレームワークであるROS(Robot OS)に徐々に切り替えることが決定されました。











現時点では、ROSのサポートは初期段階にあり、センサーからの情報の単純な配列形式での送信のみ(多くのROSライブラリが提供する特殊なメッセージ形式を使用せず)、デバッグログ、およびpfodApp / Modbus形式のコマンドの制御フローが可能です標準のROSツールでロボットを実際に制御します。 つまり、ロボットをその場所から移動したり、ロボットの内部設定を変更したりするには、pfodApp形式のテキストコマンドを送信する必要があります。 しかし、このような切り捨てられた形式でも、ロボットで起こっていることを簡単にブロードキャストして記録し、標準のROS(rviz)ツールでその動きを視覚化し、追加機能のサービスを追加できます。 たとえば、駐車場に正確に到着するために、omower_seeker.pyが提供するビジュアルテンプレート(チェッカーボード)の方向に乗る機会です。



写真は、ロボット内のデータストリームを示しています。 メインのROSサービスはオレンジPI Zeroで実行され、ロボットボード上の特別なスロットに固定されます(テストマシンでは、Raspberry PI3が使用され、同様の方法でシリアルポート経由で接続されます)。 rosserialインターフェースを介して、ロボットはセンサーからのメッセージ(/ imu / orientation // motors / PWMなど)、テキスト形式のデバッグログ、pfodAppまたはModbus形式のメニューの出力をROSカーネルに送信し、テキストコマンドまたはModbusのストリームを受信します-クエリ。 追加の2つのRaspberry PI Zeroにはカメラからの画像ストリームが付属していますが、実際に示されているように、この方式でステレオ画像を処理するための通常の同期を取得することは不可能です(下の写真に品質が表示されています)。通常のステレオカメラはすぐに交換されます



OMowerでのROS統合の度合いは徐々に拡大し、ロボットのすべての内部変数への完全なアクセスと、標準のROSツール(必要な速度を指定するcmd_velメッセージなど)を使用した管理が可能になります。







ROSを使用してOMowerに機能を追加する例として、omower_seeker.pyモジュールについてもう少し説明します。 その目的は非常に単純です-チェス盤の方向に進み、リアルタイムでルートを調整します。 この機能を使用して、芝刈り機を駐車ステーションに移動し、そこでバッテリーをすばやく充電できます。 モジュールは、カメラの1つからの画像を分析し、2つの角度(カメラの中心からのボードのずれ角度と垂線に対するボード自体の回転角度)を計算し、それらをテキストコマンドとして内部シーカーモジュール(OMower SDKのomower-seeker.h / cpp)として送信します。







外見的には、これはかなり単純なタスクのように見えますが、実際には深刻な問題があります-ロボットに組み込まれたマイクロコンピューターでの画像処理の速度です。 実践が示すように、比較的低電力のOrange PIとRaspberry Piを使用する場合、画像内のopencvでパターンを検索する速度は非常に低く不安定で、640 x 480の解像度で数十ミリ秒から数百ミリ秒かかります。これは、運転中に必要なルートからの逸脱になります、たとえ低速であっても、この間にかなりの角度を回すか、比較的長い距離を移動します。 実際、他のパターンにはさらに時間がかかるため、最小セル数のチェス盤が選択されたのはそのためです。



ビジュアルテンプレートの長い検索時間を補うために、コンパススキームが使用されます-ロボットマイクロコントローラーはその値を100ミリ秒ごとに保存し、最後の0.5秒間に5つのサンプルを保存します(正確なナビゲーションに適していないため、より長い分析は単に破棄されます)。 omower_seeker.py(テンプレート検索時間もマイクロコントローラーに送信します)から計算された角度は、保存されたコンパス値を使用して実際の回転角度に再計算されます。これは、検索時間から100ミリ秒以内であり、ロボットはこの角度に沿って移動します。 これにより、ほぼ正確にチェス盤の方向に直線で進むことができます。 または、垂直に比べてわずかに回転している場合-アプローチ角度を修正する円弧に沿ってテンプレートの軸にできるだけ近くなるようにします。これは、ボードまで駆動するだけでなく、ガイドレールに入り、充電接点に接続する必要があるためです



ステーションに到着するための完全なアルゴリズムは、3段階で実装されます。 GPSフィールドには2つのポイントが設定されます-開始ポイント(作業領域の中央のどこか)、ステーションの前のポイント、およびステーションへの回転角度。 ロボットが開始点から2番目に到着し、ステーションのチェッカーボードに向かって所望の角度に回転すると、シーカーモジュールが動作を開始し、PIDコントローラーを介してモーターの速度を調整します。 ステップのいずれかがパスしなかった場合、または偏差角度が設定値を超えた場合、ロボットはレースをキャンセルし、再び開始点に戻ります。



リンクとビデオ:



OMower SDK、Arduino IDEおよび回路基板レイアウトのライブラリ

pfodApp / ModbusとROSへの接続の両方を実装するSDKを使用した既製のファームウェア

ROSのomower_gatewayパッケージ










All Articles