TB3_Autorace之交通杆检测
利用blob檢測算法識別交通桿,控制TB3機器人完成對交通桿的起停動作!
上一篇博文中《TB3_Autorace之路標檢測》訂閱了原始圖像信息,經過SIFT檢測識別出道路交通標志,這里我們同樣訂閱樹莓派攝像頭的原始圖像信息對交通桿進行識別,同時我們還訂閱了交通桿的狀態信息以及任務完成信息,實現桿落即停,桿起即過的功能。
1 |
self.sub_image_type = "raw" |
發布話題
發布圖像信息,交通桿的狀態信息/detect/level_crossing_stamped、任務開始信息/control/level_crossing_start以及速度控制信息/control/max_vel。
1 |
if self.pub_image_type == "compressed": |
設定檢測狀態
這里我們利用python的枚舉操作將路標檢測封裝為幾個不同狀態,包括識別標志、檢測交通桿、識別交通桿、停車、通過等狀態。根據不同的識別狀態執行相應的控制命令。
1 |
self.StepOfLevelCrossing = Enum('StepOfLevelCrossing',
|
距離計算
計算點到直線的距離,代碼封裝如下:
1 |
distance = abs(x0 * a + y0 * b + c) / math.sqrt(a * a + b * b) |
計算點到點的距離(歐式),代碼封裝如下:
1 |
distance = math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) |
線性判斷
利用blob算法檢測出的紅色塊,得出色塊的坐標對,根據三點呈一線的原理,計算直線方程并判斷檢測出的點是否呈線性,代碼封裝如下:
1 |
def (point1, point2, point3): |
距離判斷
利用blob算法檢測出的三個紅色塊,得出三個色塊的坐標對并計算相互之間的距離,判斷距離是否相等,代碼封裝如下:
1 |
def (point1, point2, point3): |
格式轉換
設定合適的幀率,將訂閱到的原始圖像信息格式轉換成OpenCV庫能夠處理的信息格式,代碼封裝如下:
1 |
def cbGetImage(self, image_msg): |
注:根據計算機處理能力設定幀率,這里設置成10fps,不合適的幀率設置容易產生掉幀的現象,會影響最終的檢測。
提取色塊
利用掩膜操作,設定顏色閾值,將RGB圖像轉換成HSV格式圖像,根據顏色閾值提取出交通桿上的紅色色塊,返回掩膜后的0-1圖像。代碼封裝如下:
1 |
def fnMaskRedOfLevel(self): |
速度控制
根據訂閱到的交通桿狀態信息/detect/level_crossing_order,實時發布目前的檢測狀態以及速度命令控制小車由減速到停車再到啟動的全過程。代碼封裝如下:
1 |
def cbLevelCrossingOrder(self, order): |
交通桿檢測
這里主要利用blob斑點檢測算法,在上一篇文章中《TB3_Autorace之路標檢測》提到的通過設定幾個檢測指標對掩膜后的圖像進行關鍵點檢測,將識別出的色塊用黃色圓標識。當檢測到3個紅色矩形框時,計算關鍵點的平均坐標以及關鍵點到平均點的距離列表,通過計算三個紅色塊之間的距離以及校驗三個色塊的線性情況判斷是否檢測到交通桿,將斑點用藍色線連接標識,計算交通桿的斜率,根據斜率值的大小說明到攔路桿的距離,判斷攔路桿的狀態;通過計算self.stop_bar_count的值判斷交通桿已經收起,小車可以通過,返回交通桿的三個狀態(小車減速,停車,通過),代碼封裝如下:
1 |
def fnFindRectOfLevel(self, mask): |
至此,已經完成對交通桿的檢測工作,根據交通桿下放過程中實時計算的桿子斜率指標給小車發布速度控制命令,實現了減速,停車,通過全過程。
附
完整進程源代碼:https://github.com/sun-coke/TB3_Autorace
總結
以上是生活随笔為你收集整理的TB3_Autorace之交通杆检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言形参指针 实参数组,《C语言程序
- 下一篇: gpt分区无法安装系统怎么办 gpt分区