สารบัญ:

บทช่วยสอนการตรวจจับวัตถุหุ่นยนต์ Quadruped Jetson Nano: 4 ขั้นตอน
บทช่วยสอนการตรวจจับวัตถุหุ่นยนต์ Quadruped Jetson Nano: 4 ขั้นตอน

วีดีโอ: บทช่วยสอนการตรวจจับวัตถุหุ่นยนต์ Quadruped Jetson Nano: 4 ขั้นตอน

วีดีโอ: บทช่วยสอนการตรวจจับวัตถุหุ่นยนต์ Quadruped Jetson Nano: 4 ขั้นตอน
วีดีโอ: Jetson Nano Quadruped Robot Object Detection + Teleoperation 2024, มิถุนายน
Anonim
Image
Image

Nvidia Jetson Nano เป็นชุดเครื่องมือสำหรับนักพัฒนา ซึ่งประกอบด้วย SoM (ระบบบนโมดูล) และบอร์ดผู้ให้บริการอ้างอิง โดยมีเป้าหมายหลักในการสร้างระบบฝังตัวที่ต้องการพลังการประมวลผลสูงสำหรับการเรียนรู้ของเครื่อง แมชชีนวิชัน และการประมวลผลวิดีโอ คุณสามารถรับชมรีวิวโดยละเอียดได้ที่ช่อง YouTube ของฉัน

Nvidia พยายามทำให้ Jetson Nano เป็นมิตรกับผู้ใช้และง่ายต่อการพัฒนาโครงการให้มากที่สุด พวกเขายังเปิดตัวหลักสูตรเล็ก ๆ น้อย ๆ เกี่ยวกับวิธีการสร้างหุ่นยนต์ของคุณด้วย Jetson Nano วันหลังจากเปิดตัวบอร์ด คุณสามารถดูรายละเอียดเกี่ยวกับโครงการดังกล่าวได้ที่นี่

อย่างไรก็ตาม ตัวฉันเองมีปัญหาเล็กน้อยกับ Jetbot เป็นโครงการ:

1) มันไม่เพียงพอสำหรับฉัน Jetson Nano เป็นบอร์ดที่น่าสนใจมากที่มีความสามารถในการประมวลผลที่ยอดเยี่ยม และการสร้างหุ่นยนต์ล้อธรรมดาที่ดูเหมือนเป็น … สิ่งที่ทำได้ยาก

2) การเลือกฮาร์ดแวร์ Jetbot ต้องการฮาร์ดแวร์บางอย่างที่มีราคาแพง/สามารถแทนที่ด้วยทางเลือกอื่นได้ เช่น ใช้จอยสติ๊กสำหรับการดำเนินการทางไกล ฟังดูน่าสนุก แต่ฉันจำเป็นต้องมีจอยสติ๊กเพื่อควบคุมหุ่นยนต์หรือไม่?

ดังนั้น ทันทีที่ฉันได้ใช้ Jetson Nano ฉันก็เริ่มทำงานในโครงการของตัวเอง นั่นคือ Jetspider แนวคิดคือการทำซ้ำการสาธิตขั้นพื้นฐานที่ Jetbot มี แต่มีฮาร์ดแวร์ทั่วไปมากกว่าและใช้ได้กับโครงการที่หลากหลายมากขึ้น

ขั้นตอนที่ 1: เตรียมฮาร์ดแวร์ของคุณ

เตรียมฮาร์ดแวร์ของคุณ
เตรียมฮาร์ดแวร์ของคุณ

สำหรับโครงการนี้ ฉันใช้ต้นแบบของหุ่นยนต์ Zuri quadruped รุ่นแรกๆ ที่สร้างโดย Zoobotics มันวางอยู่ทั่วไปในห้องแล็บของบริษัทเราเป็นเวลานาน ฉันติดตั้งเมาท์ไม้ที่ตัดด้วยเลเซอร์สำหรับ Jetson Nano และตัวยึดกล้อง การออกแบบของพวกเขาเป็นกรรมสิทธิ์ ดังนั้นหากคุณต้องการสร้างสิ่งที่คล้ายคลึงกันสำหรับหุ่นยนต์ Jetson Nano ของคุณ คุณสามารถดูโครงการ Meped ซึ่งคล้ายกับการออกแบบโอเพ่นซอร์สสี่ส่วน อันที่จริง เนื่องจากไม่มีใครมีซอร์สโค้ดสำหรับไมโครคอนโทรลเลอร์ของ Zuri (Arduino Mega) ในห้องแล็บของเรา ฉันจึงใช้โค้ดจาก Meped โดยมีการปรับค่าขา/เท้าเล็กน้อย

ฉันใช้เว็บแคมที่เข้ากันได้กับ USB Raspberry Pi ปกติและดองเกิล Wifi USB

ประเด็นหลักคือ เนื่องจากเราจะใช้ Pyserial สำหรับการสื่อสารแบบอนุกรมระหว่างไมโครคอนโทรลเลอร์กับ Jetson Nano ระบบของคุณจึงสามารถใช้ไมโครคอนโทรลเลอร์ได้ทุกประเภท ตราบใดที่สามารถเชื่อมต่อกับ Jetson Nano ด้วยสายเคเบิลอนุกรม USB หากหุ่นยนต์ของคุณใช้มอเตอร์กระแสตรงและตัวขับมอเตอร์ (เช่น แบบ L298P) คุณสามารถเชื่อมต่อไดรเวอร์มอเตอร์กับ Jetson Nano GPIO ได้โดยตรง แต่น่าเสียดายที่สำหรับการควบคุมเซอร์โว คุณสามารถใช้ไมโครคอนโทรลเลอร์ตัวอื่นหรือไดรเวอร์เซอร์โว I2C โดยเฉพาะ เนื่องจาก Jetson Nano ไม่มีฮาร์ดแวร์ GPIO PWM

โดยสรุป คุณสามารถใช้ประเภทของหุ่นยนต์กับไมโครคอนโทรลเลอร์ใดๆ ที่สามารถเชื่อมต่อกับ Jetson Nano โดยใช้สายเคเบิลข้อมูล USB ฉันอัปโหลดโค้ดสำหรับ Arduino Mega ไปยังที่เก็บ github สำหรับบทช่วยสอนนี้ และส่วนที่เกี่ยวข้องกับการเชื่อมต่อ Jetson Nano กับ Arduino อยู่ที่นี่:

ถ้า (Serial.available ()) {switch (Serial.read ()) {

{

กรณีที่ '1':

ซึ่งไปข้างหน้า();

หยุดพัก;

กรณีที่ '2':

กลับ();

หยุดพัก;

กรณีที่ '3':

เลี้ยวขวา();

หยุดพัก;

กรณีที่ '4':

เลี้ยวซ้าย();

หยุดพัก;

เราตรวจสอบว่ามีข้อมูลอยู่หรือไม่ และหากมี ให้ส่งต่อไปยังโครงสร้างการควบคุมกรณีสวิตช์ โปรดทราบว่าข้อมูลจากอนุกรมมาเป็นอักขระ สังเกตเครื่องหมายอัญประกาศเดี่ยวรอบตัวเลข 1, 2, 3, 4

ขั้นตอนที่ 2: ติดตั้งแพ็คเกจที่จำเป็น

โชคดีสำหรับเรา อิมเมจระบบเริ่มต้นของ Jetson Nano มาพร้อมกับสิ่งต่างๆ มากมายที่ติดตั้งไว้ล่วงหน้า (เช่น OpenCV, TensorRT เป็นต้น) ดังนั้นเราจึงจำเป็นต้องติดตั้งแพ็คเกจอื่นสองสามตัวเพื่อให้โค้ดใช้งานได้และเปิดใช้งาน SSH

เริ่มต้นด้วยการเปิดใช้งาน SSH ในกรณีที่คุณต้องการทำงานที่เหลือทั้งหมดจากระยะไกล

sudo apt อัปเดต

sudo apt ติดตั้ง openssh-server

เซิร์ฟเวอร์ SSH จะเริ่มทำงานโดยอัตโนมัติ

ในการเชื่อมต่อกับเครื่อง Ubuntu ของคุณผ่าน LAN คุณจะต้องป้อนคำสั่งต่อไปนี้:

ssh username@ip_address

หากคุณมีเครื่อง Windows คุณจะต้องติดตั้งไคลเอ็นต์ SSH เช่น Putty

เริ่มต้นด้วยการติดตั้ง Python Package Manager(pip) และ Pillow สำหรับการปรับแต่งภาพ

sudo apt ติดตั้ง python3-pip python3-pil

จากนั้นเราจะติดตั้งที่เก็บ Jetbot เนื่องจากเราใช้เฟรมเวิร์กบางส่วนในการตรวจจับวัตถุ

sudo apt ติดตั้ง python3-smbus python-pyserial

โคลน git

cd jetbot

sudo apt-get install cmake

sudo python3 setup.py ติดตั้ง

ในที่สุด โคลนที่เก็บ Github ของฉันสำหรับโครงการนี้ไปยังโฟลเดอร์หลักของคุณ และติดตั้ง Flask และแพ็คเกจอื่นๆ สำหรับการควบคุมระยะไกลของหุ่นยนต์โดยใช้เว็บเซิร์ฟเวอร์

โคลน git

ซีดี

sudo pip3 ติดตั้ง -r ข้อกำหนด-opencv

ดาวน์โหลดโมเดล SSD (Single Shot Detector) ที่ผ่านการฝึกอบรมล่วงหน้าจากลิงก์นี้ และวางไว้ในโฟลเดอร์ jetspider_demos

ตอนนี้เราไปได้ดีแล้ว!

ขั้นตอนที่ 3: เรียกใช้รหัส

เรียกใช้รหัส
เรียกใช้รหัส

ฉันทำการสาธิตสองครั้งสำหรับ Jetspider อันแรกเป็นการ teleopration แบบง่าย ๆ คล้ายกับที่ฉันทำก่อนหน้านี้สำหรับ Banana Pi rover และอันที่สองใช้ TensorRT สำหรับการตรวจจับวัตถุและส่งคำสั่งการเคลื่อนไหวผ่านการเชื่อมต่อแบบอนุกรมไปยังไมโครคอนโทรลเลอร์.

เนื่องจากโค้ด teleopration ส่วนใหญ่ได้อธิบายไว้ในบทช่วยสอนอื่นๆ ของฉัน (ฉันได้ทำการปรับแต่งเล็กน้อยเท่านั้น โดยจะลดระดับการส่งสัญญาณวิดีโอใหม่) ที่นี่ ฉันจะเน้นที่ส่วนการตรวจจับวัตถุ

สคริปต์หลักสำหรับวัตถุที่ตามมาคือ object_following.py ใน jetspider_object_following สำหรับ teleoperation คือ spider_teleop.py ใน jetspider_teleoperation

สคริปต์ที่ตามมาของอ็อบเจ็กต์เริ่มต้นด้วยการนำเข้าโมดูลที่จำเป็นและประกาศตัวแปรและอินสแตนซ์ของคลาส จากนั้นเราเริ่มเว็บเซิร์ฟเวอร์ Flask ด้วยบรรทัดนี้

app.run(host='0.0.0.0', threaded=True)

ทันทีที่เราเปิดที่อยู่ 0.0.0.0 (localhost) ในเว็บเบราว์เซอร์ของเราหรือที่อยู่ Jetson Nano บนเครือข่าย (สามารถตรวจสอบได้ด้วยคำสั่ง ifconfig) ฟังก์ชันนี้จะถูกดำเนินการ

ดัชนี def ():

มันแสดงเทมเพลตหน้าเว็บที่เรามีในโฟลเดอร์เทมเพลต เทมเพลตมีแหล่งที่มาของวิดีโอฝังอยู่ ดังนั้นเมื่อโหลดเสร็จแล้ว def video_feed(): จะถูกดำเนินการ ซึ่งจะส่งคืนออบเจกต์ Response ที่เริ่มต้นด้วยฟังก์ชันตัวสร้าง

เคล็ดลับในการใช้การอัปเดตแบบแทนที่ (การอัปเดตรูปภาพในหน้าเว็บสำหรับสตรีมวิดีโอของเรา) คือการใช้การตอบสนองแบบหลายส่วน การตอบสนองแบบหลายส่วนประกอบด้วยส่วนหัวที่มีประเภทเนื้อหาแบบหลายส่วนประเภทใดประเภทหนึ่ง ตามด้วยส่วนต่างๆ คั่นด้วยเครื่องหมายขอบเขต และแต่ละรายการมีประเภทเนื้อหาเฉพาะส่วนของตนเอง

ใน def gen(): ฟังก์ชั่นเราใช้ฟังก์ชันตัวสร้างในลูปอนันต์ซึ่งจับภาพส่งไปที่ def ดำเนินการ (img): ฟังก์ชั่นให้ภาพที่จะส่งไปยังหน้าเว็บหลังจากนั้น

def execute(img): ฟังก์ชั่นเป็นที่ที่เวทย์มนตร์เกิดขึ้น มันใช้รูปภาพ ปรับขนาดด้วย OpenCV และส่งผ่านไปยัง "โมเดล" คลาสอินสแตนซ์ของ Jetbot ObjectDetector ส่งคืนรายการการตรวจจับ และเราใช้ OpenCV เพื่อวาดสี่เหลี่ยมสีน้ำเงินรอบๆ และเขียนคำอธิบายประกอบด้วยคลาสที่ตรวจพบวัตถุ หลังจากนั้นเราตรวจสอบว่ามีวัตถุที่เราสนใจหรือไม่ที่ตรวจพบการจับคู่_detections = [d สำหรับ d ในการตรวจจับ[0] ถ้า d['label'] == 53]

คุณสามารถเปลี่ยนหมายเลขนั้น (53) เป็นหมายเลขอื่นจากชุดข้อมูล CoCo หากคุณต้องการให้หุ่นยนต์ของคุณติดตามวัตถุอื่น 53 คือแอปเปิ้ล รายการทั้งหมดอยู่ในไฟล์ types.py

สุดท้าย หากตรวจไม่พบวัตถุใดๆ เป็นเวลา 5 วินาที เราจะส่งอักขระ "5" เพื่อให้หุ่นยนต์หยุดเหนือซีเรียล หากพบวัตถุ เราจะคำนวณว่าวัตถุนั้นอยู่ห่างจากศูนย์กลางของภาพเท่าใดและดำเนินการตามนั้น (หากอยู่ใกล้ศูนย์กลาง ให้เดินตรงไป (อักขระ "1" ในอนุกรม) หากอยู่ทางซ้าย ให้ไปทางซ้าย เป็นต้น) คุณสามารถเล่นกับค่าเหล่านั้นเพื่อกำหนดสิ่งที่ดีที่สุดสำหรับการตั้งค่าเฉพาะของคุณ!

ขั้นตอนที่ 4: ความคิดสุดท้าย

ความคิดสุดท้าย
ความคิดสุดท้าย

นี่คือส่วนสำคัญของการสาธิต ObjectFollowing หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการสตรีมวิดีโอเว็บเซิร์ฟเวอร์ของ Flask คุณสามารถดูบทช่วยสอนที่ยอดเยี่ยมนี้โดย Miguel Grinberg

คุณสามารถดูโน้ตบุ๊ก Nvidia Jetbot Object Detection ได้ที่นี่

ฉันหวังว่าการสาธิต Jetbot ของฉันจะช่วยสร้างหุ่นยนต์ของคุณโดยใช้กรอบงาน Jetbot ฉันไม่ได้ใช้การสาธิตการหลีกเลี่ยงสิ่งกีดขวาง เนื่องจากฉันคิดว่าการเลือกแบบจำลองจะไม่ให้ผลลัพธ์การหลีกเลี่ยงสิ่งกีดขวางที่ดี

เพิ่มฉันใน LinkedId หากคุณมีคำถามใดๆ และสมัครรับข้อมูลจากช่อง YouTube ของฉัน เพื่อรับการแจ้งเตือนเกี่ยวกับโครงการที่น่าสนใจอื่นๆ ที่เกี่ยวข้องกับการเรียนรู้ของเครื่องและหุ่นยนต์

แนะนำ: