สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ขับเคลื่อนโดย Raspberry Pi 3, การจดจำวัตถุ Open CV, เซ็นเซอร์อัลตราโซนิกและมอเตอร์ DC แบบมีเกียร์ รถแลนด์โรเวอร์นี้สามารถติดตามวัตถุใด ๆ ที่ได้รับการฝึกฝนและเคลื่อนที่บนภูมิประเทศใดก็ได้
ขั้นตอนที่ 1: บทนำ
ในคำแนะนำนี้ เราจะสร้าง Autonomous Mars Rover ที่สามารถจดจำวัตถุและติดตามวัตถุโดยใช้ซอฟต์แวร์ Open CV ที่ทำงานบน Raspberry Pi 3 พร้อมตัวเลือกในการใช้อุปกรณ์เว็บแคมหรือกล้อง Raspberry Pi ดั้งเดิม นอกจากนี้ยังติดตั้งเซ็นเซอร์อัลตราโซนิกบนเซอร์โวเพื่อติดตามเส้นทางในสภาพแวดล้อมที่มืดซึ่งกล้องไม่ทำงาน สัญญาณที่ได้รับจาก Pi จะถูกส่งไปยังตัวขับมอเตอร์ IC (L293D) ซึ่งขับเคลื่อนมอเตอร์ DC ขนาด 4 x 150RPM ที่ติดตั้งบนตัวเครื่องที่สร้างด้วยท่อพีวีซี
ขั้นตอนที่ 2: วัสดุและซอฟต์แวร์ที่จำเป็น
วัสดุที่จำเป็น
- Raspberry Pi (อะไรก็ได้ยกเว้นศูนย์)
- กล้อง Raspberry PI หรือเว็บแคม
- L293D ตัวขับมอเตอร์ IC
- ล้อหุ่นยนต์ (7x4cm) X 4
- มอเตอร์ DC แบบมีเกียร์ (150RPM) X 4
- ท่อพีวีซีสำหรับแชสซี
ซอฟต์แวร์ที่จำเป็น
- สีโป๊วสำหรับ SSH ing the Pi
- เปิด CV สำหรับการจดจำวัตถุ
ขั้นตอนที่ 3: สร้าง Rover Chassis
ในการสร้างแชสซี PVC คุณจะต้อง
- 2X8"
- 2 X 4"
- 4 T-Joints
วางท่อพีวีซีในลักษณะคล้ายบันได แล้วสอดเข้าไปในข้อต่อตัวที คุณอาจใช้กาวพีวีซีเพื่อทำให้ข้อต่อแข็งแรงขึ้น
มอเตอร์กระแสตรงแบบมีเกียร์เชื่อมต่อกับโครงท่อพีวีซีโดยใช้ที่หนีบ จากนั้นล้อจะเชื่อมต่อกับมอเตอร์โดยใช้สกรู
ขั้นตอนที่ 4: การสร้างแอสเซมบลีเรนจ์ไฟอัลตราโซนิก
แอสเซมบลีของตัวค้นหาช่วงอัลตราโซนิกสร้างขึ้นโดยใช้เซ็นเซอร์อัลตราโซนิก HC-SR04 ที่เชื่อมต่อกับมอเตอร์ไมโครเซอร์โว สายเคเบิลเชื่อมต่อกับเซ็นเซอร์อัลตราโซนิกล่วงหน้าก่อนที่จะใส่ในกล่องพลาสติกที่เชื่อมต่อกับเซอร์โวมอเตอร์ด้วยสกรู
ขั้นตอนที่ 5: แผนผังและการเชื่อมต่อไฟฟ้า
กรุณาทำการเชื่อมต่อทางไฟฟ้าตามแผนภาพวงจรที่แนบมา
ขั้นตอนที่ 6: การติดตั้ง SSH และ Open CV
ตอนนี้ เราต้อง SSH ลงใน raspberry pi ของเรา เพื่อติดตั้งซอฟต์แวร์ที่จำเป็น เราจะเริ่มต้นด้วย SSHing กับ Raspberry Pi ของเรา ตรวจสอบให้แน่ใจว่า Pi ของคุณเชื่อมต่อกับเราเตอร์เดียวกันกับพีซีของคุณและคุณรู้ว่าเป็นที่อยู่ IP ที่กำหนดโดยเราเตอร์ของคุณ ตอนนี้ ให้เปิดพรอมต์คำสั่งหรือ PUTTY หากคุณใช้ Windows และเรียกใช้คำสั่งต่อไปนี้
IP ของ Pi ของคุณอาจแตกต่างกัน ของฉันคือ 192.168.1.6
ตอนนี้ ป้อนรหัสผ่านเริ่มต้นของคุณ - "ราสเบอร์รี่"
ตอนนี้ คุณมี SSH ใน Pi ของคุณแล้ว มาเริ่มด้วยการอัพเดตด้วยคำสั่งนี้กัน
sudo apt-get update && sudo apt-get upgrade
มาติดตั้งเครื่องมือสำหรับนักพัฒนาที่จำเป็นกันเถอะ
sudo apt-get ติดตั้ง build-essential cmake pkg-config
ต่อไป เราต้องติดตั้งแพ็คเกจอิมเมจ I/O เพื่อช่วยให้ Pi ของเราดึงรูปแบบรูปภาพต่างๆ จากดิสก์
sudo apt-get ติดตั้ง libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
ตอนนี้ แพ็คเกจบางส่วนสำหรับการดึงวิดีโอ สตรีมมิงแบบสด และเพิ่มประสิทธิภาพการทำงานของ OpenCV
sudo apt-get ติดตั้ง libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get ติดตั้ง libxvidcore-dev libx264-dev
sudo apt-get ติดตั้ง libgtk2.0-dev libgtk-3-dev
sudo apt-get ติดตั้ง libatlas-base-dev gfortran
เรายังต้องติดตั้งไฟล์ส่วนหัว Python 2.7 และ Python 3 เพื่อให้เราสามารถรวบรวม OpenCV ด้วยการผูกหลาม
sudo apt-get ติดตั้ง python2.7-dev python3-dev
กำลังดาวน์โหลดซอร์สโค้ด OpenCV
ซีดี ~
wget -O opencv.zip
เปิดเครื่องรูด opencv.zip
กำลังดาวน์โหลดที่เก็บ opencv_contrib
wget -O opencv_contrib.zip
เปิดเครื่องรูด opencv_contrib.zip
ขอแนะนำให้ใช้สภาพแวดล้อมเสมือนในการติดตั้ง OpenCV
sudo pip ติดตั้ง virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip
ตอนนี้ virtualenv และ virtualenvwrapper ได้รับการติดตั้งแล้ว เราจำเป็นต้องอัปเดต ~/.profile เพื่อรวมบรรทัดต่อไปนี้ไว้ที่ด้านล่าง
export WORKON_HOME=$HOME/.virtualenvs ส่งออก VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 แหล่งที่มา /usr/local/bin/virtualenvwrapper.sh
สร้างสภาพแวดล้อมเสมือนหลามของคุณ
mkvirtualenv cv -p python2
เปลี่ยนไปใช้สภาพแวดล้อมเสมือนที่สร้างขึ้น
ที่มา ~/.profile
งาน cv
กำลังติดตั้ง NumPy
pip ติดตั้ง numpy
รวบรวมและติดตั้ง OpenCV
cd ~/opencv-3.3.0/
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE / -D CMAKE_INSTALL_PREFIX=/usr/local / -D INSTALL_PYTHON_EXAMPLES=ON / -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules / -DLES BUILD_.
ในที่สุดคอมไพล์ OpenCV
ทำให้ -j4
หลังจากคำสั่งนี้ทำงานเสร็จ สิ่งที่คุณต้องทำคือติดตั้ง
sudo make config
sudo ldconfig
ขั้นตอนที่ 7: เรียกใช้รหัส Python สำหรับ Rover
สร้างไฟล์ Python ชื่อ tracker.py และเพิ่มโค้ดต่อไปนี้ลงไป
sudo nano tracker.py
รหัส:-
#โปรแกรมASAR
#โปรแกรมนี้ติดตามลูกบอลสีแดงและสั่งให้พายราสเบอร์รี่ทำตาม นำเข้า sys sys.path.append ('/usr/local/lib/python2.7/site-packages') นำเข้า cv2 นำเข้าจำนวนเป็น np นำเข้าระบบปฏิบัติการ นำเข้า RPi. GPIO เป็น IO IO.setmode (IO. BOARD) IO.setup (7, IO. OUT) IO.setup(15, IO. OUT) IO.setup(13, IO. OUT) IO.setup(21, IO. OUT) IO.setup(22, IO. OUT) def fwd()): IO.output(21, 1)#Left Motor Forward IO.output(22, 0) IO.output(13, 1)#Right Motor ไปข้างหน้า IO.output(15, 0) def bac(): IO.output (21, 0)#Left Motor ย้อนกลับ IO.output(22, 1) IO.output(13, 0)#Right Motor reverse IO.output(15, 1) def ryt(): IO.output(21, 0) #Left Motor ย้อนกลับ IO.output(22, 1) IO.output(13, 1)#Right Motor forward IO.output(15, 0) def lft(): IO.output(21, 1)#Left Motor forward IO.output(22, 0) IO.output(13, 0)#Right Motor ย้อนกลับ IO.output(15, 1) def stp(): IO.output(21, 0)#Left Motor stop IO.output(22, 0) IO.output(13, 0)#Right Motor หยุด IO.output(15, 0) ############################ ####################################################### ##################### def main(): capWebcam = cv2. VideoCapture(0) # ประกาศ วัตถุ VideoCapture และเชื่อมโยงกับเว็บแคม 0 => ใช้เว็บแคมที่ 1 # แสดงความละเอียดดั้งเดิมพิมพ์ "ความละเอียดเริ่มต้น = " + str (capWebcam.get(cv2. CAP_PROP_FRAME_WIDTH)) + "x" + str (capWebcam.get (cv2. CAP_PROP_FRAME_HEIGHT)) capWebcam.set(cv2. CAP_PROP_FRAME_WIDTH, 320.0) # เปลี่ยนความละเอียดเป็น 320x240 เพื่อการประมวลผลที่เร็วขึ้น) + "x" + str(capWebcam.get(cv2. CAP_PROP_FRAME_HEIGHT)) ถ้า capWebcam.isOpened() == False: # ตรวจสอบว่าวัตถุ VideoCapture เชื่อมโยงกับเว็บแคมสำเร็จหรือไม่ พิมพ์ "ข้อผิดพลาด: capWebcam ไม่สามารถเข้าถึงได้สำเร็จ\n\n" # ถ้าไม่ใช่ ให้พิมพ์ข้อความแสดงข้อผิดพลาดไปที่ std out os.system("pause") # หยุดชั่วคราวจนกว่าผู้ใช้จะกดปุ่มเพื่อให้ผู้ใช้เห็นข้อความแสดงข้อผิดพลาด return # และฟังก์ชันออก (ซึ่งออกจากโปรแกรม) # end if while cv2.waitKey(1)) != 27 และ capWebcam.isOpened(): # จนกว่าจะกดปุ่ม Esc หรือการเชื่อมต่อเว็บแคมหายไป blnFrameReadSuccessf ully, imgOriginal = capWebcam.read() # read next frame if not blnFrameReadSuccessfully or imgOriginal is none: # if frame is not benot be read Successed ประสบความสำเร็จพิมพ์ "error: frame not read from webcam\n" # print error message to std out os.system ("หยุดชั่วคราว") # หยุดชั่วคราวจนกว่าผู้ใช้จะกดปุ่มเพื่อให้ผู้ใช้เห็นข้อความแสดงข้อผิดพลาดแตก # exit while loop (ซึ่งออกจากโปรแกรม) # end if imgHSV = cv2.cvtColor(imgOriginal, cv2. COLOR_BGR2HSV) imgThreshLow = cv2.inRange(imgHSV), np.array([0, 135, 135]), np.array([18, 255, 255])) imgThreshHigh = cv2.inRange(imgHSV, np.array([165, 135, 135]), np. array([179, 255, 255)) imgThresh = cv2.add(imgThreshLow, imgThreshHigh) imgThresh = cv2. GaussianBlur(imgThresh, (3, 3), 2) imgThresh = cv2.dilate(imgThresh, np.ones((5, 5), np.uint8)) imgThresh = cv2.erode(imgThresh, np.ones((5, 5), np.uint8)) intRows, intColumns = imgThresh.shape circles = cv2. HoughCircles(imgThresh, cv2. HOUGH_GRADIENT, 5, intRows / 4) # เติมวงกลมตัวแปรด้วยวงกลมทั้งหมดในภาพที่ประมวลผลถ้าวงกลม ไม่ใช่ไม่มี: # บรรทัดนี้จำเป็นเพื่อป้องกันไม่ให้โปรแกรมหยุดทำงานในบรรทัดถัดไป หากไม่พบวงกลม IO.output(7, 1) สำหรับวงกลมในวงกลม[0]: # สำหรับแต่ละวงกลม x, y, รัศมี = วงกลม # แยก x, y และรัศมีพิมพ์ "ตำแหน่งลูก x = " + str(x) + ", y = " + str(y) + ", รัศมี = " + str(รัศมี) # พิมพ์ตำแหน่งลูกและรัศมี obRadius = int(รัศมี) xAxis = int(x) ถ้า obRadius>0 & obRadius100&xAxis180: print("Moving Right") ryt() elif xAxis<100: print("Moving Left") lft() else: stp() else: stp () cv2.circle(imgOriginal, (x, y), 3, (0, 255, 0), -1) # วาดวงกลมสีเขียวขนาดเล็กที่ศูนย์กลางของวัตถุที่ตรวจพบ cv2.circle(imgOriginal, (x, y), รัศมี, (0, 0, 255), 3) # วาดวงกลมสีแดงรอบ ๆ วัตถุที่ตรวจพบ # end สำหรับ # end if else: IO.output(7, 0) cv2.namedWindow("imgOriginal", cv2. WINDOW_AUTOSIZE) # create windows, ใช้ WINDOW_AUTOSIZE สำหรับขนาดหน้าต่างคงที่ cv2.namedWindow("imgThresh", cv2. WINDOW_AUTOSIZE) # หรือใช้ WINDOW_NORMAL เพื่ออนุญาตให้ปรับขนาดหน้าต่าง cv2.imshow("imgOriginal", imgOri ginal) # แสดง windows cv2.imshow ("imgThresh", imgThresh) # สิ้นสุดในขณะที่ cv2.destroyAllWindows () # ลบหน้าต่างออกจากหน่วยความจำที่ส่งคืน ######################## ####################################################### ############################ ถ้า _name_ == "_main_": main()
ตอนนี้เหลือเพียงเรียกใช้โปรแกรม
หลาม tracker.py
ยินดีด้วย! รถแลนด์โรเวอร์ที่ขับเคลื่อนด้วยตนเองของคุณพร้อมแล้ว! ส่วนการนำทางที่ใช้เซ็นเซอร์อัลตราโซนิกจะแล้วเสร็จในไม่ช้าและฉันจะอัปเดตคำแนะนำนี้
ขอบคุณที่อ่าน!