以前の方法は

前に、Arduinoに接続したRCサーボを動かす方法を説明し、最後にそれだけでは「物足りない」と書きました。

この方法では、下図の仕組みでRCサーボを動かしていました。

ユーザが入力した角度指令は、USB(ros_serial)を通してArduinoに送信され、Arduinoのマイコンがその角度指令に応じてRCサーボへのパルスを生成します。 RCサーボは、角度指令をパルス幅として受信し、回転軸が指令された角度になるよう位置決め制御を行います。

ユーザが入力した角度指令は、途中ros_serialのパケットやパルスといった形式に変換されるものの、RCサーボまでそのまま送られます。 制御を行っているのはRCサーボだけです。そのため、与えられた角度指令になるべく短時間で回転して止まる、というRCサーボの位置決め制御が行われるだけ、ということになります。

これでは、RCサーボの現在の回転速度もわからない(回転中なのか?すら不明)ですし、目標角度までゆっくり回転させることもできません。

コントローラを用意する

そこで、次の図のようにコントローラをArduinoに載せることを考えます。

このコントローラは、目標(例:角度)とパラメータ(例:回転速度)を入力すると、そのようになるようRCサーボに角度指令を出力するとともに、 現在の状態(例:現在の角度)を返してくるような機能を持っています。

このようにすれば、目標角度までゆっくり動かすことも出来ますし、現在の角度や回転速度を取得することで、状態を把握することができます。

ところで、上図の構成ではRCサーボの回転軸角度を測定することは出来ません。RCサーボには角度指令を一方的に与えることしかできず、RCサーボに内蔵されたポテンショメータ(VR)で測定された角度を外部から読み出すための機能がないからです。

では図の「状態」は何かというと、コントローラが推定しているRCサーボの状態を意味します。例えば、コントローラが出力する角度指令をそのまま状態として出力したとしても、角度指令の変化量が少なく頻繁に更新されていれば、回転軸の角度と角度指令が近くなり、従って回転軸の角度と「状態」が近くなります。これのような簡単方法でも、場合によっては立派な推定になり得るのです。

便利なパッケージを探す

欲しい機能ははっきりしました。 上図のようなArduinoに載せるコントローラと、それとのインタフェイスを実現できるパッケージが欲しいのです。

もちろん、rosserialやrosserial_arduinoパッケージを使い、Arduinoに載せるコントローラを作ることもできます。しかし、パッケージが充実していることがROSの大きな魅力の1つです。

なるべく作らずに、利用できるものをうまく、便利に利用して作る方法を探ってみます。

ros_arduino_bridgeを使ってみる

ros_arduino_bridgeパッケージが見つかりました。

これはArduinoを移動ロボットのコントローラとして機能させるとともに、そのコントローラとROSとのインタフェイスを提供するパッケージとなっています。 移動ロボットで使う、左右モータのPID制御やエンコーダを読み出して速度や移動距離を求めたりする機能を中心に作られているようです。

Documentationのパラメータ設定ファイルでは、次のようになっています。

# Joint name and configuration is an example only
joints: {
    head_pan_joint: {pin: 3, init_position: 0, init_speed: 90, neutral: 90, min_angle: -90, max_angle: 90, invert: False, continous: False},
    head_tilt_joint: {pin: 5, init_position: 0, init_speed: 90, neutral: 90, min_angle: -90, max_angle: 90, invert: False, continous: False}
}
		

これを見ると、RCサーボによるジョイントのコントロールに使えそうな雰囲気ですが、同時に気になる"example only"の文字が・・・

使えるかわからないので、試してみましたが、残念ながらジョイントのコントロール機能は未実装でした。

master branchを直して使う

最新版では実装が試みられているかもしれないので、master branchを持ってきて試してみました。

ビルドでエラーが出るものの、ソースを覗くと色々なところで使えそうな機能が追加実装されていて、良くできていそうな雰囲気も感じます。

なので、少なくとも欲しい機能は問題なく使えるようバグ修正しました。(幸い7個ほどのファイル修正で使えるようになりました。)

直したものはgithubに置いておきましたので、次のようにすれば使えます。

$ cd ~/catkin_make/src
$ git clone -b master https://github.com/SIshijima/ros_arduino_bridge.git
$ cd ~/catkin_make
$ catkin_make
		

Arduinoのスケッチ作成

ros_arduino_bridgeには、Arduinoのライブラリではなく、スケッチが/ros_arduino_bridge/ros_arduino_firmwareに納められています。 この中のROSArduinoBridge.inoをArduinoIDEで開き、修正します。

移動ロボットのコントローラ機能は使わないので、#define USE_BASEをコメントアウト、RCサーボを使うので#define USE_SERVO2をアンコメントします。 そしてArduinoのマイコンに書き込みます。

次回は、このros_arduino_bridgeを使ってパンチルトカメラを制御したいと思います。