環境
この記事は以下の環境で動いています。
項目 | 値 |
---|---|
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という数学ライブラリが必要です。
sudo apt-get install -y libarmadillo-dev libarmadillo6
ダウンロード
githubからソースをダウンロードします。
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でも反応するように設定を一部変えます。
obstacle_extractor:
use_scan: true
use_pcl: false
min_group_points: 3
max_group_distance: 0.05
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
以下のように障害物がそれぞれ検出されました。
表示では赤い丸が物体の大きさ、緑はマージンらしいです。