# ๐Ÿš OPI-YOLO โ€” ๆ˜‡่…พ NPU ๆ— ไบบๆœบ็›ฎๆ ‡ๆฃ€ๆต‹ไธŽ้—ญ็ŽฏๆŽงๅˆถ็ณป็ปŸ > **็กฌไปถๅนณๅฐ๏ผš** ้ฆ™ๆฉ™ๆดพ AI Pro๏ผˆOrange Pi AI Pro๏ผ‰๏ฝœ**ๅŠ ้€Ÿๅ•ๅ…ƒ๏ผš** ๅŽไธบๆ˜‡่…พ Ascend NPU > **้€šไฟกๅ่ฎฎ๏ผš** ZeroMQ Router/Dealer ๆžถๆž„ ๏ฝœ **้ฃžๆŽงๅ่ฎฎ๏ผš** MAVLink๏ผˆPX4 / ArduPilot๏ผ‰ > **ๆฃ€ๆต‹ๆจกๅž‹๏ผš** YOLOv26n ๏ฝœ **้ƒจ็ฝฒๆ–นๅผ๏ผš** ais_bench (ๆ˜‡่…พๆŽจ็† SDK) --- > [!IMPORTANT] > **โšก AI ๅผ€ๅ‘่€…ๆณจๆ„** > ๆœฌ้กน็›ฎๅทฒๅปบ็ซ‹็Žฐๆˆ็š„ `.codegraph` ไปฃ็ ๅ›พ่ฐฑ็ดขๅผ•ใ€‚ๅŽ็ปญไปปไฝ• AI ่พ…ๅŠฉๅทฅๅ…ทๆŽฅๅ…ฅๆ—ถ๏ผŒ่ฏท**ไผ˜ๅ…ˆไฝฟ็”จ `codegraph_explore` ็ญ‰ๅทฅๅ…ท**่ฏปๅ–่ฏฅๆ•ฐๆฎๅบ“ไปฅ่Žทๅพ—ๅ…จๅฑ€ไปฃ็ ๆ„Ÿ็Ÿฅ่ƒฝๅŠ›๏ผŒๅˆ‡ๅ‹ฟ้‡ๅค็”Ÿๆˆ็‹ฌ็ซ‹็ดขๅผ•ใ€‚็ดขๅผ•่ฆ†็›– 28 ไธชๆ–‡ไปถใ€452 ไธช็ฌฆๅท่Š‚็‚นใ€708 ๆกไพ่ต–่พนใ€‚ --- ## ๐Ÿ“‹ ็›ฎๅฝ• - [้กน็›ฎ็ฎ€ไป‹](#-้กน็›ฎ็ฎ€ไป‹) - [็ณป็ปŸๆžถๆž„](#-็ณป็ปŸๆžถๆž„) - [ๆจกๅ—่ฏดๆ˜Ž](#-ๆจกๅ—่ฏดๆ˜Ž) - [็Šถๆ€ๆœบๆต็จ‹](#-็Šถๆ€ๆœบๆต็จ‹) - [ๅฟซ้€Ÿๅผ€ๅง‹](#-ๅฟซ้€Ÿๅผ€ๅง‹) - [็Žฏๅขƒ่ฆๆฑ‚ไธŽไพ่ต–](#-็Žฏๅขƒ่ฆๆฑ‚ไธŽไพ่ต–) - [็›ฎๅฝ•็ป“ๆž„](#-็›ฎๅฝ•็ป“ๆž„) - [ๅ…่ดฃๅฃฐๆ˜Ž](#-ๅ…่ดฃๅฃฐๆ˜Ž) --- ## ๐ŸŽฏ ้กน็›ฎ็ฎ€ไป‹ ๆœฌ้กน็›ฎๅฎž็Žฐไบ†ไธ€ๅฅ—**ๅŸบไบŽๆœบ่ฝฝ NPU ็กฌไปถๅŠ ้€Ÿ็š„ๆ— ไบบๆœบๅฎžๆ—ถ็›ฎๆ ‡ๆฃ€ๆต‹ไธŽ่ง†่ง‰้—ญ็ŽฏๆŽงๅˆถ็ณป็ปŸ**๏ผŒๅœจ้ฆ™ๆฉ™ๆดพ AI Pro๏ผˆๆ˜‡่…พๅนณๅฐ๏ผ‰ไธŠๅ…จ้€Ÿ่ฟ่กŒใ€‚ **ๆ ธๅฟƒๅทฅไฝœๆต๏ผš** ``` ๆ‘„ๅƒๅคด/RTSP ่ง†้ข‘ๆต โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ VideoStreaming โ”‚ โ”€โ”€โ–บ โ”‚ YOLO26UAVInfer โ”‚ โ”‚ ๅธง้‡‡้›† + ๅ›พไผ  โ”‚ โ”‚ NPU ๆŽจ็† + ๅŽๅค„็† โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ ๆฃ€ๆต‹็ป“ๆžœ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ MissionManager โ”‚ โ—„โ”€โ”€ โ”‚ TargetTracker โ”‚ โ”‚ ไปปๅŠก็Šถๆ€ๆœบ โ”‚ โ”‚ ๅกๅฐ”ๆ›ผๆปคๆณข+Coast โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ ่ฟฝ่ธชๅๆ ‡ โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ UAVControlLoop (20Hz) โ”‚ โ”‚ PID โ†’ VELOCITY SETPOINT โ†’ RouterProxy โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ PX4 / ArduPilot ้ฃžๆŽง ``` **ๅ…ณ้”ฎ่ฎพ่ฎก็†ๅฟต๏ผš** - **่งฃ่€ฆ้€šไฟกๅฑ‚**๏ผš้€š่ฟ‡ ZeroMQ Router ไปฃ็†้š”็ฆป Python ๆŽงๅˆถๅฑ‚ไธŽ MAVLink ๅบ•ๅฑ‚ - **ๅผ‚ๆญฅๆตๆฐด็บฟ**๏ผš่ง†้ข‘้‡‡้›†ใ€NPU ๆŽจ็†ใ€UDP ๅ›พไผ ใ€้ฃžๆŽงๆŽงๅˆถๅˆ†ๅฑž็‹ฌ็ซ‹็บฟ็จ‹ - **ๅฎ‰ๅ…จไผ˜ๅ…ˆ**๏ผš้˜ฒๆ–ญๆตๅˆน่ฝฆ๏ผˆ500ms๏ผ‰ใ€ๅกๅฐ”ๆ›ผ Coast ้ข„ๆต‹ใ€PID ็งฏๅˆ†ๆธ…็ฉบใ€Failsafe ็†”ๆ–ญ --- ## ๐Ÿ— ็ณป็ปŸๆžถๆž„ ### ๆ•ดไฝ“ๆžถๆž„ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ MissionOrchestrator โ”‚ โ”‚ run_mission.py โ€” ๅ…จไปปๅŠก็ผ–ๆŽ’ๅ™จ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ MissionManager โ”‚ โ”‚ UAVControlLoop โ”‚ โ”‚ โ”‚ โ”‚ ่ˆช็‚นๅทก่ˆช็Šถๆ€ๆœบ โ”‚ โ”‚ 20Hz VELOCITY ้—ญ็Žฏ โ”‚ โ”‚ โ”‚ โ”‚ POSITION SETPOINTโ”‚ โ”‚ PID + TargetTracker โ”‚ โ”‚ โ”‚ โ”‚ (้ž่ฟฝ่ธชๆœŸ้—ด) โ”‚ โ”‚ (VISUAL_TRACKING ๆœŸ้—ด) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ RouterProxy (ZMQ) โ”‚ ๅ…ฑไบซ ZeroMQ ไปฃ็† โ”‚ โ”‚ โ”‚ REQ + SUB ๅŒ้€š้“ โ”‚ ไธŽ PX4 Router ้€šไฟก โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ ZMQ Router (ๆœบ่ฝฝ) โ”‚ ๅ่ฎฎ่ฝฌๆขๅฑ‚ โ”‚ โ”‚ โ”‚ โ†โ†’ PX4 MAVLink โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ VideoStreaming โ”‚ โ”‚ YOLO26UAVInfer โ”‚ โ”‚ โ”‚ โ”‚ ๆ‘„ๅƒๅคด/RTSP ้‡‡้›† โ”‚ โ”‚ ๆ˜‡่…พ NPU ็กฌไปถๆŽจ็† โ”‚ โ”‚ โ”‚ โ”‚ UDP ๅ›พไผ ๅ‘้€ โ”‚ โ”‚ letterbox + ๅŽๅค„็† โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### ้€šไฟกๆžถๆž„ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ้ฆ™ๆฉ™ๆดพ AI Pro โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Python โ”‚โ”€โ”€โ–บ โ”‚ ZeroMQ REQ โ”‚โ”€โ”€โ–บ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ๆŽงๅˆถๅฑ‚ โ”‚ โ”‚ :5555 โ”‚ โ”‚ Router โ”‚ โ”‚ โ”‚ โ”‚ โ”‚โ—„โ”€โ”€ โ”‚ ACK ๅ›žๆ‰ง โ”‚โ—„โ”€โ”€ โ”‚ ไปฃ็† โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ (C++/Rust) โ”‚โ”€โ”€โ–บ PX4 โ”‚ โ”‚ โ”‚โ—„โ”€โ”€ โ”‚ ZeroMQ SUB โ”‚โ—„โ”€โ”€ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ :5556 โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ RTSP โ”‚โ”€โ”€โ–บ โ”‚ VideoStream โ”‚โ”€โ”€โ–บ UDP :9999 โ†’ ๅœฐ้ข็ซ™ โ”‚ โ”‚ โ”‚ ๆ‘„ๅƒๅคด โ”‚ โ”‚ + ๆŽจ็† โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### ๆถˆๆฏๅ่ฎฎ | type | ๆ–นๅ‘ | ้€š้“ | ้ข‘็އ | ่ฏดๆ˜Ž | |------|------|------|------|------| | `SETPOINT` | Python โ†’ Router | REQ | 20Hz | ๅฎžๆ—ถ Offboard ๆŽงๅˆถ | | `WAYPOINT` | Python โ†’ Router | REQ | ๆŒ‰้œ€ | ่ˆช็‚น้ฃž่กŒ | | `COMMAND` | Python โ†’ Router | REQ | ๆŒ‰้œ€ | ARM / OFFBOARD / LAND / RTL | | `QUERY` | Python โ†’ Router | REQ | ๆŒ‰้œ€ | ๆŸฅ่ฏข HOME_POSITION | | `STATE` | Router โ†’ Python | SUB | 10Hz | ้ฃžๆœบ็Šถๆ€ๆŽจ้€ | | `ALERT` | Router โ†’ Python | SUB | ๆŒ‰้œ€ | ็ดงๆ€ฅๅ‘Š่ญฆ | | `PX4_ACK` | Router โ†’ Python | SUB | ๆŒ‰้œ€ | COMMAND_ACK ่ฝฌๅ‘ | > ่ฏฆ็ป†ๅ่ฎฎ่ง„่Œƒ่ง [`python_protocol.md`](./python_protocol.md) ### ๆŽงๅˆถๆƒๅ่ฐƒ่ง„ๅˆ™ ๅŒไธ€ๆ—ถๅˆปๅชๆœ‰ไธ€ๆ–นๆŒๆœ‰ **SETPOINT ๅ‘ไปคๆƒ**๏ผš | ็Šถๆ€ๆœบ็Šถๆ€ | ๆŽงๅˆถ่€… | ๆŽงๅˆถๆจกๅผ | |-----------|--------|---------| | ้ž `VISUAL_TRACKING` | MissionManager | POSITION๏ผˆ็ป็บฌๅบฆ lat/lon + ้ซ˜ๅบฆ๏ผ‰ | | `VISUAL_TRACKING` | UAVControlLoop | VELOCITY๏ผˆๆœบไฝ“้€Ÿๅบฆ m/s๏ผ‰ | --- ## ๐Ÿ”ง ๆจกๅ—่ฏดๆ˜Ž ### ๆ ธๅฟƒๅ…ฅๅฃ | ๆ–‡ไปถ | ่ฏดๆ˜Ž | |------|------| | `run_mission.py` | **ไธปไปปๅŠกๅ…ฅๅฃ**ใ€‚ๅฎžไพ‹ๅŒ–ๆ‰€ๆœ‰ๅญ็ณป็ปŸ๏ผŒ20Hz ไธปๅพช็Žฏๅ่ฐƒ MissionManager ็Šถๆ€ๆœบไธŽ UAVControlLoop ๆŽงๅˆถๆƒ๏ผŒๅซ HUD ๆธฒๆŸ“ใ€CSV ้ฃž่กŒๆ—ฅๅฟ—ใ€TCP ่ฟœ็จ‹ๆ€ฅๅœ | | `infer_camera_modular.py` | **ๆจกๅ—ๅŒ–ๆŽจ็†ๅ…ฅๅฃ**ใ€‚็‹ฌ็ซ‹่ฟ่กŒ็š„ NPU ๆŽจ็†+ๆŽงๅˆถ็จ‹ๅบ๏ผŒๅซ USB/RTSP ่‡ชๅŠจ้‡่ฟž | | `infer_camera.py` | ๆŽจ็†็จ‹ๅบ๏ผˆpymavlink ็›ด่ฟžๆ—ง็‰ˆ๏ผ‰ | | `infer_camera_direct.py` | ๆŽจ็†็จ‹ๅบ๏ผˆDroneController ็›ด่ฟžๆ—ง็‰ˆ๏ผ‰ | | `infer_video_direct.py` | ็ฆป็บฟ่ง†้ข‘ๆŽจ็†็จ‹ๅบ | | `gent_mission.py` | ่ˆช็‚นๅทก่ˆช+่ง†่ง‰่ฟฝ่ธช่žๅˆ็‰ˆ๏ผˆ็›ด่ฟž pymavlink ๆ—ง็‰ˆ๏ผ‰ | ### drone_controller/ โ€” ๆ ธๅฟƒไธšๅŠกๅฑ‚ | ๆ–‡ไปถ | ็ฑป/ๅŠŸ่ƒฝ | ่ฏดๆ˜Ž | |------|---------|------| | `mission_manager.py` | `MissionManager`, `MissionState`, `FailsafeTriggered` | **่ˆช็‚นๅทก่ˆช็Šถๆ€ๆœบ** โ€” ๅฐ่ฃ…ๅฎŒๆ•ดไปปๅŠก็”Ÿๅ‘ฝๅ‘จๆœŸ๏ผˆINITโ†’ARMINGโ†’TAKEOFFโ†’NAVIGATINGโ†’HOLD_TASKโ†’VISUAL_TRACKINGโ†’RETURNINGโ†’LANDINGโ†’FINISHED๏ผ‰๏ผŒๆ‰€ๆœ‰ SETPOINT ้€š่ฟ‡ RouterProxy ๅ‘้€ | | `router_proxy.py` | `RouterProxy` | **ZMQ ้€šไฟกไปฃ็†** โ€” ๅฐ่ฃ… REQ/SUB ๅ่ฎฎ๏ผŒๆไพ› `send_setpoint()`ใ€`send_command()`ใ€`send_waypoint()`ใ€`get_latest_state()` ็ญ‰็บฟ็จ‹ๅฎ‰ๅ…จๆŽฅๅฃ๏ผŒๅซ STATE ๆ–ฐ้ฒœๅบฆๆฃ€ๆต‹ | | `target_tracker.py` | `TargetTracker`, `_KalmanBoxFilter` | **็›ฎๆ ‡่ฟฝ่ธช่ฟ‡ๆปคๅ™จ** โ€” ๆ’ๅฎš้€Ÿๅบฆๅกๅฐ”ๆ›ผๆปคๆณข๏ผŒๆ”ฏๆŒ IOU ๅ…ณ่”ใ€coast ้ข„ๆต‹ใ€ID ็จณๅฎš | | `pid_counter.py` | `PID` | **PID ๆŽงๅˆถๅ™จ** โ€” ๆ ‡ๅ‡†ๆฏ”ไพ‹-็งฏๅˆ†-ๅพฎๅˆ†่ฐƒ่Š‚ๅ™จ๏ผŒๆ”ฏๆŒ็งฏๅˆ†้™ๅน…ๅ’Œๆ‰‹ๅŠจๅคไฝ | | `base_control.py` | `DroneController` | **ๅบ•ๅฑ‚ MAVLink ้ฉฑๅŠจ** โ€” ็›ด่ฟžไธฒๅฃ/UDP ็š„ PX4/ArduPilot ้ฉฑๅŠจ๏ผˆๆ—ง็‰ˆ๏ผŒ็ŽฐๆŽจ่ไฝฟ็”จ RouterProxy๏ผ‰ | ### utils/ โ€” ๅทฅๅ…ทๆจกๅ— | ๆ–‡ไปถ | ๅŠŸ่ƒฝ | |------|------| | `coord.py` | `haversine()` ็ƒ้ข่ท็ฆปใ€`dist_3d_latlon()` 3D ่ท็ฆปใ€`latlon_to_ned()` NED ๅๆ ‡่ฝฌๆข | ### ๅ…ถไป– | ๆ–‡ไปถ | ่ฏดๆ˜Ž | |------|------| | `control.py` | ็ฎ€ๅ• pymavlink ้ฃž่กŒๆŽงๅˆถ่„šๆœฌ | | `tcp_client.py` | TCP ๅ‘ฝไปค้€š้“ๆต‹่ฏ•ๅฎขๆˆท็ซฏ | | `transform_app.py` | ๅœฐ้ข็ซ™ๆ•ฐๆฎไธญ็ปง/่ฝฌๅ‘ๆœๅŠก | | `videotest.py` | ๆ‘„ๅƒๅคดๆ‰“ๅผ€ๆต‹่ฏ• | | `base_test/` | ๅŸบ็ก€ๆต‹่ฏ•๏ผˆNPU ๆŽจ็†ใ€้ฃžๆŽง้€šไฟกใ€UDP ๆŽฅๆ”ถ็ญ‰๏ผ‰ | ### ๆจกๅ—่ฏฆ่งฃ #### VideoStreaming โ€” ่ง†้ข‘ๆต้‡‡้›†ไธŽๅ›พไผ  **ๆ–‡ไปถ๏ผš** `infer_camera_modular.py:34` ๏ฝœ `class VideoStreaming` ็‹ฌ็ซ‹็บฟ็จ‹ไปŽๆ‘„ๅƒๅคด/RTSP ้‡‡้›†ๅธง๏ผŒๅ•ๅธง็ผ“ๅ†ฒๅŒบ `Queue(maxsize=1)` ้ฟๅ…ๅปถ่ฟŸ็ดฏ็งฏ๏ผŒ้€š่ฟ‡็‹ฌ็ซ‹็บฟ็จ‹ UDP ๆŽจๆต่‡ณๅœฐ้ข็ซ™ใ€‚ **่‡ชๅŠจ้‡่ฟžๆœบๅˆถ๏ผš** - ๆฏ่ฝฎ 5 ๆฌกๅฟซ้€Ÿ้‡่ฏ•๏ผŒ้—ด้š” 1 ็ง’ - 5 ๆฌกๅ…จ้ƒจๅคฑ่ดฅ โ†’ 30 ็ง’ๅ†ทๅดๆœŸ - ๅˆ†ๆฎต็ก็œ ็กฎไฟ็บฟ็จ‹ๅœๆญขไฟกๅท็ง’็บงๅ“ๅบ” #### YOLO26UAVInfer โ€” NPU ๆŽจ็†ๆ ธๅฟƒ **ๆ–‡ไปถ๏ผš** `infer_camera_modular.py:190` ๏ฝœ `class YOLO26UAVInfer` ๅŸบไบŽๅŽไธบๆ˜‡่…พ `ais_bench` SDK๏ผˆ`InferSession`๏ผ‰็š„ๆŽจ็†ๅฐ่ฃ…ใ€‚`letterbox()` ็ญ‰ๆฏ”ไพ‹็ผฉๆ”พๅกซๅ…… + `postprocess()` ๅๆ ‡ๅ›žๆ˜ ๅฐ„ใ€‚ #### UAVControlLoop โ€” ้ฃžๆŽง้—ญ็ŽฏๆŽงๅˆถ **ๆ–‡ไปถ๏ผš** `infer_camera_modular.py:269` ๏ฝœ `class UAVControlLoop` 20Hz ็‹ฌ็ซ‹็บฟ็จ‹๏ผš`TargetTracker` ๅนณๆป‘ไธญๅฟƒ็‚น โ†’ PID ่ฎก็ฎ—ๆœบไฝ“้€Ÿๅบฆ `(vy, vz)` โ†’ `send_setpoint(VELOCITY)`ใ€‚ **ๅฎ‰ๅ…จ่ฎพ่ฎก๏ผš** ้˜ฒๆ–ญๆตๅˆน่ฝฆ๏ผˆ500ms๏ผ‰+ Coast ้ข„ๆต‹ๆœŸ PID ็งฏๅˆ†ๆธ…็ฉบ #### MissionManager โ€” ไปปๅŠก็Šถๆ€ๆœบ **ๆ–‡ไปถ๏ผš** `drone_controller/mission_manager.py:64` ๏ฝœ `class MissionManager` ้ขๅ‘่ˆช็‚นๅทก่ˆช + ่ง†่ง‰่ฟฝ่ธช่žๅˆไปปๅŠก็š„ๅคๅˆ็Šถๆ€ๆœบ๏ผš - **Failsafe ็†”ๆ–ญ**๏ผšๆฃ€ๆต‹ๅˆฐ้ฃžๆŽงๆจกๅผ่ขซๅˆ‡ๅ‡บ็™ฝๅๅ•ๆ—ถ็ซ‹ๅณๆŠ›ๅ‡บๅผ‚ๅธธ - **Haversine ่ท็ฆปๅˆคๅฎš**๏ผšไฝฟ็”จ็ป็บฌๅบฆ็ƒ้ข่ท็ฆป่ฟ›่กŒๅˆฐ่พพๅˆคๅฎš - **ไบ‹ไปถ้ฉฑๅŠจๆ—ฅๅฟ—**๏ผš็Šถๆ€ๅˆ‡ๆขๅ•ๆฌก่พ“ๅ‡บ๏ผŒๆŒ็ปญ็Šถๆ€ 3~10 ็ง’่Š‚ๆต --- ## ๐Ÿ”„ ็Šถๆ€ๆœบๆต็จ‹ ``` WAITING_WAYPOINTS โ”‚ ๆ”ถๅˆฐ่ˆช็‚น โ–ผ INIT โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ARM OK โ”‚ ๅทฒOFFBOARD โ–ผ โ”‚ ARMING โ”‚ โ”‚ ่งฃ้”ๆˆๅŠŸ โ”‚ โ–ผ โ”‚ TAKEOFF โ”‚ โ”‚ ๅˆฐ่พพ้ซ˜ๅบฆ + OFFBOARD โ”‚ โ–ผ โ”‚ NAVIGATING โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๆ‰€ๆœ‰่ˆช็‚นๅฎŒๆˆ โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ ๅˆฐ่พพ่ˆช็‚น โ”‚ โ–ผ โ”‚ HOLD_TASK โ”‚ โ”‚ โ”œโ”€ ๅ‘็Žฐ็›ฎๆ ‡ โ†’ VISUAL_TRACKING โ”‚ โ”‚ โ””โ”€ ่ถ…ๆ—ถ โ†’ ไธ‹ไธ€่ˆช็‚น โ”‚ โ–ผ โ”‚ VISUAL_TRACKING โ”‚ โ”‚ โ”œโ”€ ่ฟฝ่ธชๅฎŒๆˆ โ†’ NAVIGATING โ”‚ โ”‚ โ”œโ”€ ไธขๅคฑ่ถ…ๆ—ถ โ†’ NAVIGATING โ”‚ โ”‚ โ””โ”€ ๆ€ป่ถ…ๆ—ถ โ†’ NAVIGATING โ”‚ โ–ผ โ”‚ RETURNING โ†โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ ๅˆฐ่พพ่ฟ”่ˆช็‚น โ–ผ LANDING โ”‚ ็€้™† + ไธŠ้” โ–ผ FINISHED ``` --- ## ๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹ ### 1. ็Žฏๅขƒๅ‡†ๅค‡ ```bash # ๅˆ›ๅปบ่™šๆ‹Ÿ็Žฏๅขƒ python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # ๅฎ‰่ฃ…ไพ่ต– pip install -r requirements.txt # ้ฆ™ๆฉ™ๆดพ AI Pro ๅŠ ่ฝฝๆ˜‡่…พ็Žฏๅขƒ source /usr/local/Ascend/ascend-toolkit/set_env.sh ``` ### 2. ้…็ฝฎ ็ผ–่พ‘ `config.json`๏ผŒๆ นๆฎๅฎž้™…้ƒจ็ฝฒไฟฎๆ”นๅ…ณ้”ฎๅ‚ๆ•ฐ๏ผš - `video.video_source` โ€” ๆ‘„ๅƒๅคด่ฎพๅค‡ๅท๏ผˆ`0`๏ผ‰ๆˆ– RTSP ๅœฐๅ€ - `flight_control.req_endpoint` / `sub_endpoint` โ€” ZeroMQ Router ็ซฏ็‚น - `network.ground_station_ip` โ€” ๅœฐ้ข็ซ™ IP๏ผˆๅ›พไผ ๆŽฅๆ”ถ๏ผ‰ ### 3. ่ฟ่กŒ ```bash # ๅฎŒๆ•ดไปปๅŠกๆจกๅผ๏ผˆ่ˆช็‚นๅทก่ˆช + ่ง†่ง‰่ฟฝ่ธช๏ผ‰ python run_mission.py config.json # ็‹ฌ็ซ‹ๆจกๅ—ๅŒ–่ง†่ง‰่ฟฝ่ธช python infer_camera_modular.py config.json # ็ฆป็บฟ่ง†้ข‘ๆŽจ็† python infer_video_direct.py ``` ### 4. TCP ่ฟœ็จ‹ๆŽงๅˆถ ```bash echo "STOP" | nc <่ฎพๅค‡IP> 9999 # ็ดงๆ€ฅ้™่ฝ echo "STATUS" | nc <่ฎพๅค‡IP> 9999 # ๆŸฅ่ฏข็Šถๆ€ echo "PING" | nc <่ฎพๅค‡IP> 9999 # ๅฟƒ่ทณๆต‹่ฏ• ``` ### 5. ๅœฐ้ข็ซ™ๆŽฅๆ”ถๅ›พไผ  ๅ‚่€ƒ `base_test/receiver.py` ๅœจ `ground_station_ip` ๅฏนๅบ”ๆœบๅ™จไธŠ่ฟ่กŒ UDP ๆŽฅๆ”ถ็ซฏใ€‚ --- ## ๐Ÿ“ฆ ็Žฏๅขƒ่ฆๆฑ‚ไธŽไพ่ต– ### ็กฌไปถๅนณๅฐ | ็ป„ไปถ | ่ง„ๆ ผ | |------|------| | **ไธปๆŽง** | ้ฆ™ๆฉ™ๆดพ AI Pro๏ผˆOrange Pi AI Pro๏ผ‰ | | **NPU** | ๅŽไธบๆ˜‡่…พ Ascend 310B | | **ๆ‘„ๅƒๅคด** | USB ๆ‘„ๅƒๅคด ๆˆ– RTSP ็ฝ‘็ปœๆ‘„ๅƒๅคด | | **้ฃžๆŽง** | PX4 / ArduPilot๏ผˆไธฒๅฃๆˆ– UDP ่ฟžๆŽฅ Router๏ผ‰ | ### Python ไพ่ต– ๅฎŒๆ•ดไพ่ต–่ง [`requirements.txt`](./requirements.txt) | ไพ่ต– | ็”จ้€” | ๅค‡ๆณจ | |------|------|------| | `opencv-python` | ่ง†้ข‘้‡‡้›†ใ€ๅ›พๅƒ้ข„ๅค„็†ใ€ๆธฒๆŸ“ | โ‰ฅ4.5 | | `pyzmq` | ZeroMQ REQ/SUB ้€šไฟก | โ‰ฅ22 | | `numpy` | ๅผ ้‡ๆ“ไฝœใ€็Ÿฉ้˜ต่ฟ็ฎ— | โ‰ฅ1.21 | | `pymavlink` | MAVLink ๅ่ฎฎ๏ผˆๆ—ง็‰ˆ็›ด่ฟžๆจกๅผ๏ผ‰ | ๆœ€ๆ–ฐ็‰ˆ | | `ais_bench` | ๆ˜‡่…พ NPU ๆŽจ็† SDK | ้œ€ไปŽๅŽไธบๆ˜‡่…พๅฎ˜ๆ–นๅฎ‰่ฃ… | --- ## ๐Ÿ“ ็›ฎๅฝ•็ป“ๆž„ ``` opi-yolo/ โ”œโ”€โ”€ infer_camera_modular.py # ๐Ÿš€ ๆจกๅ—ๅŒ–่ง†่ง‰่ฟฝ่ธช๏ผˆๆŽจ่ๅ…ฅๅฃ๏ผ‰ โ”œโ”€โ”€ infer_camera_direct.py # ็›ด่ฟž MAVLink ๆ—ง็‰ˆ โ”œโ”€โ”€ infer_camera.py # ็›ด่ฟž pymavlink ๆ—ง็‰ˆ โ”œโ”€โ”€ infer_video_direct.py # ็ฆป็บฟ่ง†้ข‘ๆŽจ็† โ”œโ”€โ”€ run_mission.py # ๐Ÿš€ ๅ…จไปปๅŠกๅ…ฅๅฃ๏ผˆ่ˆช็‚น+่ฟฝ่ธช๏ผ‰ โ”œโ”€โ”€ gent_mission.py # ่ˆช็‚นๅทก่ˆช+่ฟฝ่ธช่žๅˆ๏ผˆๆ—ง็‰ˆ๏ผ‰ โ”œโ”€โ”€ control.py # ็ฎ€ๅ•้ฃžๆŽงๆŽงๅˆถ่„šๆœฌ โ”œโ”€โ”€ config.json # ๅ…จๅฑ€้…็ฝฎๆ–‡ไปถ โ”œโ”€โ”€ python_protocol.md # ้€šไฟกๅ่ฎฎ่ง„่Œƒ โ”œโ”€โ”€ tcp_client.py # TCP ๅ‘ฝไปค้€š้“ๅฎขๆˆท็ซฏ โ”œโ”€โ”€ transform_app.py # ๅœฐ้ข็ซ™ๆ•ฐๆฎไธญ็ปง โ”œโ”€โ”€ videotest.py # ๆ‘„ๅƒๅคดๆต‹่ฏ• โ”œโ”€โ”€ README.md # ๆœฌๆ–‡ๆกฃ โ”œโ”€โ”€ requirements.txt # Python ไพ่ต–ๆธ…ๅ• โ”‚ โ”œโ”€โ”€ drone_controller/ โ”‚ โ”œโ”€โ”€ mission_manager.py # ่ˆช็‚นๅทก่ˆช็Šถๆ€ๆœบ โ”‚ โ”œโ”€โ”€ router_proxy.py # ZMQ ้€šไฟกไปฃ็† โ”‚ โ”œโ”€โ”€ target_tracker.py # ๅกๅฐ”ๆ›ผ็›ฎๆ ‡่ฟฝ่ธช โ”‚ โ”œโ”€โ”€ pid_counter.py # PID ๆŽงๅˆถๅ™จ โ”‚ โ””โ”€โ”€ base_control.py # MAVLink ๅบ•ๅฑ‚้ฉฑๅŠจ๏ผˆๆ—ง็‰ˆ๏ผ‰ โ”‚ โ”œโ”€โ”€ utils/ โ”‚ โ””โ”€โ”€ coord.py # ๅๆ ‡่ฝฌๆขๅทฅๅ…ท โ”‚ โ”œโ”€โ”€ base_test/ โ”‚ โ”œโ”€โ”€ check.py # ่ง†้ข‘ๅธง็އๆต‹่ฏ• โ”‚ โ”œโ”€โ”€ fc_test.py # ้ฃžๆŽง้€šไฟกๆต‹่ฏ• โ”‚ โ”œโ”€โ”€ infer.py # NPU ๆŽจ็†ๆต‹่ฏ• โ”‚ โ””โ”€โ”€ receiver.py # UDP ๅ›พไผ ๆŽฅๆ”ถๅ™จ โ”‚ โ”œโ”€โ”€ om/ # OM ๆจกๅž‹ๆ–‡ไปถ โ”‚ โ””โ”€โ”€ yolo26n-balloon2.om โ”‚ โ””โ”€โ”€ asset/ # ่ต„ๆบๆ–‡ไปถ ``` --- ## โš ๏ธ ๅ…่ดฃๅฃฐๆ˜Ž > **ๅฎ‰ๅ…จ่ญฆๅ‘Š**๏ผšๆœฌ็ณป็ปŸๆถ‰ๅŠๆ— ไบบๆœบ่‡ชไธป้ฃž่กŒๆŽงๅˆถใ€‚ๅœจๅฎž้™…้ƒจ็ฝฒๅ‰๏ผŒ่ฏทๅŠกๅฟ…๏ผš > 1. ๅœจไปฟ็œŸ็Žฏๅขƒ๏ผˆๅฆ‚ Gazebo / SITL๏ผ‰ไธญๅ……ๅˆ†ๆต‹่ฏ•ๅ…จ้ƒจๅŠŸ่ƒฝ > 2. ๅœจๅ›บๅฎšๅฐๆžถไธŠ้ชŒ่ฏ PID ๅ‚ๆ•ฐๅ’ŒๆŽงๅˆถ้€ป่พ‘ > 3. ็กฎไฟ้ฅๆŽงๅ™จๆ‰‹ๅŠจๆŽฅ็ฎก้€š้“ๅฏ็”จไธ”ไผ˜ๅ…ˆ็บง้ซ˜ไบŽ่‡ชไธปๆŽงๅˆถ > 4. ๅ‡†ๅค‡็‰ฉ็†ๆ€ฅๅœๅผ€ๅ…ณ > 5. ้ตๅฎˆๅฝ“ๅœฐๆ— ไบบๆœบ้ฃž่กŒๆณ•่ง„ > > ๆœฌ้กน็›ฎไฝœ่€…ไธๅฏนๅ› ไฝฟ็”จๆœฌ่ฝฏไปถ้€ ๆˆ็š„ไปปไฝ•่ดขไบงๆŸๅคฑๆˆ–ไบบ่บซไผคๅฎณๆ‰ฟๆ‹…่ดฃไปปใ€‚