ROS melodicにおいて、小型の深度センサーである、Intel RealSense D435iを用いて、マップ生成や自己位置推定などに必要な/scanと/imuのトピックを発行したいと思います。RealSenseにはD435とD435iと、形状が似ているタイプが存在しますが、D435iの方がIMU(ジャイロや加速度センサー)がついているため、こちらを使用します。

RealSenseライブラリのインストール

こちらのrealsense-rosがRealSenseのROSライブラリになります。

https://github.com/IntelRealSense/realsense-ros

ROS melodic向けのRealSenseライブラリは上記のREADMEを参考にしてインストールしましょう。

roslaunch realsense2_camera rs_camera.launch

インストール後、上記コマンドを実行し、別のターミナルを開いてrostopic list -vなどとコマンドを打ってtopicのリストを表示した時に、/camera/color/camera_infoなどのPublished Topicsに記載されているtopicのリストが表示されていれば無事にインストールと実行ができています。

デプス画像から/scanトピックを発行する

マップ生成をする際、/scanトピックをsubscribeする必要がありますが、realsense-rosで発行できるトピックの中に/scanトピックはありません。

そこで、デプス画像を/scanトピックに変換できる下記ライブラリを使用します。

元となるデプス画像(depthimage_to_laserscanのページより)

scanデータに変換される(depthimage_to_laserscanのページより)
sudo apt-get install ros-melodic-depthimage-to-laserscan

でインストールするか、下記のようにcatkinでインストールをします。

cd catkin_ws/src
git clone https://github.com/ros-perception/depthimage_to_laserscan.git
cd ..
catkin_make

realsense-rosでは、デプス画像は/camera/depth/image_rect_rawというトピックで発行されているので、

roslaunch realsense2_camera rs_camera.launch
rosrun depthimage_to_laserscan depthimage_to_laserscan image:=/camera/depth/image_rect_raw

と、2つのターミナルで実行してみましょう。

rostopic list -v で確認した時に/scanが発行されていれば、無事にデプス画像からスキャンデータに変換ができていることになります。

また、launchファイルに組み込む際は、下記などのようにします。

 <node pkg="depthimage_to_laserscan" type="depthimage_to_laserscan" name="depthimage_to_laserscan" >
     <param name="scan_height" value="3"/>
     <param name="output_frame_id" value="base_link"/>
     <remap from="image" to="/camera/depth/image_rect_raw" />
 </node>

/imuトピックを発行する

また、自己位置推定のために/imuのトピックを発行する必要がありますが、realsense-rosはデフォルトでは発行されません。

githubのレポジトリ のページに説明がありますが、launchファイルを実行する際に、unite_imu_methodというパラメータにlinear_interpolationをセットしてあげる必要があります。これにより、gyroとaccelの2つのストリームを統合して/imuトピックを発行することができます。

roslaunch realsense2_camera rs_camera.launch unite_imu_method:=linear_interpolation

上記を実行した後にrostopic list -vで確認をすると/imuトピックが発行されていると思います。

また、launchファイルに組み込む時は下記などのようにします。

 <include file="$(find realsense2_camera)/launch/rs_camera.launch">
   <arg name="unite_imu_method" value="linear_interpolation"/>
 </include>

※2021年2月26日追記  現在のrs_camera.launchはenable_gyroとenable_accelというパラメータがデフォルトでfalseになってしまったので、trueを指定する必要があります。

 

  <include file="$(find realsense2_camera)/launch/rs_camera.launch">
    <arg name="unite_imu_method" value="linear_interpolation"/>
    <arg name="enable_gyro" value="true"/>
    <arg name="enable_accel" value="true"/>
  </include>

 トラブルシュート

/imuトピックが発行できなかった場合は、下記記事をご参考ください。

https://rb-station.com/blogs/article/realsense_ros-rs_camera-launch-imu

RealsenseRos

Related Posts

ROSのPythonで他のサービスが立ち上がるまで待つ方法
ROSのPythonで他のサービスが立ち上がるまで待つ方法
ROSでパッケージを作成する時に他のサービスが発行するトピックに依存している時など、他のサービスが立ち上がるまで待つ必要がある時があります。 その場合、wait_for_service()関数を使用することで実現できます。この関数は、...
Read More
ROSのLaserScanデータの一定角度の範囲を無視する方法
ROSのLaserScanデータの一定角度の範囲を無視する方法
ROSでLidarセンサーを使う時、ロボットの車体など一定角度の範囲に常に障害物があり、これを無視したい時があると思いますが、その方法を紹介します。 以下は、得られた/scan_rawトピックのデータの一定角度の範囲を無視して新しい/...
Read More
ROSのmove_baseで、Pythonからコストマップをクリアする方法
ROSのmove_baseで、Pythonからコストマップをクリアする方法
move_baseを使っていると、障害物が無いのにコストマップで障害物判定されてしまうことがあります。そのようなときは、コストマップを一度クリアしましょう。 コマンドから   move_baseノードには、コストマップをクリアする方法...
Read More