實(shí)驗(yàn)效果
凌順實(shí)驗(yàn)室(lingshunlab.com)本次分享如何用ESP32連通RPLidar激光雷達(dá)(RPLidar A1 A1M8),并且通過(guò)串口輸出全部角度和輸出指定角度的距離兩種方式,觀察測(cè)量的前方障礙物的距離。
本次實(shí)驗(yàn),使用ESP32,RPLidar A1 連接ESP32的串口2(Serial2),數(shù)據(jù)在串口(Serial)中輸出,這樣就可以方便觀察數(shù)據(jù)變化。
元件說(shuō)明
最大測(cè)量范圍(m) | 最大測(cè)量頻率(Hz) | 360°掃描測(cè)距 | 適用場(chǎng)景 | 適用電壓 | 俯仰角度 |
---|---|---|---|---|---|
12 | 8000 | 支持 | 室內(nèi) | 5V | 1° |
RPLIDAR A1采用激光三角測(cè)距技術(shù),配合自主研發(fā)的高速的視覺采集處理機(jī)構(gòu), 可進(jìn)行每秒8000次以上的測(cè)距動(dòng)作。
RPLIDAR A1 的測(cè)距核心順時(shí)針旋轉(zhuǎn),可實(shí)現(xiàn)對(duì)周圍環(huán)境的360度全方位掃描測(cè)距檢測(cè), 從而獲得周圍環(huán)境的輪廓圖。
全面改進(jìn)了內(nèi)部光學(xué)和算法系統(tǒng), 采樣頻率高達(dá)8000次/秒,讓機(jī)器人能更快速、精確的建圖。
傳統(tǒng)的非固態(tài)激光雷達(dá)多采用滑環(huán)傳輸能量和數(shù)據(jù)信息,但由于存在機(jī)械磨損,其連續(xù)工作時(shí)僅有數(shù)千小時(shí)壽命。綜合無(wú)線供電和光通信技術(shù),獨(dú)創(chuàng)性的設(shè)計(jì)了光磁融合技術(shù)徹底解決了因物理接觸磨損導(dǎo)致電氣連接失效、激光雷達(dá)壽命短的問(wèn)題
可通過(guò)電機(jī)PWM信號(hào)控制雷達(dá)掃描頻率
注意:型號(hào)為A1M8
引腳說(shuō)明
引腳 | 說(shuō)明 |
---|---|
TX | RPLIDAR 測(cè)距核心串口輸出 |
RX | RPLIDAR 測(cè)距核心串口輸入 |
VCC_5V | RPLIDAR 測(cè)距核心供電 |
GND | RPLIDAR 測(cè)距核心地線 |
GND_MOTO | RPLIDAR 掃描電機(jī)地線 |
CTRL_MOTO | RPLIDAR 掃描電機(jī)使能/PWM 控制信號(hào)(高電平有效) |
5V_MOTO | RPLIDAR 掃描電機(jī)供電 |
BOM表
名稱 | 數(shù)量 |
---|---|
ESP32 | x1 |
RPLidar A1 360 激光掃描測(cè)距雷達(dá) | x1 |
面包板 | x1 |
跳線(杜邦線) | 若干 |
接線方式
ESP32 引腳 | <-> | RPLidar A1 引腳 |
---|---|---|
16 | <-> | TX |
17 | <-> | RX |
5V | <-> | VCC_5V |
GND | <-> | GND |
GND | <-> | GND_MOTO |
14 | <-> | CTRL_MOTO |
5V | <-> | 5V_MOTO |
程序提點(diǎn)
首先,需要安裝RoboPeak開發(fā)的RPlidar的Arduino庫(kù),由于在Arduino IDE的庫(kù)管理中沒(méi)有,所以需要手動(dòng)安裝。
解壓后,把「RPLidarDriver」文件夾,放在Arduino IDE 的安裝目錄下的「libraries」文件夾中,就可以使用RPLiadar的庫(kù),如果提示找不到,請(qǐng)重新檢查是否安裝正確。
然后就可以開始編程了
加載剛安裝的RPLidar庫(kù)
// 加載RPLidar庫(kù) #include
創(chuàng)建實(shí)例:
// 創(chuàng)建一個(gè)名為lidar的雷達(dá)驅(qū)動(dòng)實(shí)例 RPLidar lidar;
定義控制電機(jī)的PWM引腳:
#define RPLIDAR_MOTOR 3
綁定指定串口:
lidar.begin(Serial1);
設(shè)置控制電機(jī)的引腳為輸出模式
pinMode(RPLIDAR_MOTOR, OUTPUT);
這里ESP32和Arduino 不一樣,ESP32的PWM控制需要多幾行代碼進(jìn)行定義和使用,在這次示例中,簡(jiǎn)化了這個(gè)電機(jī)的控制速度,為HIGH,LOW控制。需要ESP32 PWM控制的,可以查看相關(guān)例子,然后自己進(jìn)行修改。
使用以下判斷可以返回lidar是否正常工作的值
IS_OK(lidar.waitPoint()
返回當(dāng)前距離值,以毫米(mm)為單位
float distance = lidar.getCurrentPoint().distance;
返回當(dāng)前角度度數(shù)
float angle = lidar.getCurrentPoint().angle;
返回該點(diǎn)是否屬于一個(gè)新的掃描點(diǎn)
bool startBit = lidar.getCurrentPoint().startBit;
返回當(dāng)前測(cè)量的質(zhì)量
byte quality = lidar.getCurrentPoint().quality;
ESP32編譯RPLidar庫(kù)時(shí)出現(xiàn)的錯(cuò)誤
選擇使用ESP32開發(fā)板程序時(shí),在編譯過(guò)程中,可能會(huì)出現(xiàn)如下錯(cuò)誤:
In member function 'bool RPLidar::begin(HardwareSerial&)'
warning: no return statement in function returning non-void [-Wreturn-type]
大概意思是RPLidar::begin()這個(gè)函數(shù)定義了是bool的返回值,但在函數(shù)里面卻沒(méi)有返回值。
為什么在使用Arduino 系列開發(fā)板沒(méi)有提示,而在ESP系列開發(fā)板會(huì)有提示?凌順實(shí)驗(yàn)室(lingshunlab.com)大概認(rèn)為是,語(yǔ)法要求ESP系列是比較嚴(yán)謹(jǐn)一些。
這時(shí),我們要修改一下RPLidar庫(kù)的兩個(gè)文件,分別是RPlidar.h和divRPlidar.cpp,把RPLidar::begin()函數(shù)的定義bool>RPlidar.cpp,把RPLidar::begin()函數(shù)的定義bool>RPlidar.cpp,把RPLidar::begin()函數(shù)的定義bool 改成 void ,定義為無(wú)返回值即可,以下圖片是修改參考:
再次編譯,錯(cuò)誤提示消失。
以下是完整的代碼,是在RPlidar的例程simple_connect為基礎(chǔ),進(jìn)行修改的。
// lingshunlab.com // https://lingshunlab.com/book/arduino/esp32-use-rplidar-a1 // This sketch code is based on the RPLIDAR driver library provided by RoboPeak // include library // 加載庫(kù) #include// 創(chuàng)建一個(gè)名為lidar的雷達(dá)驅(qū)動(dòng)實(shí)例 RPLidar lidar; #define RPLIDAR_MOTOR 14 // 用于控制 RPLIDAR 電機(jī)速度。因?yàn)镋SP32的PWM設(shè)置較復(fù)雜, // 現(xiàn)在只是簡(jiǎn)單使用HIGH,LOW進(jìn)行控制 // 該引腳應(yīng)與RPLIDAR的MOTOCTRL信號(hào)相連。 // welcome to lingshunlab.com void setup() { Serial.begin(115200); // bind the RPLIDAR driver to the arduino hardware serial // 將RPLIDAR驅(qū)動(dòng)與ESP32 的 Serial2 硬件串口綁定。 Serial2.begin(115200, SERIAL_8N1, 16, 17); while(lidar.begin(Serial2)); // set pin modes // 設(shè)置引腳模式 pinMode(RPLIDAR_MOTOR, OUTPUT); delay(1000); // 啟動(dòng)雷達(dá)轉(zhuǎn)動(dòng) digitalWrite(RPLIDAR_MOTOR, HIGH); } void loop() { if (IS_OK(lidar.waitPoint())) { float distance = lidar.getCurrentPoint().distance; //distance value in mm unit //距離值以毫米為單位 float angle = lidar.getCurrentPoint().angle; //anglue value in degree //度數(shù)的角度值 bool startBit = lidar.getCurrentPoint().startBit; //whether this point is belong to a new scan //該點(diǎn)是否屬于一個(gè)新的掃描點(diǎn) byte quality = lidar.getCurrentPoint().quality; //quality of the current measurement //當(dāng)前測(cè)量的質(zhì)量 //在這里進(jìn)行數(shù)據(jù)處理... // - 1 - // perform data processing here... // Output all data in the serial port //在串口中輸出所有數(shù)據(jù) // for(int i = 0;i < 6 - String(angle).length(); i++){ // Serial.print(" "); // } // Serial.print(String(angle)); // Serial.print(" | "); // for(int i = 0;i < 8 - String(distance).length(); i++){ // Serial.print(" "); // } // Serial.print(distance); // Serial.print(" | "); // Serial.print(startBit); // Serial.print(" | "); // for(int i = 0;i < 2 - String(quality).length(); i++){ // Serial.print(" "); // } // Serial.println(quality); // - 2 - // Output the specified angle data // 輸出指定角度 if(angle > 0 and angle < 100 ){ Serial.print(angle); Serial.print(" | "); Serial.println(distance); } } else { digitalWrite(RPLIDAR_MOTOR, LOW); //stop the rplidar motor //停止rplidar馬達(dá) // try to detect RPLIDAR... // 嘗試檢測(cè)RPLIDAR... rplidar_response_device_info_t info; if (IS_OK(lidar.getDeviceInfo(info, 100))) { // detected... // 檢測(cè)到 lidar.startScan(); // start motor rotating at max allowed speed // 啟動(dòng)電機(jī)以最大允許速度旋轉(zhuǎn) digitalWrite(RPLIDAR_MOTOR, HIGH); delay(1000); } } }
上傳完成后,可以看到指定角度輸出的數(shù)據(jù)。
審核編輯:劉清
-
激光雷達(dá)
+關(guān)注
關(guān)注
968文章
3972瀏覽量
189923 -
無(wú)線供電
+關(guān)注
關(guān)注
14文章
97瀏覽量
51076 -
RPLIDAR
+關(guān)注
關(guān)注
0文章
7瀏覽量
7760 -
ESP32
+關(guān)注
關(guān)注
18文章
971瀏覽量
17261
原文標(biāo)題:ESP32 使用RPLidar激光雷達(dá)測(cè)距(RPLidar A1 A1M8)
文章出處:【微信號(hào):凌順實(shí)驗(yàn)室,微信公眾號(hào):凌順實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論