2. 添加關於感知模塊的所有代碼

3. 最終在基於ROS的模擬環境裏,通過運行python文件進行物體識別及輸出結果

https://github.com/Fred159/3D-Perception/tree/master/pr2_moveit?

github.com


2. 添加關於感知模塊的所有代碼(接上一篇

2.6 Euclidean clustering

Euclidean clustering直接翻譯過來就是根據距離進行分類。 也就是說,數據裡面的點和這個點周邊的點的距離小於一定的閾值的話,這些個點就同屬一個類。

當然這種演算法很多,這裡根據課程提示,直接選用了kd樹的方式去聚類。kd樹演算法,簡單點就是通過二叉樹,將點雲基於很多個超平面分隔開。在百度上看了這個博客。應該是位大牛寫的。 大概瞭解了一下,也沒深看。因為現在是調用庫,並沒有深入瞭解的必要。

KNN(三)--KD樹詳解及KD樹最近鄰演算法 - 工作筆記 - CSDN博客?

blog.csdn.net
圖標

print(Eucliean clustering)
# TODO: Euclidean Clustering
# ros_cloud_objects = pcl_to_ros(extracted_outliers)
# pcl_objects_pub.publish(ros_cloud_objects)
white_cloud = XYZRGB_to_XYZ(extracted_outliers)
tree = white_cloud.make_kdtree()
# Create a cluster extraction object
ec = white_cloud.make_EuclideanClusterExtraction()
# Set tolerances for distance threshold
# as well as minimum and maximum cluster size (in points)
# NOTE: These are poor choices of clustering parameters
# Your task is to experiment and find values that work for segmenting objects.
ec.set_ClusterTolerance(0.03)
ec.set_MinClusterSize(11)
ec.set_MaxClusterSize(45000)
# Search the k-d tree for clusters
ec.set_SearchMethod(tree)
# Extract indices for each of the discovered clusters
cluster_indices = ec.Extract()
print(create cluster-mask point cloud)

上面的代碼就是在python上實現kd tree的代碼。可以看到通過ec.xxxx的方式設置了kdtree的相關閾值。

下面這個部分的代碼就是給與這些區分好的點雲顏色,並通過ros public到rviz中,進行可視化的操作。不同的顏色就是不同的類。

# TODO: Create Cluster-Mask Point Cloud to visualize each cluster separately
# Assign a color corresponding to each segmented object in scene
color_cluster_point_list = []
cluster_color = get_color_list(len(cluster_indices))

for j, indices in enumerate(cluster_indices):
for i, indice in enumerate(indices):
color_cluster_point_list.append([white_cloud[indice][0],
white_cloud[indice][1],
white_cloud[indice][2],
rgb_to_float(cluster_color[j])])

# Create new cloud containing all clusters, each with unique color
cluster_cloud = pcl.PointCloud_PointXYZRGB()
cluster_cloud.from_list(color_cluster_point_list)
# TODO: Convert PCL data to ROS messages
ros_cluster_cloud = pcl_to_ros(cluster_cloud)
print(publish pcl_objects_pub messages)
# TODO: Publish ROS messages
pcl_objects_pub.publish(ros_cluster_cloud)

基於rviz的類(class)可視化

2.7 Generate training data

嗯? 忽然蹦出來要生成訓練集?

是的。 因為在2.6中,我們只是把點雲數據進行了聚類,但是這些個類,或者說這個形狀點雲到底是個什麼東西,我們就不得而知了。

所以我們需要構建一個識別演算法去識別點雲數據的特徵。這裡採用了SVM去識別(我感覺其實也就是一種有label的聚類。。。)。當然,其他學院也有用了深度學習的框架。我還沒看那個人的代碼,之後去看看

這個項目裏,運用的感測器因為是RGB-D攝像機,所以得到的數據有點雲和點雲的RGB。直到聚類,用的數據是點雲。而識別,就不是靠電雲了,靠的是RGB。

靠RGB的話,我們就需要生成各個角度的RGB圖像,然後把這些訓練圖像feed給SVM。讓SVM學習這些數據的特徵。

所以,我們需要生成數據來訓練svm。訓練圖像是通過uda提供的python文件,控制rviz裡面的物體模型來獲得的。代碼如下。

https://github.com/Fred159/3D-Perception/blob/master/sensor_stick/scripts/capture_features.py?

github.com

2.8 Train SVM model to learn specific features of each model

(2.9 Process the clusters by using color histogram and norms histogram)

訓練SVM也是通過uda提供的python來進行訓練的。之所以把2.9也放進這裡面,主要是因為,feature capture 的這個python文件提取的特徵就是color 直方圖和norm 直方圖。而訓練的時候,SVM也是通過提取相應圖片的color 直方圖和norm 直方圖對物體進行識別和分類的。

https://github.com/Fred159/3D-Perception/blob/master/sensor_stick/scripts/train_svm.py?

github.com

訓練出來的svm給出的confusion matrix 如下。 我們可以看到訓練好的模型可以較好的預測相應的物體。下圖中,左邊的是沒有normalize的,而右邊是normalize過後的。

SVM confusion 矩陣

2.10 Combine label and cluster with Detected Object class and publish to ROS

訓練好了SVM,那麼也就是說,機器人已經有了識別的能力。當我們,打開launch文件的時候,機器人開始識別並把數據用[[label1, [point cloud set1]],label2,[point cloud set2],[xxxxxx],[xxxxxxx]]的方式傳輸給ROS master。

那麼如果想通過機器臂夾取某個東西的話,此時我們通過ros master給機器人一個指令,讓機器人夾取某個label,比如label2。那麼機器人就會通過label2的point cloud set2 來判斷物體的位置和機器臂可以夾取的點(當然這些東西,每一個都是一個領域。。。這裡就簡單的用模擬意思意思,說明瞭一下。。)。

這次還沒有做到夾取物體的程度。這裡就不再過多闡述。

2.11 ROS receives detected_object and show labels in Rviz

最後,為了方便看結果,通過RVIZ可視化了label。這些個label和label在rviz裡面的位置也都是通過最後處理好的[[label1, [point cloud set1]],label2,[point cloud set2],[xxxxxx],[xxxxxxx]]來進行可視化的。就是label1放在point cloud set1的平均值以上多少距離的位置。

其實,只要有[[label1, [point cloud set1]],label2,[point cloud set2],[xxxxxx],[xxxxxxx]]這部分的數據,之後的所有東西就都簡單了。

3. 最終在基於ROS的模擬環境裏,通過運行python文件進行物體識別及輸出結果

檢測結果顯示,3個,5個的效果都還可以。但是在8個物體的時候,有些物體是被擋住了一部分,所以檢測結果並不是很理想。這部分的檢測能力還需要提高。

3個物體測試結果

5個物體檢測結果

8個物體檢測結果


4 總結

本次文章通過uda的項目,對基於點雲和RGB數據的識別問題進行了簡單的介紹。

當然,識別遠遠不止這些個內容,但是我認為這個項目可以很好的讓我們對基於點雲和RGB識別演算法的理解更深一步。同時因為運行環境是通過ROS進行的,所以也簡單的瞭解了ROS的系統架構。涉及到的知識點有,pcl庫,點雲的過濾,ROI過濾,聚類,分類,RGB圖像的特徵提取, 識別,ROS等等。

希望本篇文章可以讓沒有經驗的同學少走一些彎路。

如有幫助,別忘了關注+點個贊哦~

20181203

研究室


推薦閱讀:
相關文章