勾伯濤,李鵬飛
(沈陽理工大學 信息科學與工程學院,遼寧沈陽, 110159)
過去的幾年,隨著科技的發展和社會的變革,商場產業迅速發展,雖然人們的生活水平得到了提升,但是隨之而來的一些安防問題卻始終未能有效解決。目前對于商場的安防問題,一般只有監控和保安巡邏兩種傳統的方式,對于監控來說它本身就存在著監控死角以及停電無法工作的狀態,而對于人工巡邏來說,也沒有足夠的精力去實現24 小時的不間斷視察巡邏,且人對于周圍環境的敏感程度也相對比較薄弱,不能及時發現并排除隱患。
針對上述問題,本文設計了一個基于計算機視覺的智能安防巡邏機器人,實現自主移動定位、人體檢測與追蹤、煙火檢測系統和滅火彈丸的精準投擲等功能,有效地彌補了傳統方法的漏洞。
智能巡邏機器人主要由運動主控模塊(下位機)和視覺環境檢測模塊(上位機)兩個模塊構成,兩個模塊之間通過虛擬串口進行通訊,實現各個功能的聯調,系統結構框圖如圖1 所示。下位機實現對機器人的運動狀態的控制,其中包括前進、后退、平移、旋轉等多種運動狀態;能夠接收上位機下發的信息實現在商場中實現自主建圖、定點巡視、煙火檢測、自動瞄準發射滅火彈丸,以及危險人物的自動跟隨與報警。上位機上裝有視覺主控的MinPC,能夠實現上電自啟動,確保代程序實時運行,也裝有海康工業相機,其圖像質量優異。通過USB3.0 接口實時傳輸非壓縮圖像,最高幀率可達249.1fps。由于運動場景復雜,相對于普通USB相機,它的增益,曝光等參數調節更加便捷,且對圖像處理的速度也有顯著的提高。

圖1 系統結構框圖
整體框架采用了鋁方管立體式結構,并采用了薄壁粗鋁方,在強度足夠的情況下保持了車身的扁平化,減少了離地高度,并采用了大板材,進行合理的鏤空,方便相關模塊的布局和布線,如圖2 所示。

圖2 底盤框架
輪組部分采用了上交的聯軸器,在保證強度的同時,減少了相應的長度,采用了小搖臂,并利用soildworks 的拓撲運算功能進行了合適的減重,在轉軸處利用了擋邊軸承,減少了磨損,如圖3 所示。

圖3 輪組示意圖
對于一個性能良好的機器人來說,三軸穩定性是必不可少的,同時還需要保證在高強度的環境中,擁有精準的拋投能力。因此在本次研發中,將重點放在機構的穩定性和彈道的精度上面,并對此進行測試與改進,如圖4 所示。

圖4 云臺示意圖
云臺整體框架(見圖5)采用的是利用板搭結構實現穩定性的Y 型框架。比較U 型框架結構和Y 型框架結構,U型結構便于對云臺的零件進行擺放,擁有較大的俯仰角,其缺點是板件與連接件之間容易出現晃動現象。Y 型框架利用的板件自身的形狀去抵抗變形,因此在穩定性上面有一定的優勢。

圖5 云臺框架結構
圖6 是連桿結構進行仿真分析,對俯仰角的分析,與設計預想值幾乎一致。

圖6 連桿結構仿真分析結果
圖7 為電機在轉動一定時間后停止的所受角力矩,經分析在電機所能承受范圍內。

圖7 電機在轉動一定時間后停止的所受角力矩
Robomaster 開發板C 型采用了ST 公司的STM32F4系列微控制器作為主控芯片。該開發板具有豐富的外設和接口,包括多個PWM 輸出、編碼器輸入、CAN 總線接口、USB 接口等。此外,該開發板還提供了豐富的擴展接口,可以方便與其他模塊進行通信和連接。通過該開發板,我們可以方便地進行底盤、相機、激光雷達等各種硬件模塊的控制和交互,真正實現了機器人自主運動和識別的功能。
3.2.1 激光雷達
環境檢測重要的一步就是需要知道機器人當前處于環境的哪個位置,故我們采用激光雷達來建立地圖,從而實現自主巡邏功能。它通過發射激光束并測量激光束的反射時間和強度來掃描周圍的環境,并據此計算物體的位置和距離。它可以通過其獲取環境中物體的坐標信息,并將其轉化為地圖上對應的點或線段等幾何形狀,從而實現對環境的建模和定位。
3.2.2 MniPC
MniPC 是一種小型化的個人電腦,它作為我們機器人的控制器具有體積小、功耗低、高性能、易于編程等優點,能夠提高機器人的靈活性和工作效率。它也是我們上位機的首腦,不需要實時檢測,將數據發送至下位機,而且要監聽下位機的信息,做好實時報警的準備,以引起周圍工作人員的注意。同時也可以安裝圖傳攝像頭將畫面實時傳輸到監控室,提高工作人員的工作效率。
對于底盤的控制,機器人空間狀態控制由底盤部分C板完成,底盤程序不斷等待云臺發送的空間狀態控制指令,及底盤模式指令。并根據不同指令分別完成旋轉模式、平移模式及正常行走模式的控制。在底盤啟動過程中使用斜坡函數控制底盤起步的加速度防止輪子打滑又能有效控制功率。機器人運動過程中先對麥克納姆輪解算然后通過PID 計算控制電流值。通過功率控制算法對PID 輸出進行縮放進而實現軟件層面的功率控制。
云臺的控制,視覺識別到煙火及其他狀態下首先對獲得的視覺數據進行卡爾曼預測,并根據卡爾曼預測結果進行滅火彈丸下墜的計算:
并更新云臺目標角度。云臺控制時通過AHRS 算法結算陀螺儀數據完成云臺的PID 控制。總體運動示意圖如圖8所示。

圖8 總體運動示意圖

圖9 數據處理代碼
激光雷達和A-LOAM 都具有高精度的定位和運動估計能力,可以實現準確的自我定位和環境建模,為機器人導航和路徑規劃提供更加準確的參考數據。機器人可以使用這些信息來避開障礙物并規劃最優路徑,從而實現高效、安全的移動和任務執行,故本設計選其進行三維SLAM。
首先使用激光雷達掃描周圍環境,并獲取點云數據。激光雷達傳感器由兩部分組成,激光雷達發射系統通過多次發射激光束進行測量,層數越多則測量精度越高,但傳感器也會變得更大。當激光束擊中障礙物并反射回來時,形成了一組點云數據,這些數據實際上是根據激光束的反射時間測得的。
對點云數據進行特征提取,根據曲率和高度來識別地面點以及建非地面點。其次通過匹配不同時間戳下的點云數據,估計機器人在空間中的運動軌跡,并計算每個時間戳下相鄰兩幀之間的運動變換矩陣。將不同時間戳下的點云數據進行配準,生成一個組合的點云地圖。最后使用基于因子圖的優化方法,對機器人的位姿和地圖進行優化,以最小化所有觀測到的點云數據與預測點云數據之間的誤差。將優化后的機器人位姿和地圖更新到全局地圖中,用于后續的導航和避障。主要實現步驟如下:
①配置激光雷達參數:
sensor_msgs::LaserScan laser_scan;
laser_scan.angle_increment = angle_increment; // 激光束角度分辨率
laser_scan.angle_min = angle_min;
// 最小掃描角度
laser_scan.angle_max = angle_max;
// 最大掃描角度
laser_scan.range_min = range_min; // 最小掃描距離
laser_scan.range_max = range_max; // 最大掃描距離
②處理激光雷達數據
首先,該程序利用ROS 中的sensor_msgs::LaserScan消息訂閱激光雷達的數據,并將其轉換為pcl 庫中的點云數據格式(PCL::PointCloudpcl::PointXYZ)。 轉換過程中,遍歷每一個激光束并計算激光束對應的點的坐標,最終存儲在點云變量laser_cloud 中。其次,使用PreprocessPointCloud 函數對點云進行預處理。最后,使用Mapping 函數利用點云數據進行建圖。將每個時刻的點云數據與之前的地圖數據進行匹配,并估計機器人的軌跡;根據需要使用拓展卡爾曼濾波(Extended Kalman Filter,EKF)等算法對機器人的運動進行估計和預測。最終,建圖的結果通常是一個二維或三維的柵格地圖或點云地圖,用于機器人自主導航或環境探測。圖10 為A-Loam 建圖的結果。

圖10 構建地圖效果
為了避免人體四肢、復雜的遮擋、自相似部分以及由于著裝、體型、照明,以及許多其他因素。我們采用MediaPipe 結合OpenCV 來對人體姿態估計(預測各種人體關鍵點)。MediaPipe Pose 是一種用于高保真身體姿勢跟蹤的ML 解決方案,利用我們的BlazePose 研究從RGB視頻幀解算出全身33 個3D 地標,該研究也為ML Kit 姿勢檢測API 提供支持。為了實現對人體姿態的檢測,本設計采用對MediaPipe 的人體關節夾角來對人的位姿進行檢測。例如舉手的時候,手臂與水平方向夾角是一定大于0 度的;雙手垂下時,大臂與小臂的夾角大于0 度小于180 度,所以這樣就可以將一些基本動作分類。圖11 為雙手下垂時的檢測結果。

圖11 雙手下垂檢測畫面
接下來我們使用OpenCV 對識別到的人進行人體姿態解算。本設計采用SOLVEPNP 算法求解3D 到2D 點的運動,給定相機內參矩陣k、n 個空間點在圖像上的像素坐標pi 和它們在世界坐標系下的坐標piw,需要求解相機的位姿,即計算世界坐標系到相機坐標系的旋轉矩陣R 和平移向量T。圖12 為坐標系轉換過程。

圖12 坐標系轉換
在角度解算中,我們首先利用SOLVEPNP 函數計算出旋轉向量和平移向量,然后使用羅德里格斯公式將旋轉向量轉換為旋轉矩陣,接著使用歐拉角轉換公式將旋轉矩陣轉換為歐拉角。最終,我們就可以得到物體在相機坐標系中的位置和Yaw、Pitch 軸等角度信息。最后將角度信息和距離信息發送給下位機,使得云臺能夠實時的跟蹤目標物體。圖13 為代碼實現過程。

圖13 角度解算
對于滅火彈丸的投擲,由于距離、彈道、環境等因素的影響,彈道會產生偏差,從而導致命中率下降。為了提高命中率,使用了傳統的視覺彈道補償方案。當云臺接收到距離目標物體的距離時,結合彈丸的初速度和角度信息,推算出需要增加的Pitch 軸角度,從而能夠精準拋投實現滅火。具體實現過程如圖14 所示。

圖14 彈道補償

圖15 模型實現代碼
首先,輸入參數包括“ShootSpeed”(炮彈射出速度)、“PitchAngle”(炮彈發射角度)和“CoordinateActual”(實際彈道的三維坐標)。代碼中定義了彈丸的空氣阻力系數“KAPPA”和質量“M”。然后,根據輸入參數計算出發射點到落點的水平距離“p”和與水平面的夾角“pitchAngleRef”。接下來,將三維坐標轉換為實際的距離(將坐標值從毫米轉換為米)。然后,根據公式計算出彈丸在空氣阻力下的速度變化,并根據經典力學計算出炮彈的飛行時間和軌跡。最后,通過解方程的方式計算出調整后的發射角度“pitchAngleRef”,并返回該值。
考慮到機器人的實時性能和應用的場景,本設計采用了Yolov5 的5s 模型,它相較于其他版本和模型而言,雖然在精度方面有所降低,但在煙火檢測任務中仍然表現良好。而且Yolov5 框架提供了易于使用的API 和預訓練模型,可以更輕松地完成模型訓練和部署。煙火檢測步驟如下:
①收集1500 張帶有煙火的圖片,手動標注每個圖片中煙火的位置以及類別,我們使用開源的標注工具LabelImg。但由于標注量大,故我們選擇先標注少量數據集,再通過Yolov5 訓練一個初始的模型來輔助標注,這樣大幅縮短了工作量。
②將已經進行標注的數據集按照一定比例劃分成三個部分:訓練集、驗證集和測試集。然后使用train.py 腳本來對Yolov5模型進行訓練。同時需要定義模型架構、超參數、優化器等。
③驗證模型:首先使用torch.hub.load()函數從本地加載YOLOv5 模型,然后使用cv2.imread()函數加載待檢測的煙火圖像。接著進行預處理。將預處理后的圖像輸入模型進行檢測,得到每個檢測框的坐標、置信度和類別。最后,在原圖像上繪制檢測結果并顯示出來。
需要注意的是,訓練樣本的數量和質量、數據集的劃分、模型的超參數等都會影響模型的準確度,因此我們進行了多次實驗才找到最佳的實驗配置。圖16 為檢測效果。

圖16 煙火檢測效果
該測試成功實現了智能巡邏機器人的煙火識別功能,試驗的效果如表1、表2 所示。

表1 火焰檢測結果

表2 煙霧檢測結果
本文以當下商場安防問題為背景,設計了一款能夠自主巡邏的智能安防機器人,它搭載了電機驅動模塊、激光雷達以及視覺處理等多種模塊,實現了機器人對環境的自主監測、人體的自主跟隨、煙火的識別及自主拋投滅火等多種功能,有效解決了單靠人工和遠程監控的弊端。試驗結果表明,此機器人搭載的一個高性能的懸掛能夠在復雜的環境中靈活自主的運動,進入到人無法進入的地方進行工作,及時排除存在的安全隱患,實現了24 小時無差錯的工作,真正意義上減少了對人力物力資源的浪費。結合多個傳感器的共同作用,使機器人的智能化程度不斷提高。