ROSでPCLのサンプルを動かす - lccp segmentaion

#1 概要
- 今回はROSでPCLのセグメンテーションのサンプル内の[lccp_segmentation](https://github.com/PointCloudLibrary/pcl/blob/master/examples/segmentation/example_lccp_segmentation.cpp)を動かす手順を記載します。lccpはグラフ化された点群を凹面(concave)によって分離するアルゴリズムです。例えば「[Picking Towels in Point Clouds ](https://www.mdpi.com/1424-8220/19/3/713)」という論文ではタオルのばら積みシーンでロボットが把持可能な凸部分をlccpと似たような考え方を利用して抽出し、ピッキングしています。サンプルプログラムではSuperVoxel-Clusteringで点群をグラフ化しlccpによって物体を分離しています。

- ROSで動かすには、最新のサンプルではビルドが通らなかったのでpclのソースをgit cloneし、適切なバージョンに下げたのちプログラムを使用しました。

#2 環境
Ubuntu 18.04
ROS Melodic

#3 手順
##3.1 ROSのインストール
Desktop-Fullをインストールします。
[melodic/Installation/Ubuntu - ROS Wiki](http://wiki.ros.org/melodic/Installation/Ubuntu)

##3.2 ワークスペースの作成

```shell:ワークスペースの作成
mkdir -p ~/catkin_ws/src
```
##3.3 パッケージの作成


```shell:パッケージの作成
cd ~/catkin_ws/src
catkin_create_pkg pcl_tutorial
mkdir pcl_tutorial/src
```
##3.4 ソースプログラムの取得

```shell:
cd
git clone https://github.com/PointCloudLibrary/pcl.git

#バージョンの変更
cd pcl
git checkout e7135639c

#ソースコピー
cp ~/pcl/examples/segmentation/example_lccp_segmentation.cpp ~/catkin_ws/src/pcl_tutorial/src/lccp.cpp
```

##3.5 ビルド
1.CMakeFile.txtの作成

```shell:pcl_tutorial/CMakeFile.txt
cmake_minimum_required(VERSION 3.0.2)
project(pcl_tutorial)

find_package(catkin REQUIRED)
find_package(PCL 1.8 REQUIRED)

catkin_package(
)

include_directories(
 include
 ${PCL_INCLUDE_DIRS}
 #${catkin_INCLUDE_DIRS}
)

add_executable(lccp src/lccp.cpp)

target_link_libraries(lccp
  ${PCL_LIBRARIES}
  #${catkin_LIBRARIES}
)

```

2.ビルド

```
sudo apt-get install python-catkin-tools
cd ~/catkin_ws
catkin build 
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

##3.6 実行
1.点群データの取得

```shell:
cd
git clone https://github.com/PointCloudLibrary/data.git
```
2.実行

```
roscore
rosrun pcl_tutorial lccp data/tutorials/correspondence_grouping/milk_cartoon_all_small_clorox.pcd 
```
3.結果
セグメンテーション結果が表示されました。
ミルクが分離できていないのでパラメータ調整していきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/7795070a-d5e6-0630-1a7f-d394f712321c.png" width=50%>
##3.7 パラメータ調整
LCCPSegmentationの凹面判定のしきい値である```concavity_tolerance_threshold```(lccp.cpp 256行目)を10から1に変えて見ましたがミルクは分離できませんでした。そこでlccpの凹面判定の結果を表示(pcl viewer上でで「2」キーをクリック)してみると一部凹面と判定されていませんでした。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/0c7bee92-dc74-0ee3-2922-c7bbc7d1084f.png" width=50%>
グラフ化の仕方に問題がありそうだと思いSupervoxelの```normal_importance```(lccp.cpp 251行目)を4.0fから8.0fにしたところミルクも分離できました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/e4eee6fd-e717-e80b-6b00-64a9b9a0501d.png" width=50%>
#4 結論
LCCPセグメンテーションを行いテーブルとその上にある物体を分離できました。今後はこのような技術を使ってロボットでピッキングを実現したいです。

#5 参考文献
- [Grasp Novel Object](https://upcommons.upc.edu/bitstream/handle/2117/103646/1747-Grasping-Novel-Objects.pdf)
- [Convexity based object partitioning for robot applications](https://alexandria.physik3.uni-goettingen.de/PDF/steinwoergoetterschoeler2014)

# 宣伝

## 販売製品

`3D Vision Controller`というものを開発しました．ロボットアームによる3次元ピッキングをWebUIから構築するためのソフトウェアが内蔵されているコントローラです．
ご興味ございましたら是非ご連絡下さい！

https://hoshinarobot.base.shop/items/70144084

## お仕事依頼
メールアドレス : ryotaro.hoshina@gmail.com

coconala : https://coconala.com/users/4162706

CloudWorks : https://crowdworks.jp/public/employees/5569031