ROS講座82 obstacle_detectorを使う


環境

この記事は以下の環境で動いています。

項目
CPU Core i5-8250U
Ubuntu 20.04
ROS Noetic
Gazebo 11.9.0

インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。

概要

lidarの/scanから障害物を検出するパッケージとしてobstacle_detectorがあります。これを使ってみます。

obstacle_detector使用の準備

依存ライブラリのインストール

obstacle_detectorのビルド、起動にはArmadilloという数学ライブラリが必要です。

armadilloのインストール
sudo apt-get install -y libarmadillo-dev libarmadillo6 

ダウンロード

githubからソースをダウンロードします。

obstacle_detectorのダウンロード
cd ~/catkin_ws/src
git clone https://github.com/tysik/obstacle_detector.git

ビルド

cd ~/catkin_ws
catkin build

テスト実行

ソースに入っているデモを起動します。
各ターミナルごとに実行前にsource ~/catkin_ws/devel/setup.bashを実行する必要があります。

roslaunch obstacle_detector demo.launch 

使い方

今回はobstacle_trackerの中からobstacle_extractorとobstacle_trackerの2つを使います。前者はscanデータから円(障害物)と直線(壁)を検出します。後者は時間的に見てましてノイズで発生する円(障害物)を除外します(tracking IDを振るとかはやってくれません)。

config

実はたくさんの設定項目がありますが、ほとんどデフォルトのままで使えます。tf関連は設定しておく必要があります。またobstacle_extractorはデフォルトではpclデータを入力するようになっているので、scan入力になるように設定を変更します。
またydlidarのような点数が少ないlaserでも反応するように設定を一部変えます。

laser_lecture/config/obstacle_detector.yaml
obstacle_extractor:
  use_scan: true
  use_pcl: false
  min_group_points: 3
  max_group_distance: 0.05

launch

laser_lecture/launch/obstacle_detector.launch
<?xml version="1.0" encoding="UTF-8"?>
<launch>
  <arg name="model" default="$(find sim_env_lecture)/urdf/sensor_station.urdf" />
  <arg name="rvizconfig" default="$(find laser_lecture)/rviz/obstacle_detector.rviz" />  
  <param name="robot_description" command="$(find xacro)/xacro $(arg model) --inorder"/>

  <!-- gazebo world -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="sensor_station_coke_box.world"/>
  </include>

  <!-- obstacle detector -->
  <rosparam command="load" file="$(find laser_lecture)/config/obstacle_detector.yaml" />
  <node name="obstacle_extractor" pkg="obstacle_detector" type="obstacle_extractor_node">
    <remap from="scan" to="/front_laser/scan" />
  </node>
  <node name="obstacle_tracker" pkg="obstacle_detector" type="obstacle_tracker_node" />

  <node pkg="tf" type="static_transform_publisher" name="tf_1" args="0 0 0 0 0 0 map base_link 10" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />   

  <!-- rviz -->
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>

実行

roslaunch laser_lecture obstacle_detector.launch 

以下のように障害物がそれぞれ検出されました。
表示では赤い丸が物体の大きさ、緑はマージンらしいです。

参考

obstacle_detector

目次ページへのリンク

ROS講座の目次へのリンク