Π ΡΠΎΠ·ΠΈ ΡΡΠΎΠΊ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° Π΄ΡΠΎΠ½ Ρ Π³Π»Π°ΡΠΎΠ²ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Node.js ΠΈ API Π·Π° ΡΠ΅Π± ΡΠ΅Ρ. Π₯Π΅Π»ΠΈΠΊΠΎΠΏΡΠ΅Ρ - Parrot ARDrone 2.0.
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅ Π²ΠΈ: Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ 10 000 ΡΡΠ±Π»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΊΡΡΡ Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡΠΎΠΌΠΎΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° "Habr".
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°: ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ
βΠΠΎΠ±ΠΈΠ»Π΅Π½ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ PROβ .
Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΡΠΎΠ½ΠΎΠ²Π΅ΡΠ΅ ΡΠ° Π½Π΅Π²Π΅ΡΠΎΡΡΠ½ΠΈ. ΠΠ°ΠΈΡΡΠΈΠ½Π° ΠΌΠΈ Ρ Π°ΡΠ΅ΡΠ²Π° Π΄Π° ΠΈΠ³ΡΠ°Ρ Ρ ΠΌΠΎΡ ΡΠ΅ΡΠ²ΠΎΡΠΊΠ°, Π΄Π° ΠΏΡΠ°Π²Ρ ΡΠ½ΠΈΠΌΠΊΠΈ ΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ»ΠΈΠΏΠΎΠ²Π΅ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΡΠ΅ Π·Π°Π±Π°Π²Π»ΡΠ²Π°ΠΌ. ΠΠΎ Π±Π΅Π·ΠΏΠΈΠ»ΠΎΡΠ½ΠΈΡΠ΅ Π»Π΅ΡΠ°ΡΠ΅Π»Π½ΠΈ Π°ΠΏΠ°ΡΠ°ΡΠΈ (UAV) ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° Π½Π΅ΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΠΏΡΠΎΡΡΠΎ Π·Π°Π±Π°Π²Π»Π΅Π½ΠΈΠ΅. Π’Π΅ ΡΠ°Π±ΠΎΡΡΡ Π² ΠΊΠΈΠ½ΠΎΡΠΎ, ΠΈΠ·ΡΡΠ°Π²Π°Ρ Π»Π΅Π΄Π½ΠΈΡΠΈ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΎΡ Π²ΠΎΠ΅Π½Π½ΠΈ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π»ΠΈ Π½Π° ΡΠ΅Π»ΡΠΊΠΎΡΡΠΎΠΏΠ°Π½ΡΠΊΠΈΡ ΡΠ΅ΠΊΡΠΎΡ.
Π ΡΠΎΠ·ΠΈ ΡΡΠΎΠΊ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, ΠΊΠΎΡΡΠΎ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΡΠ΅ Π΄ΡΠΎΠ½. ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π³Π»Π°ΡΠΎΠ²ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ. ΠΠ°, Ρ Π΅Π»ΠΈΠΊΠΎΠΏΡΠ΅ΡΡΡ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΌΡ ΠΊΠ°ΠΆΠ΅ΡΠ΅. Π ΠΊΡΠ°Ρ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° ΠΈΠΌΠ° Π³ΠΎΡΠΎΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° UAV.
ΠΆΠ΅Π»ΡΠ·ΠΎ
ΠΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
- Parrot ARDrone 2.0;
- Ethernet ΠΊΠ°Π±Π΅Π»;
- Π΄ΠΎΠ±ΡΡ ΠΌΠΈΠΊΡΠΎΡΠΎΠ½.
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΈ ΡΡΠ°Π½ΡΠΈΠΈ Ρ Windows/Mac/Ubuntu. ΠΠΈΡΠ½ΠΎ Π°Π· ΡΠ°Π±ΠΎΡΠΈΡ Ρ Mac ΠΈ Ubuntu 18.04.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅
ΠΠ·ΡΠ΅Π³Π»Π΅ΡΠ΅ Π½Π°ΠΉ-Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° Node.js ΠΎΡ
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ
Π Π°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° Ρ Π΅Π»ΠΈΠΊΠΎΠΏΡΠ΅ΡΠ°
ΠΠ΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ Parrot ARDrone. Π’ΠΎΠ·ΠΈ Ρ Π΅Π»ΠΈΠΊΠΎΠΏΡΠ΅Ρ ΠΈΠΌΠ° ΡΠ΅ΡΠΈΡΠΈ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ.
ΠΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΈΡΠ΅ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»ΠΈ ΡΠ°Π±ΠΎΡΡΡ Π² Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΠΏΠΎΡΠΎΠΊΠ°. ΠΠ΄Π½Π°ΡΠ° Π΄Π²ΠΎΠΉΠΊΠ° ΡΠ΅ Π²ΡΡΡΠΈ ΠΏΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π½Π° ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠΎΠ²Π°ΡΠ° ΡΡΡΠ΅Π»ΠΊΠ°, Π΄ΡΡΠ³Π°ΡΠ° - ΠΎΠ±ΡΠ°ΡΠ½ΠΎ. ΠΡΠΎΠ½ΡΡ ΡΠ΅ Π΄Π²ΠΈΠΆΠΈ ΡΡΠ΅Π· ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΡΠ³ΡΠ»Π° Π½Π° Π½Π°ΠΊΠ»ΠΎΠ½ ΡΠΏΡΡΠΌΠΎ ΠΏΠΎΠ²ΡΡΡ
Π½ΠΎΡΡΡΠ° Π½Π° Π·Π΅ΠΌΡΡΠ°, ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° Π²ΡΡΡΠ΅Π½Π΅ Π½Π° Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»ΠΈΡΠ΅ ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄ΡΡΠ³ΠΈ ΠΌΠ°Π½Π΅Π²ΡΠ΅Π½ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ.
ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅, ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΏΡΠΎΠΌΡΠ½Π° Π² ΠΏΠΎΡΠΎΠΊΠ°ΡΠ° Π½Π° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΏΡΠ΅ΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ΡΠΎ ΠΈΠ»ΠΈ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° Π²ΡΡΡΠ΅Π½Π΅ Π½Π° Π»Π΅Π²ΠΈΡ ΠΈ Π΄Π΅ΡΠ½ΠΈΡ ΡΠΎΡΠΎΡ ΡΡΠ·Π΄Π°Π²Π° ΡΠΎΠ»ΠΊΠ°. Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° Π΄ΡΠΎΠ½Π° Π΄Π° Π»Π΅ΡΠΈ Π½Π°ΠΏΡΠ΅Π΄ ΠΈΠ»ΠΈ Π½Π°Π·Π°Π΄.
Π§ΡΠ΅Π· ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΡΠΊΠΎΡΠΎΡΡΡΠ° ΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΡΠ° Π½Π° Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»ΠΈΡΠ΅, Π½ΠΈΠ΅ Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ³Π»ΠΈ Π½Π° Π½Π°ΠΊΠ»ΠΎΠ½, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π½Π° Ρ Π΅Π»ΠΈΠΊΠΎΠΏΡΠ΅ΡΠ° Π΄Π° ΡΠ΅ Π΄Π²ΠΈΠΆΠΈ Π² Π΄ΡΡΠ³ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ. ΠΡΡΡΠ½ΠΎΡΡ Π·Π° Π½Π°ΡΡΠΎΡΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ Π½ΡΠΌΠ° Π½ΡΠΆΠ΄Π° Π΄Π° ΠΈΠ·ΡΡΠ°Π²Π°ΡΠ΅ Π°Π΅ΡΠΎΠ΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ°, ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ.
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ Parrot ARDrone
ΠΡΠΎΠ½ΡΡ Π΅ Wi-Fi Π³ΠΎΡΠ΅ΡΠ° ΡΠΎΡΠΊΠ°. ΠΠ° Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΊΡΠΌ Ρ Π΅Π»ΠΈΠΊΠΎΠΏΡΠ΅ΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ Ρ ΡΠ°Π·ΠΈ ΡΠΎΡΠΊΠ°. ΠΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΡΠ΅ ΠΊΠ²Π°Π΄ΡΠΎΠΊΠΎΠΏΡΠ΅ΡΠΈ. ΠΡΠΈΡΠΊΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
ΠΠ΅Π΄Π½Π°Π³Π° ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ Π΄ΡΠΎΠ½Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅, ΠΎΡΠ²ΠΎΡΠ΅ΡΠ΅ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° ΠΈ telnet 192.168.1.1 - ΡΠΎΠ²Π° Π΅ IP Π½Π° ΠΊΠΎΠΏΡΠ΅ΡΠ°. ΠΠ° Linux ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
ΠΠ°ΡΠΈΡΡ ΠΊΠΎΠ΄ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ:
- ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Ρ ΡΠ΅ΡΠ΅Π²ΠΈ API Π·Π° Π³Π»Π°ΡΠΎΠ²ΠΎ ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅;
- ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΈ ΡΡΠ°Π²Π½ΡΠ²Π°Π½Π΅ ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡ;
- ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΊΡΠΌ Π΄ΡΠΎΠ½Π°;
- Π²ΠΈΠ΄Π΅ΠΎ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΆΠΈΠ²ΠΎ.
API ΡΠ°Π±ΠΎΡΠΈ, Π΄ΠΎΠΊΠ°ΡΠΎ ΠΈΠΌΠ° ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ Π²ΡΡΠ·ΠΊΠ°. ΠΠ° Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°ΠΌΠ΅ ΡΠΎΠ²Π°, Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ Ethernet Π²ΡΡΠ·ΠΊΠ°.
ΠΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅!
ΠΠΎΠ΄
ΠΡΡΠ²ΠΎ, Π½Π΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½ΠΎΠ²Π° ΠΏΠ°ΠΏΠΊΠ° ΠΈ Π΄Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠΈΠΌ ΠΊΡΠΌ Π½Π΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ Node, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ.
ΠΡΡΠ²ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
npm ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅β
Π©Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:
- ΠΠ°Ρ Π°ΠΌ ΠΎΡ ΡΠ΅Π±Π΅ ΡΠΈ, ΡΡΠ±Π»ΠΈΡΠ°ΠΌ;
- ΠΊΠ°ΡΠ°Π½Π΅;
- Π½Π°Π³ΠΎΡΠ΅ - Π΄ΡΠΎΠ½ΡΡ ΡΠ΅ ΠΈΠ·Π΄ΠΈΠ³Π° Π½Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ ΠΌΠ΅ΡΡΡ ΠΈ ΠΊΡΡΠΆΠΈ;
- Π½Π°Π΄ΠΎΠ»Ρ - ΠΏΠ°Π΄Π° Π½Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ ΠΌΠ΅ΡΡΡ ΠΈ Π·Π°ΠΌΡΡΠ·Π²Π°;
- Π½Π°Π»ΡΠ²ΠΎ - ΠΎΡΠΈΠ²Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ ΠΌΠ΅ΡΡΡ Π½Π°Π»ΡΠ²ΠΎ;
- Π½Π°Π΄ΡΡΠ½ΠΎ - ΠΎΡΠΈΠ²Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ ΠΌΠ΅ΡΡΡ Π½Π°Π΄ΡΡΠ½ΠΎ;
- Π²ΡΡΡΠ΅Π½Π΅ - Π²ΡΡΡΠΈ ΡΠ΅ ΠΏΠΎ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠΎΠ²Π°ΡΠ° ΡΡΡΠ΅Π»ΠΊΠ° Π½Π° 90 Π³ΡΠ°Π΄ΡΡΠ°;
- Π½Π°ΠΏΡΠ΅Π΄ - Π²ΡΡΠ²ΠΈ Π½Π°ΠΏΡΠ΅Π΄ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ ΠΌΠ΅ΡΡΡ;
- Π³ΡΡΠ± - Π²ΡΡΡΠ° ΡΠ΅ Π½Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ ΠΌΠ΅ΡΡΡ Π½Π°Π·Π°Π΄;
- Π‘ΠΏΡΠΈ ΡΠ΅.
ΠΡΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ°ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, Π΄Π° Π³ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ ΠΈ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΡΠ΅ Π΄ΡΠΎΠ½Π°.
const express = require('express');
const bodyparser = require('body-parser');
var arDrone = require('ar-drone');
const router = express.Router();
const app = express();
const commands = ['takeoff', 'land','up','down','goleft','goright','turn','goforward','gobackward','stop'];
var drone = arDrone.createClient();
// disable emergency
drone.disableEmergency();
// express
app.use(bodyparser.json());
app.use(express.static(__dirname + '/public'));
router.get('/',(req,res) => {
res.sendFile('index.html');
});
router.post('/command',(req,res) => {
console.log('command recieved ', req.body);
console.log('existing commands', commands);
let command = req.body.command.replace(/ /g,'');
if(commands.indexOf(command) !== -1) {
switch(command.toUpperCase()) {
case "TAKEOFF":
console.log('taking off the drone');
drone.takeoff();
break;
case "LAND":
console.log('landing the drone');
drone.land();
break;
case "UP":
console.log('taking the drone up half meter');
drone.up(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "DOWN":
console.log('taking the drone down half meter');
drone.down(0.2);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOLEFT":
console.log('taking the drone left 1 meter');
drone.left(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "GORIGHT":
console.log('taking the drone right 1 meter');
drone.right(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},1000);
break;
case "TURN":
console.log('turning the drone');
drone.clockwise(0.4);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOFORWARD":
console.log('moving the drone forward by 1 meter');
drone.front(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "GOBACKWARD":
console.log('moving the drone backward 1 meter');
drone.back(0.1);
setTimeout(() => {
drone.stop();
clearTimeout();
},2000);
break;
case "STOP":
drone.stop();
break;
default:
break;
}
}
res.send('OK');
});
app.use('/',router);
app.listen(process.env.port || 3000);
Π ΡΡΠΊ Π΅ HTML ΠΈ JavaScript ΠΊΠΎΠ΄ΡΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ»ΡΡΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄ΠΎ ΡΡΡΠ²ΡΡΠ° Π½Π° Node.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Voice Controlled Notes App</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/shoelace-css/1.0.0-beta16/shoelace.css">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<h1>Voice Controlled Drone</h1>
<p class="page-description">A tiny app that allows you to control AR drone using voice</p>
<h3 class="no-browser-support">Sorry, Your Browser Doesn't Support the Web Speech API. Try Opening This Demo In Google Chrome.</h3>
<div class="app">
<h3>Give the command</h3>
<div class="input-single">
<textarea id="note-textarea" placeholder="Create a new note by typing or using voice recognition." rows="6"></textarea>
</div>
<button id="start-record-btn" title="Start Recording">Start Recognition</button>
<button id="pause-record-btn" title="Pause Recording">Pause Recognition</button>
<p id="recording-instructions">Press the <strong>Start Recognition</strong> button and allow access.</p>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="script.js"></script>
</body>
</html>
Π ΡΡΡΠΎ ΡΠ°ΠΊΠ° JavaScript ΠΊΠΎΠ΄ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π³Π»Π°ΡΠΎΠ²ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΈΠ·ΠΏΡΠ°ΡΠ°ΠΉΠΊΠΈ Π³ΠΈ ΠΊΡΠΌ Node ΡΡΡΠ²ΡΡΠ°.
try {
var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
var recognition = new SpeechRecognition();
}
catch(e) {
console.error(e);
$('.no-browser-support').show();
$('.app').hide();
}
// other code, please refer GitHub source
recognition.onresult = function(event) {
// event is a SpeechRecognitionEvent object.
// It holds all the lines we have captured so far.
// We only need the current one.
var current = event.resultIndex;
// Get a transcript of what was said.
var transcript = event.results[current][0].transcript;
// send it to the backend
$.ajax({
type: 'POST',
url: '/command/',
data: JSON.stringify({command: transcript}),
success: function(data) { console.log(data) },
contentType: "application/json",
dataType: 'json'
});
};
Π‘ΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
ΠΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½ (Π²Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΡΠ΅, ΡΠ΅ Ρ Π΅Π»ΠΈΠΊΠΎΠΏΡΠ΅ΡΡΡ Π΅ ΡΠ²ΡΡΠ·Π°Π½ ΠΊΡΠΌ Wi-Fi ΠΈ Ethernet ΠΊΠ°Π±Π΅Π»ΡΡ Π΅ ΡΠ²ΡΡΠ·Π°Π½ ΠΊΡΠΌ ΠΊΠΎΠΌΠΏΡΡΡΡΠ°).
ΠΡΠ²ΠΎΡΠ΅ΡΠ΅ localhost:3000 Π² Π±ΡΠ°ΡΠ·ΡΡΠ° ΠΈ ΡΡΠ°ΠΊΠ½Π΅ΡΠ΅ Π²ΡΡΡ Ρ Π‘ΡΠ°ΡΡ Π½Π° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ΡΠΎ.
ΠΠΏΠΈΡΠ²Π°ΠΌΠ΅ ΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΠΌΠ΅ Π΄ΡΠΎΠ½Π° ΠΈ ΡΠΌΠ΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ.
ΠΠ·Π»ΡΡΠ²Π°Π½Π΅ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΎΡ Π΄ΡΠΎΠ½
Π ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΡΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ² ΡΠ°ΠΉΠ» ΠΈ ΠΊΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ ΡΠΎΠ·ΠΈ ΠΊΠΎΠ΄ ΡΠ°ΠΌ:
const http = require("http");
const drone = require("dronestream");
const server = http.createServer(function(req, res) {
require("fs").createReadStream(__dirname + "/public/video.html").pipe(res);
});
drone.listen(server);
server.listen(4000);
Π Π΅ΡΠΎ HTML ΠΊΠΎΠ΄Π°, ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅ Π³ΠΎ Π² ΠΏΡΠ±Π»ΠΈΡΠ½Π°ΡΠ° ΠΏΠ°ΠΏΠΊΠ°.
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Stream as module</title>
<script src="/dronestream/nodecopter-client.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="heading">Drone video stream</h1>
<div id="droneStream" style="width: 640px; height: 360px"> </div>
<script type="text/javascript" charset="utf-8">
new NodecopterStream(document.getElementById("droneStream"));
</script>
</body>
</html>
Π‘ΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΈ ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ Ρ localhost:8080, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎ ΠΎΡ ΠΏΡΠ΅Π΄Π½Π°ΡΠ° ΠΊΠ°ΠΌΠ΅ΡΠ°.
ΠΠΎΠ»Π΅Π·Π½ΠΈ ΡΡΠ²Π΅ΡΠΈ
- ΠΠ΅ΡΠ΅ΡΠ΅ Ρ ΡΠΎΠ·ΠΈ Π΄ΡΠΎΠ½ Π½Π° Π·Π°ΠΊΡΠΈΡΠΎ.
- ΠΠΈΠ½Π°Π³ΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠΉΡΠ΅ Π·Π°ΡΠΈΡΠ½ΠΎΡΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Π½Π° Π²Π°ΡΠΈΡ Π΄ΡΠΎΠ½ ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·Π»ΠΈΡΠ°Π½Π΅.
- ΠΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π΄Π°Π»ΠΈ Π±Π°ΡΠ΅ΡΠΈΡΡΠ° Π΅ Π·Π°ΡΠ΅Π΄Π΅Π½Π°.
- ΠΠΊΠΎ Π΄ΡΠΎΠ½ΡΡ ΡΠ΅ Π΄ΡΡΠΆΠΈ ΡΡΡΠ°Π½Π½ΠΎ, Π·Π°Π΄ΡΡΠΆΡΠ΅ Π³ΠΎ ΠΈ Π³ΠΎ ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅. Π’ΠΎΠ²Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΈ ΠΊΠΎΠΏΡΠ΅ΡΠ° Π² Π°Π²Π°ΡΠΈΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ ΠΈ ΡΠΎΡΠΎΡΠΈΡΠ΅ ΡΠ΅ ΡΠΏΡΠ°Ρ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ.
ΠΠΎΡΠΎΠ² ΠΊΠΎΠ΄ ΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ
Π‘Π΅ ΡΠ»ΡΡΠΈ!
Π©Π΅ Π²ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΈ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΠ²ΠΈΠ΅ Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠΎΠ΄ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° Π³Π»Π΅Π΄Π°ΡΠ΅ ΠΊΠ°ΠΊ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄ΡΠΈΠ½ΡΠ²Π°! Π‘Π΅Π³Π° ΡΠ°Π·Π±ΡΠ°Ρ ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΡΡΠΈΠΌ Π΄ΡΠΎΠ½ Π΄Π° ΡΠ»ΡΡΠ° Π³Π»Π°ΡΠΎΠ²ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ. ΠΡΡΡΠ½ΠΎΡΡ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ: ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π»ΠΈΡΠ΅ΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΈ ΠΏΠΎΠ»Π΅ΡΠΈ, ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° ΠΆΠ΅ΡΡΠΎΠ²Π΅ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ.
ΠΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΠ΅ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°?
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°:
- ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ ΠΎΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ
βΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° Pythonβ .- ΠΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ
βΠΡΠΎΡΠ΅ΡΠΈΡ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊβ .- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΊΡΡΡ
βPHP ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡ 0 Π΄ΠΎ PROβ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com