αž™αžΎαž„αžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαžŠαŸ„αž™αžŸαŸ†αž‘αŸαž„αž“αŸƒ copter αžŠαŸ„αž™αž”αŸ’αžšαžΎ Node.js αž“αž·αž„ ARDrone

αž™αžΎαž„αžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαžŠαŸ„αž™αžŸαŸ†αž‘αŸαž„αž“αŸƒ copter αžŠαŸ„αž™αž”αŸ’αžšαžΎ Node.js αž“αž·αž„ ARDrone

αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸαžšαŸ€αž“αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αž“αŸ’αžαž αŸ„αŸ‡αž‚αŸ’αž˜αžΆαž“αž˜αž“αž»αžŸαŸ’αžŸαž”αžΎαž€αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαŸ†αž‘αŸαž„αžŠαŸ„αž™αž”αŸ’αžšαžΎ Node.js αž“αž·αž„ Web speech API αŸ” Copter - αžŸαŸαž€ ARDrone 2.0 αŸ”

αž™αžΎαž„αžšαŸ†αž›αžΉαž€αŸ– αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž’αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒ "Habr" - αž€αžΆαžšαž”αž‰αŸ’αž…αž»αŸ‡αžαž˜αŸ’αž›αŸƒ 10 rubles αž“αŸ…αž–αŸαž›αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž€αŸ’αž“αž»αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ Skillbox αžŽαžΆαž˜αž½αž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž›αŸαžαž€αžΌαžŠαž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™ "Habr" αŸ”

Skillbox αžŽαŸ‚αž“αžΆαŸ†αŸ– αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ "αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž…αž›αŸαž PRO".

αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†

αž™αž“αŸ’αžαž αŸ„αŸ‡αž‚αŸ’αž˜αžΆαž“αž˜αž“αž»αžŸαŸ’αžŸαž”αžΎαž€αž‚αžΊαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αžŽαžΆαžŸαŸ‹αŸ” αžαŸ’αž‰αž»αŸ†αž–αž·αžαž‡αžΆαžšαžΈαž€αžšαžΆαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž›αŸαž„αž‡αžΆαž˜αž½αž™ quad αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžαžαžšαžΌαž” αž“αž·αž„αžœαžΈαžŠαŸαž’αžΌ αž¬αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž˜αžΆαž“αž—αžΆαž–αžŸαž”αŸ’αž”αžΆαž™αžšαžΈαž€αžšαžΆαž™αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΆαž“αž‡αŸ†αž“αž·αŸ‡αž‚αŸ’αž˜αžΆαž“αž˜αž“αž»αžŸαŸ’αžŸαž”αžΎαž€ (UAVs) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αž˜αŸ’αžŸαžΆαž“αŸ’αžαž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž€αžΆαžšαž€αž˜αŸ’αžŸαžΆαž“αŸ’αžαŸ” αž–αž½αž€αž‚αŸαž’αŸ’αžœαžΎαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžšαŸ„αž„αž€αž»αž“ αžŸαž·αž€αŸ’αžŸαžΆαž•αŸ’αž‘αžΆαŸ†αž„αž‘αžΉαž€αž€αž€ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ„αž™αž™αŸ„αž’αžΆ αž“αž·αž„αž’αŸ’αž“αž€αžαŸ†αžŽαžΆαž„αž“αŸƒαžœαž·αžŸαŸαž™αž€αžŸαž·αž€αž˜αŸ’αž˜αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸαžšαŸ€αž“αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž™αž“αŸ’αžαž αŸ„αŸ‡αž‚αŸ’αž˜αžΆαž“αž˜αž“αž»αžŸαŸ’αžŸαž”αžΎαž€αŸ” αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŸαŸ†αž‘αŸαž„αŸ” αž˜αŸ‚αž“αž αžΎαž™ αž’αŸ’αž“αž€αž…αŸ’αžšαžΌαžαž“αžΉαž„αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αŸ’αžšαžΆαž”αŸ‹αž±αŸ’αž™αž’αŸ’αžœαžΎαŸ” αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž’αžαŸ’αžαž”αž‘αž˜αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž… αž“αž·αž„αžœαžΈαžŠαŸαž’αžΌαž“αŸƒαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ UAV αŸ”

αž‡αžΆαžαž·αžŠαŸ‚αž€

αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

  • αžŸαŸαž€ ARDrone 2.0;
  • αžαŸ’αžŸαŸ‚αž’αŸŠαžΈαžŸαžΊαžšαžŽαž·αž;
  • αž˜αžΈαž€αŸ’αžšαžΌαž αŸ’αžœαžΌαž“αž›αŸ’αž’αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž›αžΎαžŸαŸ’αžαžΆαž“αžΈαž™αž€αžΆαžšαž„αžΆαžšαž‡αžΆαž˜αž½αž™ Windows/Mac/UbuntuαŸ” αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Mac αž“αž·αž„ Ubuntu 18.04 αŸ”

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

αž‘αžΆαž‰αž™αž€αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαžšαž”αžŸαŸ‹ Node.js αž–αžΈ αž‚αŸαž αž‘αŸ†αž–αŸαžšαž•αŸ’αž›αžΌαžœαž€αžΆαžš.

αžαŸ’αžšαžΌαžœαž€αžΆαžšαž•αž„αžŠαŸ‚αžšαŸ” αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαžšαž”αžŸαŸ‹ Google Chrome.

αž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αž’αŸ†αž–αžΈαž‘αž„αŸ‹αžŠαŸ‚αž„

αž…αžΌαžšαž™αžΎαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž› Parrot ARDrone αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αžŸαŸ’αž–αžΆαž“αŸ‹αž“αŸαŸ‡αž˜αžΆαž“αž˜αŸ‰αžΌαž‘αŸαžšαž”αž½αž“αŸ”

αž™αžΎαž„αžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαžŠαŸ„αž™αžŸαŸ†αž‘αŸαž„αž“αŸƒ copter αžŠαŸ„αž™αž”αŸ’αžšαžΎ Node.js αž“αž·αž„ ARDrone

αž˜αŸ‰αžΌαž‘αŸαžšαž”αŸ’αžšαž†αžΆαŸ†αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž‘αž·αžŸαžŠαŸ…αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž‚αžΌαž˜αž½αž™αž”αž„αŸ’αžœαž·αž›αžαžΆαž˜αž‘αŸ’αžšαž“αž·αž…αž“αžΆαž‘αž·αž€αžΆ αž˜αž½αž™αž‘αŸ€αžαž…αŸ’αžšαžΆαžŸαž‘αŸ’αžšαž“αž·αž…αž“αžΆαž‘αž·αž€αžΆαŸ” αžŠαŸ’αžšαžΌαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαžŠαŸ„αž™αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž˜αž»αŸ†αž‘αŸ†αž“αŸ„αžšαž‘αžΆαž€αŸ‹αž‘αž„αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸƒαž•αŸ‚αž“αžŠαžΈ αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž›αŸ’αž”αžΏαž“αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αžœαž·αž›αžšαž”αžŸαŸ‹αž˜αŸ‰αžΌαž‘αŸαžš αž“αž·αž„αž…αž›αž“αžΆαžŠαŸ‚αž›αž’αžΆαž…αž”αžαŸ‹αž”αŸ‚αž“αž”αžΆαž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αž™αžΎαž„αžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαžŠαŸ„αž™αžŸαŸ†αž‘αŸαž„αž“αŸƒ copter αžŠαŸ„αž™αž”αŸ’αžšαžΎ Node.js αž“αž·αž„ ARDrone

αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžαžΆαž„αž›αžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž•αŸ’αžŸαŸαž„αŸ—αž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αžŸαžŠαŸ…αž“αŸƒαž…αž›αž“αžΆαžšαž”αžŸαŸ‹ copter αŸ” αž§αž‘αžΆαž αžšαžŽαŸαž€αžΆαžšαžαž™αž…αž»αŸ‡αž¬αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αžœαž·αž›αžšαž”αžŸαŸ‹ rotors αž†αŸ’αžœαŸαž„αž“αž·αž„αžŸαŸ’αžαžΆαŸ†αž”αž„αŸ’αž€αžΎαžαž‡αžΆαžœαž·αž›αŸ” αž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™ Drone αž αŸ„αŸ‡αž αžΎαžšαž‘αŸ…αž˜αž»αž αž¬αžαž™αž€αŸ’αžšαŸ„αž™αŸ”

αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž›αŸ’αž”αžΏαž“ αž“αž·αž„αž‘αž·αžŸαžŠαŸ…αžšαž”αžŸαŸ‹αž˜αŸ‰αžΌαž‘αŸαžš αž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αž˜αž»αŸ†αž›αŸ†αž’αŸ€αž„αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™ copter αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž€αŸ’αž“αž»αž„αž‘αž·αžŸαžŠαŸ…αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž·αž€αŸ’αžŸαžΆαž–αžΈαž›αŸ†αž αž’αžΆαž€αžΆαžŸαž‘αŸ αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž™αž›αŸ‹αž’αŸ†αž–αžΈαž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

αžšαž”αŸ€αž”αžŠαŸ‚αž› Parrot ARDrone αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš

Drone αž‚αžΊαž‡αžΆ Wi-Fi hotspot αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž“αž·αž„αž•αŸ’αž‰αžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‘αŸ… copter αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž…αŸ†αžŽαž»αž…αž“αŸαŸ‡αŸ” αž˜αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ quadcopters αŸ” αžœαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

αž™αžΎαž„αžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαžŠαŸ„αž™αžŸαŸ†αž‘αŸαž„αž“αŸƒ copter αžŠαŸ„αž™αž”αŸ’αžšαžΎ Node.js αž“αž·αž„ ARDrone

αžŠαžšαžΆαž”αžŽαžΆ Drone αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹ αžŸαžΌαž˜αž”αžΎαž€αžŸαŸ’αžαžΆαž“αžΈαž™ αž“αž·αž„ telnet 192.168.1.1 - αž“αŸαŸ‡αž‚αžΊαž‡αžΆ IP αžšαž”αžŸαŸ‹ copter αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αžΈαž“αž»αž…αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎ αž›αžΈαž“αž»αž… Busybox.

αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

αž€αžΌαžŠαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αžΉαž„αž”αŸ‚αž„αž…αŸ‚αž€αž‡αžΆαž˜αŸ‰αžΌαžŒαž»αž›αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

  • αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž‡αžΆαž˜αž½αž™ API αž€αžΆαžšαž“αž·αž™αžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž€αžƒαžΎαž‰αžŸαŸ†αž‘αŸαž„;
  • αžαŸ’αžšαž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αž“αž·αž„αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž‡αžΆαž˜αž½αž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ”
  • αž•αŸ’αž‰αžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‘αŸ…αž™αž“αŸ’αžαž αŸ„αŸ‡αž‚αŸ’αž˜αžΆαž“αž˜αž“αž»αžŸαŸ’αžŸαž”αžΎαž€;
  • αž€αžΆαžšαž•αŸ’αžŸαžΆαž™αž”αž“αŸ’αžαž•αŸ’αž‘αžΆαž›αŸ‹αžœαžΈαžŠαŸαž’αžΌαŸ”

API αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžšαžΆαž”αžŽαžΆαž˜αžΆαž“αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαŸ” αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž”αŸ’αžšαžΆαž€αžŠβ€‹αžαžΆβ€‹αžœαžΆ αž™αžΎαž„β€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž€αžΆαžšβ€‹αžαž—αŸ’αž‡αžΆαž”αŸ‹β€‹αž’αŸŠαžΈαžŸαžΊαžšαžŽαž·αžαŸ”

αžŠαž›αŸ‹αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž αžΎαž™!

αž€αžΌαžŠ

αžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžαžαžαŸ’αž˜αžΈαž˜αž½αž™ αž αžΎαž™αž”αŸ’αžαžΌαžšαž‘αŸ…αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ’αžαžΆαž“αžΈαž™αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„ Node αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αžŠαŸ†αž‘αžΎαž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ”

αž›αŸ’αž„αžΆαž…αžŠαŸ†αž‘αžΎαž„β€Š

αž™αžΎαž„αž“αžΉαž„αž‚αžΆαŸ†αž‘αŸ’αžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αž αŸ„αŸ‡αž‘αžΎαž„;
  • αž€αžΆαžšαž…αž»αŸ‡αž…αž;
  • αž‘αžΎαž„ - αž™αž“αŸ’αžαž αŸ„αŸ‡αž‚αŸ’αž˜αžΆαž“αž˜αž“αž»αžŸαŸ’αžŸαž”αžΎαž€αž€αžΎαž“αž‘αžΎαž„αž€αž“αŸ’αž›αŸ‡αž˜αŸ‰αŸ‚αžαŸ’αžšαž αžΎαž™αž αŸ„αŸ‡αž‘αžΎαž„;
  • αž…αž»αŸ‡αž€αŸ’αžšαŸ„αž˜ - αž’αŸ’αž›αžΆαž€αŸ‹αž€αž“αŸ’αž›αŸ‡αž˜αŸ‰αŸ‚αžαŸ’αžšαž“αž·αž„αž”αž„αŸ’αž€αž€;
  • αž‘αŸ…αžαžΆαž„αž†αŸ’αžœαŸαž„ - αž‘αŸ…αž–αžΆαž€αŸ‹αž€αžŽαŸ’αžαžΆαž›αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αŸ…αžαžΆαž„αž†αŸ’αžœαŸαž„;
  • αž‘αŸ…αžαžΆαž„αžŸαŸ’αžαžΆαŸ† - αž‘αŸ…αž–αžΆαž€αŸ‹αž€αžŽαŸ’αžαžΆαž›αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αŸ…αžαžΆαž„αžŸαŸ’αžαžΆαŸ†;
  • αž€αžΆαžšαž”αž„αŸ’αžœαž·αž› - αž”αž„αŸ’αžœαž·αž›αžαžΆαž˜αž‘αŸ’αžšαž“αž·αž…αž“αžΆαž‘αž·αž€αžΆ 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'
 });
};

αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ (αžœαžΆαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž±αŸ’αž™αž”αŸ’αžšαžΆαž€αžŠαžαžΆ copter αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… Wi-Fi αž αžΎαž™αžαŸ’αžŸαŸ‚ Ethernet αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžš)αŸ”

αž”αžΎαž€ localhost:3000 αž“αŸ…αž€αŸ’αž“αž»αž„ browser αž αžΎαž™αž…αž»αž… Start RecognitionαŸ”

αž™αžΎαž„αžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαžŠαŸ„αž™αžŸαŸ†αž‘αŸαž„αž“αŸƒ copter αžŠαŸ„αž™αž”αŸ’αžšαžΎ Node.js αž“αž·αž„ ARDrone

αž™αžΎαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž™αž“αŸ’αžαž αŸ„αŸ‡αž‚αŸ’αž˜αžΆαž“αž˜αž“αž»αžŸαŸ’αžŸαž”αžΎαž€ αž αžΎαž™αžŸαž”αŸ’αž”αžΆαž™αž…αž·αžαŸ’αžαŸ”

αž€αžΆαžšαž•αŸ’αžŸαžΆαž™αžœαžΈαžŠαŸαž’αžΌαž–αžΈαž™αž“αŸ’αžαž αŸ„αŸ‡αž‚αŸ’αž˜αžΆαž“αž˜αž“αž»αžŸαŸ’αžŸαž”αžΎαž€

αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„ αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαžαŸ’αž˜αžΈ αž αžΎαž™αž…αž˜αŸ’αž›αž„αž€αžΌαžŠαž“αŸαŸ‡αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ–

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 αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžœαžΈαžŠαŸαž’αžΌαž–αžΈαž€αžΆαž˜αŸαžšαŸ‰αžΆαžαžΆαž„αž˜αž»αžαŸ”

αž™αžΎαž„αžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆαžŠαŸ„αž™αžŸαŸ†αž‘αŸαž„αž“αŸƒ copter αžŠαŸ„αž™αž”αŸ’αžšαžΎ Node.js αž“αž·αž„ ARDrone

αž‡αŸ†αž“αž½αž™αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ

  • αž αŸ„αŸ‡αž αžΎαžš Drone αž“αŸαŸ‡αž€αŸ’αž“αž»αž„αž•αŸ’αž‘αŸ‡αŸ”
  • αžαŸ’αžšαžΌαžœαžŠαžΆαž€αŸ‹αž‚αž˜αŸ’αžšαž”αž€αžΆαžšαž–αžΆαžšαž“αŸ…αž›αžΎ Drone αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž˜αž»αž“αž–αŸαž›αž αŸ„αŸ‡αž‘αžΎαž„αŸ”
  • αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎαžαŸ’αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž€αž¬αž’αžαŸ‹αŸ”
  • αž”αŸ’αžšαžŸαž·αž“αž”αžΎ Drone αž˜αžΆαž“αž₯αžšαž·αž™αžΆαž”αž‘αž…αž˜αŸ’αž›αŸ‚αž€ αžŸαžΌαž˜αžŸαž„αŸ’αž€αžαŸ‹αžœαžΆαž…αž»αŸ‡ αž αžΎαž™αžαŸ’αžšαž‘αž”αŸ‹αžœαžΆαž–αžΈαž›αžΎαŸ” αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž“αŸαŸ‡αž“αžΉαž„αžŠαžΆαž€αŸ‹ copter αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž”αž“αŸ’αž‘αžΆαž“αŸ‹ αž αžΎαž™ rotors αž“αžΉαž„αžˆαž”αŸ‹αž—αŸ’αž›αžΆαž˜αŸ—αŸ”

αž€αžΌαžŠ αž“αž·αž„αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αžšαž½αž…αžšαžΆαž›αŸ‹

αž•αŸ’αž‘αžΆαž›αŸ‹ DEMO

αž‘αžΆαž‰αž™αž€

αž”αžΆαž“αž€αžΎαžαž‘αžΎαž„!

αžŸαžšαžŸαŸαžšβ€‹αž€αžΌαžŠβ€‹αžšαž½αž…β€‹αž˜αžΎαž›β€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“β€‹αž…αžΆαž”αŸ‹β€‹αž•αŸ’αžŠαžΎαž˜β€‹αžŸαŸ’αžŠαžΆαž”αŸ‹β€‹αž”αž„αŸ’αž‚αžΆαž”αŸ‹β€‹αž“αžΉαž„β€‹αž•αŸ’αžŠαž›αŸ‹β€‹αž—αžΆαž–β€‹αžšαžΈαž€αžšαžΆαž™! αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž™αžΎαž„β€‹αž”αžΆαž“β€‹αžšαž€β€‹αžƒαžΎαž‰β€‹αž–αžΈβ€‹αžšαž”αŸ€αž”β€‹αž”αž„αŸ’αžšαŸ€αž“β€‹αž™αž“αŸ’αžαž αŸ„αŸ‡β€‹αž‚αŸ’αž˜αžΆαž“β€‹αž˜αž“αž»αžŸαŸ’αžŸβ€‹αž”αžΎαž€β€‹αž±αŸ’αž™β€‹αžŸαŸ’αžαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αž”αž‰αŸ’αž‡αžΆβ€‹αžŠαŸ„αž™β€‹αžŸαŸ†αž‘αŸαž„αŸ” αžαžΆαž˜αž–αž·αžαž‘αŸ… αž˜αžΆαž“αž›αž‘αŸ’αž’αž—αžΆαž–αž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αžαŸ– αž€αžΆαžšαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž˜αž»αžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž€αžΆαžšαž αŸ„αŸ‡αž αžΎαžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αž€αžΆαžšαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αžΆαž™αžœαž·αž€αžΆαžš αž“αž·αž„αž…αŸ’αžšαžΎαž“αž‘αŸ€αžαŸ”

αžαžΎαž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αžαž›αŸ‹αž™αŸ„αž”αž›αŸ‹αž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ‚αž›αž˜αŸ’αž’αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ?

Skillbox αžŽαŸ‚αž“αžΆαŸ†αŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹