虹はなぜ、わたしたちの希望となるのか。
虹の法則をすでに発見しているにもかかわらず、わたしたちはなぜ神秘的に感じるのか?
虹はしばしば、奇跡の象徴と扱われ、また吉凶の予兆や天と地の架け橋ともみなされてきた。
神秘的であり、文化や地域によって違いはあれど、様々な色を内包するこの自然現象は、あまたの神羅万象において今もなお人間社会の中で特別な意味をなしている。
しかし、虹が発生する原理は雨滴や水蒸気を通過した太陽光の屈折による分散でしかないため、虹の正体は分光されたスペクトルであり、それぞれの帯の色も波長の違いによるものでしかない。
その実、原理さえわかれば虹を「作り出す」ことは難しくはない。
プリズムや回折格子シート、さらに身近なものでもガラス瓶やペットボトル、CDに光を当てれば虹は出現する。
それでも尚、神秘的に見え、あまつさえ我々に希望をもたらすのは何故か?
たとえば、ロボットアームのような機械やコンピュータを駆使して虹を再現しても、その神秘性は失われないのか?
機械が生み出す美しい自然現象は、果たしてその神秘性・文化的な意味を失わずに保ち続けるのか。
制作と展示を通して探っていきたい。
虹が大好きな私の、「部屋を虹で満たして、虹の光に浸りたいと」いう発想から始まりました。
子供の頃、虹が不思議でたまらなかった私は、虹の根元を探そうと自転車を爆走させていたことがあります。 だんだんと色が薄くなるのを見ながら、「早くしないと虹が消えちゃう」と必死で漕いだのもいい思い出。
虹の法則を知った今でも、やはり虹は綺麗で儚くて不思議な存在。
そんな虹でいっぱいの空間に浸りたくはありませんか?
まずは、Jetson Nano (2GB)を使えるようにします。
公式の手順を確認しながら、OSをSDカードに書き込みましょう。
Getting Started with Jetson Nano 2GB Developer Kit
OSが起動したら、早速ROSの開発環境を整えていきます(バージョン:melodicを想定)。
これも公式からROSをインストールします。Gazeboシミュレータも使うので、Desktop-Full版を入れましょう(推奨)。
上記のフル版に含まれていないROSパッケージをインストールします。
rosserial
sudo apt-get install ros-melodic-rosserial
sudo apt-get install ros-melodic-rosserial-arduino
MoveIt
sudo apt install ros-kinetic-moveit
sudo apt install ros-kinetic-moveit-ros-visualization
必要なパッケージを入れたら、Arduino IDEを導入してArduinoがROS経由でメッセージを受信できるように環境を整えます。以下のURLを参考に、IDE本体とArduinoライブラリをインストールしてください。ちなみに、自動的にパーミッションも付与されるようになる...はず(UNO互換機はないかも)。
さて、これでようやくソフトウェアが開発できるようになりました。
まずはArduino(ロボットアーム本体)側ですが、こちらは単純にROSから得られた各関節の角度をPWM信号に変換するスケッチを書き込みました。基本的には、購読者(Subscriber)としてJetsonから送られてくる角度をイベントで読み取って対応するサーボモーターを回転させます。
では、いよいよJetson側のソフトウェアを作っていきます。
まず必要なのは、ロボット本体の構造や特性を記述したモデル(URDF)です。 既存の製品やキットに含まれていれば一番手っ取り早いのですが、オリジナルのハードウェアだとそもそも自分で用意する必要があります。
URDFとは、XML形式でロボットの構造や特性などを記述したファイルですが、同じ車輪やパーツですら逐一書く必要があり(プログラマブルな要素がない)ため、直接作成しようとすると非常に面倒です。そこで、一般的にはxacro形式のファイルを作成してROSのxacroパッケージから変換します(が、諸事情で今回はURDFを直接作成しました...)。
(参考:ROS講座68 xacroを使う1)
続けてロボットアームの軌跡を計算できるよう、MoveItの設定を行います。コンソールで以下のコマンドを実行してアシスタントを起動します。アシスタントでは、ジョイントの接続先や角度の制約などを決めていきます。
roslaunch moveit_setup_assistant setup_assistant.launch
設定ファイル(arm_robot.srdf, joint_limits.yaml, kinematics.yaml , ompl_planning.yaml)が作成されたら、作成しているROSパッケージのsrc内にconfigフォルダを作ってコピーします。 また、出力側のコントローラーとlaunchファイルも追加で作成します。
出力側のコントローラーは以下の処理を担います。
launchファイルは、ROSのシステム起動に使われる設定ファイルで、ここでは以下の処理を実行しています。
また、シリアル通信の確立には独自のlaunchファイルを使っています。
(参考:ROS講座104 moveitでオリジナルのアームを使う)
ただ、現状ではハードウェア制御およびシミュレーション環境が整っただけで、関節(サーボモーター)の角度をハードウェアに伝えるノードは存在しません(launchを実行してもエラー)。
そこで、角度を送信するノードをC++作成します。今回は、単純にトピック"joint_states"を常に購読しておき、直前の角度と異なる場合に値を更新して、トピック"pos_servo"として配信する処理を実装しました。
角度を伝送するノードができても、目標位置を決めなければいつまでもアームは動きません。
ここでは、アーム先端の目標位置(シミュレータ)をランダムに決めるスクリプトをPythonで組みました。ただ、あまり無作為に目標を決めてしまうと到達できない位置となる可能性もあるため、値に制限を設けています。また、MoveItは角度をQuaternionで取り扱うため、メソッド tf.transformations.quaternion_from_euler でオイラー角を変換して与えます。
なお、Python用の開発環境も整えておく必要があります。
ちなみに、コントローラーという用語が途中で出ていますが、これはros_controlというパッケージの一部分で、各アクチュエータの制御方法を決める要素です。このパッケージは、ハードウェアを抽象化して汎用的なロボット制御を目指したもので、制御処理とハードウェア本体がなるべく依存しないような形で構成されています。
ros_controls/ros_controllers の制御の仕組み (position/effort/velocity_controllers の基礎)