1. 説明
RViz と Gazebo での RADU のシミュレーションはうまくいきました。前回の記事では、リモート ノードを使用してロボットを起動し、操作する方法を学びました。この記事では、2 つのビジョン センサーを追加します。まず、ロボットが動き回るときのライブ フィードを表示するための画像カメラ。2 つ目は深度カメラ センサーで、ロボットの周囲の距離測定値である点群を出力します。色はオブジェクトの距離を示します。これら 2 つのセンサーは、2D ナビゲーションと 3D オブジェクト認識に役立ちます。
注: 技術環境は Ubuntu 20.04、ROS2 Foxy、Gazebo11、RViz2 です。
2.ガゼボの視覚センサー
前回の記事では、ロボットを制御するためにガゼボ シミュレーションにプラグインを追加する方法について説明しました。ビジョン センサーの追加も同じアプローチに従います。つまり、 Gazebo プラグインのドキュメントからプラグインを特定し、構成を確認して適用し、それをロボットの URDF モデルに追加します。
URDF モデルは次のように拡張する必要があります。
- URDF でリンクとジョイントを定義する
- オプション: リンクとジョイントを定義します
frame
- タグでの定義とラベル付け
sensor
plugin
<gazebo>
ベスト プラクティスは、ロボットの他のセンサーを別の XACRO ファイルで定義することです。これにより、特定のシミュレーション目標に合わせてカスタマイズされたロボットのさまざまな構成を提供できます。
3. カメラを追加する
カメラプラグインから始めましょう。ドキュメントに示されているように、さまざまな種類のカメラが利用可能です。従来のカメラをシミュレートするためのプラグインを選択します。libgazebo_ros_camera.so
4. URDFモデル
最初のステップは、正しいリンクとコネクタを追加することです。カメラ センサーはこの点で特別です。カメラに対してリンクとジョイントを定義し、カメラの参照点であるカメラ フレームに対して別のリンクとジョイントを定義する必要があります。これは必須の URDF 部分です。
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="radu">
<link name='rgb_cam_camera_link'>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.02 0.04 0.01" />
</geometry>
</visual>
</link>
<joint name="rgb_cam_camera_link_joint" type="fixed">
<origin rpy="0 0 0" xyz="0.30 0.0 0.065" />
<parent link="base_link" />
<child link="rgb_cam_camera_link" />
<axis xyz="0 0 0" />
</joint>
<link name="rgb_cam_camera_link_frame"></link>
<joint name="rgb_cam_camera_frame_joint" type="fixed">
<origin xyz="0.01 0 0" rpy="0 0 0" />
<parent link="rgb_cam_camera_link" />
<child link="rgb_cam_camera_link_frame" />
<axis xyz="0 0 0" />
</joint>
</robot>
次に、ロボット URDF に と タグを追加する必要があります。<sensor>
<plugin>
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="radu">
<gazebo reference="rgb_cam_camera_link_frame">
<sensor type="camera" name="rgb_camera">
<update_rate>10.0</update_rate>
<camera name="rgb_camera">
<pose>0 0 0 0 0 0</pose>
<horizontal_fov>1.3962634</horizontal_fov>
<image>
<width>640</width>
<height>480</height>
<format>YUYV</format>
</image>
<clip>
<near>0.005</near>
<far>10.0</far>
</clip>
</camera>
<plugin name="camera_controller" filename="libgazebo_ros_camera.so">
<alwaysOn>true</alwaysOn>
<updateRate>0.0</updateRate>
<cameraName>rgb_camera</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>
<frameName>rgb_cam_camera_link_frame</frameName>
<hackBaseline>0.07</hackBaseline>
<distortionK1>0.0</distortionK1>
<distortionK2>0.0</distortionK2>
<distortionK3>0.0</distortionK3>
<distortionT1>0.0</distortionT1>
<distortionT2>0.0</distortionT2>
</plugin>
</sensor>
</gazebo>
</robot>
この宣言は便利なトリックを使用しています。URDF ファイルには複数のタグを含めることができ、Gazebo はすべての宣言が 1 つのグローバル タグに書き込まれているかのように解析します。<gazebo reference="NAME">
<gazebo>
カメラを構成するための主なプロパティには次のものがあります。
<image>
画像の幅、高さ、形式<clip>
Near プロパティと Far プロパティは、画像レコードのトリミング方法を制御します
プラグインでは、更新レート (一定のストリームを意味します)、画像とカメラ情報のトピック名、およびいくつかの歪み係数を定義する必要があります。0.0
5、RVizシミュレーション
センサーを設定したら、ロボットと RViz を起動するだけです。RViz 内でカメラ ディスプレイを追加し、トピックをサブスクライブするように設定する必要があります。正しく実行されれば、画像のライブビューが表示されます。/rgb_camera/image_raw
次のスクリーンショットでは、右側にガゼボ シミュレーション、左側にカメラ ビューを備えた RViz が表示されます。
6.深度カメラ
デフォルトの画像カメラを正常にインストールしたら、深度カメラの追加に進むことができます。
当初、ロボットで使用する深度センサーとして Gazebo プラグインを使用する予定でした: Intel RealSense D435。このプラグインについて調べているうちに、公式の特定プラグインは ROS1 専用であることがわかりました。一部のユーザーは、このROS 回答スレッドで説明されているように 、このセンサーを実行しようとしました。Gazebo でコントローラーを起動することには成功しましたが、センサー データを取得できませんでした。そこで、3D 点群をシミュレートするために同様に機能するプラグイン、ROS2 Ray Sensorを使用することにしました。
7. URDF モデル
前と同様に、最初にロボット モデルに正しいリンクを作成する必要があります。深度センサーの場合、必要なリンクは 1 つとコネクター 1 つだけです。関連する URDF は次のとおりです。
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="radu">
<link name='laser_link'>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.02 0.04 0.01" />
</geometry>
</visual>
</link>
<joint name="laser_link_joint" type="fixed">
<origin rpy="0 0 0" xyz="0.10 0.1 0.085" />
<parent link="base_link" />
<child link="laser_link" />
<axis xyz="0 0 0" />
</joint>
</robot>
次に、 and タグを含む追加のタグを追加します。<gazebo reference="">
<sensor>
<plugin>
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="radu">
<gazebo reference="laser_link">
<sensor type="ray" name="head_laser_scanner">
<pose>0.0 0 0 0 0 0</pose>
<ray>
<scan>
<horizontal>
<samples>181</samples>
<resolution>1</resolution>
<min_angle>-1.57080</min_angle>
<max_angle>1.57080</max_angle>
</horizontal>
</scan>
<range>
<min>0.08</min>
<max>10</max>
<resolution>0.05</resolution>
</range>
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<always_on>1</always_on>
<update_rate>30</update_rate>
<visualize>true</visualize>
<plugin name="laser_scanner" filename="libgazebo_ros_ray_sensor.so">
<ros>
<namespace>/</namespace>
<argument>~/out:=laser</argument>
</ros>
<output_type>sensor_msgs/PointCloud2</output_type>
<frame_name>laser_link</frame_name>
</plugin>
</sensor>
</gazebo>
</robot>
センサーのタイプには次の構成オプションが含まれます。ray
- タグには、これらの定義に沿ってスキャンするための および タグを含めることができます。それぞれは、最小角度と最大角度、サンプル数 (検出された点の数)、および解像度で定義されます。
<scan>
<horizontal>
<vertical>
- センサーが環境を検出する絶対距離を定義します。
<range>
- オプションのタグは、受信した測定値をシミュレーションでクリーンアップする方法を定義します。
<noise>
センサー定義に基づいて、このセンサーの名前空間、テーマ、データ形式、および参照リンクを構成します。<plugin>
Eight、Gazebo、RViz シミュレーション
スタートアップ ファイルを変更する必要はありません。テーマで公開された新しい URDF ファイルには、新しいセンサーとプラグインが含まれています。しかし、何が見えるでしょうか?/robot_description
ガゼボでは、センサーの視覚的表現、つまり放射された光が表示されます。シミュレーションで、物体ではなく部屋の壁だけがセンサーからの光を遮っていることに気付きました。明らかに、物理的特性は異なりますが、シミュレーションではこれで問題ありません。
RViz では、センサー データのリアルタイム シミュレーションを確認し、歩き回って部屋の正確な輪郭を確認できます。起動後、ボタンを使用して新しいディスプレイを追加し、選択してテーマを設定し、サイズ 0,03m のポイントを表示します。これは次のようになります。Add
PointCloud2
/laser
9. 結論
センサー プラグインを使用してロボット シミュレーションを強化すると、ロボット モデルに関する重要な洞察が得られます。ROS2 では、公式の bower プラグインにはドライバー、IMU、GPS、カメラなどが含まれています。この記事では、センサーを追加するための基本的な手順について説明します。まず、センサーのリンケージとジョイントを定義します。次に、センサーとプラグイン構成を含むタグを追加します。センサーは、シミュレーション ツール Gazebo と RViz で異なる方法で表示されます。Gazebo では、プラグインは制御および/または視覚化できる直接インターフェイスを公開します。RViz では、ライブ フィード カメラや点群の表示など、プラグインによって提供されるテーマをリッスンするには、他の表示タイプを追加する必要があります。適切に構成すると、ロボット モデルにその環境が表示され、シミュレーションをより詳細に制御できるようになります。セバスチャン