これまでROSのノードやトピックといったものの基本的な扱い、Webカメラを使って、ROSでセンサを扱う方法を見てきました。シリーズの4回目となる本記事ではIntel Realsenseという深度を計測できるセンサを使用して、ROSを用いて3次元空間の情報の取得と描画について学んでいきます。現実の3次元空間で動作するロボットにおいて3次元の情報は非常に重要であり、それらの扱い方の基礎を学びます。
1.Intel RealSenseについて
深度カメラは、環境内の物体までの距離を計測するデバイスで、これにより物理世界をデジタルで三次元的に捉えることができます。以下に深度カメラで取得した画像の例を示します。普通のカメラとは異なり、カメラからの距離に応じて近いものは青く、遠いものは赤く表示されているのが分かります。
Intel RealsenseはIntelが販売している深度カメラで、性能が高く、深度センサの中では扱いやすい製品です。いくつかモデルがあるので用途に応じて選択することができます。
以下に代表的な3つのモデルについて特徴をまとめてみました。
・D435/D435i
今回紹介するモデルの中では最も安価なモデルです。深度センサとRGBカメラを搭載し、0.1mから10mまでの距離を計測することが可能です。D435iはさらにカメラの姿勢を計測できるIMUというセンサが搭載されているモデルです。
・D455
IMUが標準搭載され、計測距離も20mまで可能になったモデルです。
・D456
2023年10月に発売された最新モデルです。D455をベースに防水防塵性能が向上されています。これにより屋外や工場などの過酷な環境での使用が可能になっています。
今回はこの中でD435を使用していきますが、基本的にどのモデルでも同じ手順で動作させることができます。
2.Intel RealsenseをVirtualBox上のUbuntuで使用できるようにする
Intel RealsenseをVirtualBox上のUbuntuで動かせるように設定を行っていきます。
まず初めに、VirtualBox上のUbuntuにRealsenseのSDKをインストールしていきます。
こちらのページを参考にターミナル上で順番に実行していきます。
$ sudo mkdir -p /etc/apt/keyrings
$ curl -sSf https://librealsense.intel.com/Debian/librealsense.pgp | sudo tee /etc/apt/keyrings/librealsense.pgp > /dev/null
$ sudo apt-get install apt-transport-https
$ echo "deb [signed-by=/etc/apt/keyrings/librealsense.pgp] https://librealsense.intel.com/Debian/apt-repo `lsb_release -cs` main" | \
$ sudo tee /etc/apt/sources.list.d/librealsense.list
$ sudo apt-get update
$ sudo apt-get install librealsense2-utils librealsense2-dev
次にVirtualBox側の設定を変更します。一旦Ubuntu仮想マシンのシャットダウンを行い、仮想マシンの設定を開きます。Intel RealsenseをUSB接続し、設定のUSBの項目からIntel Realsenseを追加します。ここでの注意点としては、「USBコントローラーを有効化」のところでUSB3.0を選択してから追加するようにして下さい。
仮想マシンを再度立ち上げ、仮想マシンウィンドウのデバイスからUSBを選び、Intel Realsenseを有効にします。
この後実行するGUIをできるだけ大きく表示するために、仮想マシン内のディスプレイの解像度をあげられるのであれば上げておいてください。Ubuntuのデスクトップ上で右クリックを押して「Display Settings」から変更することができます。
次に、Ubuntu上でターミナルを開き、以下のコマンドを実行します。
$ realsense-viewer
以下のような画面が立ち上がり、サイドバーの「Stereo Module」をONにすることでリアルタイムに深度カメラのデータが表示されます。
この右の深度カメラの画像を移している画面は3次元空間上に描画されており、マウス操作によって視点を変えることができます。
3.IntelRealsenseのデータをRVizで描画する
仮想マシンのUuntu上でIntel Realsenseが使用できるようになったので、ROSを使ってセンサデータの取得と描画を行っていきます。
以下のコマンドで必要なROSパッケージをインストールします。
$ sudo apt install ros-noetic-realsense2-camera
インストールできたら、以下のコマンドでRealsenseをROSで動かすデモを実行します。
$ roslaunch realsense2_camera demo_pointcloud.launch
実行するとRVizという3次元表示のためのアプリケーションが立ち上がり、以下のようにRealsenseのデータが3次元空間上に表示されます。RVizも視点をマウスで調整できるので、センサデータが見やすいようにマウスを動かして視点を調整してみてください。
これでIntel RealsenseをROS上で動かして、描画させることができました。
ここからは、今回実行したコマンドや動作原理について詳しく説明していきたいと思います。
まず今回実行した「roslaunch realsense2_camera demo_pointcloud.launch」について説明します。前回「rosrun」というコマンドがROSのノードをパッケージから選択して実行するためのコマンドというふうに説明しましたが、「roslaunch」も同様にパッケージを指定して、launchファイルというものを実行するためのコマンドになります。
では、launchファイルとは何なのかですが、launchファイルは一言でいうと、複数のノード実行をまとめたバッチ実行ファイルというものになります。
言葉では分かりづらいので、実際にファイルの中身を見てみましょう。
以下のコマンドで先ほど実行した「demo_pointcloud.launch」の中身を表示させることができます。
$ more /opt/ros/noetic/share/realsense2_camera/launch/demo_pointcloud.launch
コマンド実行後、以下のようにファイルの中身が表示されます。
<launch>
<arg name="serial_no" default=""/>
<arg name="json_file_path" default=""/>
<arg name="camera" default="camera"/>
<group ns="$(arg camera)">
<include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml">
<arg name="serial_no" value="$(arg serial_no)"/>
<arg name="json_file_path" value="$(arg json_file_path)"/>
<arg name="depth_width" value="640"/>
<arg name="depth_height" value="480"/>
<arg name="depth_fps" value="30"/>
<arg name="color_width" value="640"/>
<arg name="color_height" value="480"/>
<arg name="color_fps" value="30"/>
<arg name="enable_depth" value="true"/>
<arg name="enable_color" value="true"/>
<arg name="enable_infra1" value="false"/>
<arg name="enable_infra2" value="false"/>
<arg name="enable_fisheye" value="false"/>
<arg name="enable_gyro" value="false"/>
<arg name="enable_accel" value="false"/>
<arg name="enable_pointcloud" value="true"/>
<arg name="enable_sync" value="true"/>
<arg name="tf_prefix" value="$(arg camera)"/>
</include>
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find realsense2_camera)/rviz/pointcloud.rviz" required="true" />
</group>
</launch>
中身を見ると、launchファイルの実態はXMLで記述されていることが分かります。
で記述されているタグで実行するノードが記述されており、上記ファイルではRVizというプログラムが実行されることが分かります。
もう一つで記述されているタグがあるかと思いますが、これは別のlaunchファイルを読み込んで使用することを意味します。つまり今回のlaunchファイルではRVizというプログラムの実行と別のlaunchファイル(ここではnodelet.launch.xml)の実行を行っているということになります。
では実際に実行されているノードが全部でどれだけあるかを確認しましょう。
「roslaunch realsense2_camera demo_pointcloud.launch」を実行した状態で、別ターミナルで、以下のコマンドを実行してみてください。
$ rosnode list
実行すると以下のように出力されると思います。
/camera/realsense2_camera
/camera/realsense2_camera_manager
/camera/rviz
/roscore
この4つのプログラムが実行されているノードになります。この中にroscoreが入っているのが分かります。これまでroscoreをターミナルで最初に実行し、ノードを立ち上げていたと思いますが、launchファイルを使用するとroscoreが自動で立ち上がります。
残りの3つのプログラムですが、rvizが3次元表示のウィンドウのプログラムで、残りの2つがRealsenseからデータを取得し、3次元表示用のデータをトピックとして配信するノードになります。詳細はここでは割愛しますが、nodeletという仕組みを用いており、そのために2つのプログラムが起動しています。
4.まとめ
ロボットに3次元空間を認識させるうえで重要なセンサである深度カメラを使って、ROS上で描画させるというデモを行いました。深度カメラとしては扱いやすいIntel Realsenseを用いて、RVizというアプリケーションに3次元的にデータが表示されることを確認できました。また、roslaunchという仕組みによって、これまでrosrunで一つずつ立ち上げていたノードを一気に複数立ち上げることにより、より複雑な構成のデモを行うことができました。次は実際に走行するロボットをROS経由で操作するということを行っていきたいと思います。
コメント