āφāĻŽāϰāĻž Node.js āĻāĻŦāĻ‚ ARDrone āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻĒā§āϟāĻžāϰ⧇āϰ āĻ­āϝāĻŧ⧇āϏ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻ•āϰāĻŋ

āφāĻŽāϰāĻž Node.js āĻāĻŦāĻ‚ ARDrone āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻĒā§āϟāĻžāϰ⧇āϰ āĻ­āϝāĻŧ⧇āϏ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻ•āϰāĻŋ

āĻāχ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ⧇ āφāĻŽāϰāĻž Node.js āĻāĻŦāĻ‚ āĻ“āϝāĻŧ⧇āĻŦ āĻ¸ā§āĻĒāĻŋāϚ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ­āϝāĻŧ⧇āϏ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āϏāĻš āĻāĻ•āϟāĻŋ āĻĄā§āϰ⧋āύ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϤ⧈āϰāĻŋāϰ āĻŦāĻŋāώāϝāĻŧ⧇ āĻĻ⧇āĻ–āĻŦāĨ¤ āĻ•āĻĒā§āϟāĻžāϰ - āĻĒā§āϝāĻžāϰāϟ āĻāφāϰāĻĄā§āϰ⧋āύ 2.0āĨ¤

āφāĻŽāϰāĻž āĻŽāύ⧇ āĻ•āϰāĻŋāϝāĻŧ⧇ āĻĻāĻŋāĻšā§āĻ›āĻŋ: "Habr"-āĻāϰ āϏāĻ•āϞ āĻĒāĻžāĻ āĻ•āĻĻ⧇āϰ āϜāĻ¨ā§āϝ - "Habr" āĻĒā§āϰāϚāĻžāϰāĻŽā§‚āϞāĻ• āϕ⧋āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϝ⧇āϕ⧋āύ⧋ Skillbox āϕ⧋āĻ°ā§āϏ⧇ āύāĻĨāĻŋāϭ⧁āĻ•ā§āϤ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ 10 āϰ⧁āĻŦ⧇āϞ āĻ›āĻžāĻĄāĻŧāĨ¤

Skillbox āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰ⧇: āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ• āϕ⧋āĻ°ā§āϏ "āĻŽā§‹āĻŦāĻžāχāϞ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰ āĻĒā§āϰ⧋".

āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

āĻĄā§āϰ⧋āύ āφāĻļā§āϚāĻ°ā§āϝāϜāύāĻ•āĨ¤ āφāĻŽāĻŋ āϏāĻ¤ā§āϝāĻŋāχ āφāĻŽāĻžāϰ āϕ⧋āϝāĻŧāĻžāĻĄā§‡āϰ āϏāĻžāĻĨ⧇ āϖ⧇āϞāϤ⧇, āĻĢāĻŸā§‹ āĻāĻŦāĻ‚ āĻ­āĻŋāĻĄāĻŋāĻ“ āϤ⧁āϞāϤ⧇ āĻŦāĻž āĻŽāϜāĻž āĻ•āϰāϤ⧇ āωāĻĒāĻ­ā§‹āĻ— āĻ•āϰāĻŋāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŽāύ⧁āĻˇā§āϝāĻŦāĻŋāĻšā§€āύ āĻŦāĻžāϝāĻŧāĻŦā§€āϝāĻŧ āϝāĻžāύ (āχāωāĻāĻ­āĻŋ) āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻŦāĻŋāύ⧋āĻĻāύ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āϤāĻžāϰāĻž āϏāĻŋāύ⧇āĻŽāĻžāϝāĻŧ āĻ•āĻžāϜ āĻ•āϰ⧇, āĻšāĻŋāĻŽāĻŦāĻžāĻš āĻ…āĻ§ā§āϝāϝāĻŧāύ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϏ⧇āύāĻžāĻŦāĻžāĻšāĻŋāύ⧀ āĻāĻŦāĻ‚ āĻ•ā§ƒāώāĻŋ āĻ–āĻžāϤ⧇āϰ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧāĨ¤

āĻāχ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ⧇ āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĻ⧇āĻ–āĻŦ āϝāĻž āφāĻĒāύāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āĻĄā§āϰ⧋āύ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āĻĻ⧇āĻŦ⧇āĨ¤ āĻ­āϝāĻŧ⧇āϏ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻšā§āϝāĻžāρ, āĻ•āĻĒā§āϟāĻžāϰ āφāĻĒāύāĻŋ āϝāĻž āĻ•āϰāϤ⧇ āĻŦāϞāĻŦ⧇āύ āϤāĻž āĻ•āϰāĻŦ⧇āĨ¤ āύāĻŋāĻŦāĻ¨ā§āϧ⧇āϰ āĻļ⧇āώ⧇ āĻāĻ•āϟāĻŋ āϰ⧇āĻĄāĻŋāĻŽā§‡āĻĄ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻāĻŦāĻ‚ āχāωāĻāĻ­āĻŋ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāϪ⧇āϰ āĻ­āĻŋāĻĄāĻŋāĻ“ āϰāϝāĻŧ⧇āϛ⧇āĨ¤

āϞ⧋āĻšāĻž

āφāĻŽāĻžāĻĻ⧇āϰ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĒā§āϰāϝāĻŧā§‹āϜāύ:

  • āϤ⧋āϤāĻž ARDrone 2.0;
  • āχāĻĨāĻžāϰāύ⧇āϟ āϤāĻžāϰ⧇āϰ;
  • āĻ­āĻžāϞ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĢā§‹āύāĨ¤

āĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āĻ¸ā§āĻŸā§‡āĻļāύāϗ⧁āϞāĻŋāϤ⧇ āωāĻ¨ā§āύāϝāĻŧāύ āĻ“ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž āĻĒāϰāĻŋāϚāĻžāϞāĻŋāϤ āĻšāĻŦ⧇ Windows/āĻŽā§āϝāĻžāĻ•/UbuntuāĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤāĻ­āĻžāĻŦ⧇, āφāĻŽāĻŋ āĻŽā§āϝāĻžāĻ• āύāĻŋāϝāĻŧ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĻ›āĻŋ āĻāĻŦāĻ‚ Ubuntu 18.04.

āϏāĻĢā§āϟāĻ“āϝāĻŧā§āϝāĻžāϰ

āĻĨ⧇āϕ⧇ Node.js āĻāϰ āϏāĻ°ā§āĻŦāĻļ⧇āώ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰ⧁āύ āĻ…āĻĢāĻŋāϏāĻŋāϝāĻŧāĻžāϞ āϏāĻžāχāϟ.

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āϗ⧁āĻ—āϞ āĻ•ā§āϰ⧋āĻŽā§‡āϰ āϏāĻ°ā§āĻŦāĻļ⧇āώ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ.

āĻ•āĻĒā§āϟāĻžāϰ āĻŦā§‹āĻāĻž

āĻĒā§āϝāĻžāϰāϟ āĻāφāϰāĻĄā§āϰ⧋āύ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ āϤāĻž āĻŦā§‹āĻāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤ āĻāχ āĻ•āĻĒā§āϟāĻžāϰ⧇ āϚāĻžāϰāϟāĻŋ āĻŽā§‹āϟāϰ āφāϛ⧇āĨ¤

āφāĻŽāϰāĻž Node.js āĻāĻŦāĻ‚ ARDrone āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻĒā§āϟāĻžāϰ⧇āϰ āĻ­āϝāĻŧ⧇āϏ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻ•āϰāĻŋ

āĻŦāĻŋāϰ⧋āϧ⧀ āĻŽā§‹āϟāϰ āĻāĻ•āχ āĻĻāĻŋāϕ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻœā§‹āĻĄāĻŧāĻž āϘāĻĄāĻŧāĻŋāϰ āĻ•āĻžāρāϟāĻžāϰ āĻĻāĻŋāϕ⧇ āĻ˜ā§‹āϰ⧇, āĻ…āĻ¨ā§āϝāϟāĻŋ āϘāĻĄāĻŧāĻŋāϰ āĻ•āĻžāρāϟāĻžāϰ āĻŦāĻŋāĻĒāϰ⧀āϤ āĻĻāĻŋāϕ⧇āĨ¤ āĻĄā§āϰ⧋āύāϟāĻŋ āĻĒ⧃āĻĨāĻŋāĻŦā§€āϰ āĻĒ⧃āĻˇā§āϠ⧇āϰ āϏāĻžāĻĒ⧇āĻ•ā§āώ⧇ āĻĒā§āϰāĻŦāĻŖāϤāĻžāϰ āϕ⧋āĻŖ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇, āĻŽā§‹āϟāϰāϗ⧁āϞāĻŋāϰ āĻ˜ā§‚āĻ°ā§āĻŖāύ⧇āϰ āĻ—āϤāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻŦ⧇āĻļ āĻ•āĻŋāϛ⧁ āϚāĻžāϞāϚāϞāύāϝ⧋āĻ—ā§āϝ āφāĻ¨ā§āĻĻā§‹āϞāύ āĻ•āϰ⧇āĨ¤

āφāĻŽāϰāĻž Node.js āĻāĻŦāĻ‚ ARDrone āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻĒā§āϟāĻžāϰ⧇āϰ āĻ­āϝāĻŧ⧇āϏ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻ•āϰāĻŋ

āφāĻŽāϰāĻž āωāĻĒāϰ⧇āϰ āĻĄāĻžāϝāĻŧāĻžāĻ—ā§āϰāĻžāĻŽā§‡ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āĻ›āĻŋ, āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϞ⧇ āĻ•āĻĒā§āϟāĻžāϰ⧇āϰ āϚāϞāĻžāϚāϞ⧇āϰ āĻĻāĻŋāĻ• āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšāϝāĻŧāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻŦāĻžāĻŽ āĻāĻŦāĻ‚ āĻĄāĻžāύ āϰāϟāĻžāϰāϗ⧁āϞāĻŋāϰ āĻ˜ā§‚āĻ°ā§āĻŖāύ āĻ—āϤāĻŋ āĻšā§āϰāĻžāϏ āĻŦāĻž āĻŦ⧃āĻĻā§āϧāĻŋ āĻāĻ•āϟāĻŋ āϰ⧋āϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āĻĄā§āϰ⧋āύāϟāĻŋāϕ⧇ āϏāĻžāĻŽāύ⧇ āĻŦāĻž āĻĒāĻŋāĻ›āύ⧇ āωāĻĄāĻŧāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤

āĻŽā§‹āϟāϰāϗ⧁āϞāĻŋāϰ āĻ—āϤāĻŋ āĻāĻŦāĻ‚ āĻĻāĻŋāĻ• āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇, āφāĻŽāϰāĻž āĻ•āĻžāϤ āϕ⧋āĻŖāϗ⧁āϞāĻŋ āϏ⧇āϟ āĻ•āϰāĻŋ āϝāĻž āĻ•āĻĒā§āϟāĻžāϰāϟāĻŋāϕ⧇ āĻ…āĻ¨ā§āϝ āĻĻāĻŋāϕ⧇ āϝ⧇āϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻĒā§āϰāĻ•ā§ƒāϤāĻĒāĻ•ā§āώ⧇, āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻ…ā§āϝāĻžāϰ⧋āĻĄāĻžāχāύāĻžāĻŽāĻŋāĻ•ā§āϏ āĻ…āĻ§ā§āϝāϝāĻŧāύ āĻ•āϰāĻžāϰ āĻĻāϰāĻ•āĻžāϰ āύ⧇āχ, āφāĻĒāύāĻžāϕ⧇ āϕ⧇āĻŦāϞ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āύ⧀āϤāĻŋāϗ⧁āϞāĻŋ āĻŦ⧁āĻāϤ⧇ āĻšāĻŦ⧇āĨ¤

āĻĒā§āϝāĻžāϰāϟ āĻāφāϰāĻĄā§āϰ⧋āύ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇

āĻĄā§āϰ⧋āύ āĻāĻ•āϟāĻŋ Wi-Fi āĻšāϟāĻ¸ā§āĻĒāϟāĨ¤ āĻ•āĻĒā§āϟāĻžāϰ⧇ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ—ā§āϰāĻšāĻŖ āĻāĻŦāĻ‚ āĻĒāĻžāĻ āĻžāϤ⧇, āφāĻĒāύāĻžāϕ⧇ āĻāχ āĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻ…āύ⧇āĻ•āϗ⧁āϞāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϰāϝāĻŧ⧇āϛ⧇ āϝāĻž āφāĻĒāύāĻžāϕ⧇ āϕ⧋āϝāĻŧāĻžāĻĄāĻ•āĻĒā§āϟāĻžāϰ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻāϟāĻŋ āϏāĻŦ āĻāχ āĻŽāϤ āĻ•āĻŋāϛ⧁ āĻĻ⧇āĻ–āĻžāϝāĻŧ:

āφāĻŽāϰāĻž Node.js āĻāĻŦāĻ‚ ARDrone āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻĒā§āϟāĻžāϰ⧇āϰ āĻ­āϝāĻŧ⧇āϏ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻ•āϰāĻŋ

āĻĄā§āϰ⧋āύāϟāĻŋ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻšāϝāĻŧ⧇ āϗ⧇āϞ⧇, āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ āϖ⧁āϞ⧁āύ āĻāĻŦāĻ‚ 192.168.1.1-āĻ āĻŸā§‡āϞāύ⧇āϟ āĻ•āϰ⧁āύ - āĻāϟāĻŋ āĻ•āĻĒā§āϟāĻžāϰāϟāĻŋāϰ āφāχāĻĒāĻŋāĨ¤ Linux āφāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ Linux busybox.

āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ

āφāĻŽāĻžāĻĻ⧇āϰ āϕ⧋āĻĄ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻŽāĻĄāĻŋāωāϞ āĻŦāĻŋāĻ­āĻ•ā§āϤ āĻ•āϰāĻž āĻšāĻŦ⧇:

  • āĻ­āϝāĻŧ⧇āϏ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻĒāĻŋāϚ API āϏāĻš āχāωāϜāĻžāϰ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ;
  • āĻĢāĻŋāĻ˛ā§āϟāĻžāϰāĻŋāĻ‚ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄā§‡āϰ āϏāĻžāĻĨ⧇ āϤ⧁āϞāύāĻž āĻ•āϰāĻž;
  • āĻĄā§āϰ⧋āύāϕ⧇ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĒāĻžāĻ āĻžāύ⧋;
  • āϞāĻžāχāĻ­ āĻ­āĻŋāĻĄāĻŋāĻ“ āϏāĻŽā§āĻĒā§āϰāϚāĻžāϰāĨ¤

āϝāϤāĻ•ā§āώāĻŖ āχāĻ¨ā§āϟāĻžāϰāύ⧇āϟ āϏāĻ‚āϝ⧋āĻ— āĻĨāĻžāϕ⧇ āϤāϤāĻ•ā§āώāĻŖ API āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇, āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āχāĻĨāĻžāϰāύ⧇āϟ āϏāĻ‚āϝ⧋āĻ— āϝ⧋āĻ— āĻ•āϰāĻŋāĨ¤

āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ!

āϕ⧋āĻĄ

āĻĒā§āϰāĻĨāĻŽā§‡, āφāϏ⧁āύ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāϟāĻŋāϤ⧇ āĻ¸ā§āϝ⧁āχāϚ āĻ•āϰāĻŋāĨ¤

āϤāĻžāϰāĻĒāϰ⧇ āφāĻŽāϰāĻž āύ⧀āĻšā§‡āϰ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āύ⧋āĻĄ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āϤ⧈āϰāĻŋ āĻ•āϰāĻŋāĨ¤

āĻĒā§āϰāĻĨāĻŽāϤ, āφāĻŽāϰāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āύāĻŋāĻ°ā§āĻ­āϰāϤāĻžāϗ⧁āϞāĻŋ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻŋāĨ¤

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);

āĻāĻŦāĻ‚ āĻāĻ–āĻžāύ⧇ āĻāχāϚāϟāĻŋāĻāĻŽāĻāϞ āĻāĻŦāĻ‚ āϜāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϕ⧋āĻĄ āϰāϝāĻŧ⧇āϛ⧇ āϝāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ•āĻĨāĻž āĻļā§‹āύ⧇ āĻāĻŦāĻ‚ āύ⧋āĻĄ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĒāĻžāĻ āĻžāϝāĻŧāĨ¤

<!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" data-gt-translate-attributes='["title"]' title="Start Recording">Start Recognition</button>
                <button id="pause-record-btn" data-gt-translate-attributes='["title"]' 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>

āĻāĻŦāĻ‚ āĻ­āϝāĻŧ⧇āϏ āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϜāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϕ⧋āĻĄ, āύ⧋āĻĄ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻĒāĻžāĻ āĻžāύ⧋āĨ¤

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 āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻāĻŦāĻ‚ āχāĻĨāĻžāϰāύ⧇āϟ āϕ⧇āĻŦāϞāϟāĻŋ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āϰāϝāĻŧ⧇āϛ⧇)āĨ¤

āĻŦā§āϰāĻžāωāϜāĻžāϰ⧇ localhost:3000 āϖ⧁āϞ⧁āύ āĻāĻŦāĻ‚ āĻ¸ā§āϟāĻžāĻ°ā§āϟ āϰāĻŋāĻ•āĻ—āύāĻŋāĻļāύ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤

āφāĻŽāϰāĻž 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);

āĻāĻŦāĻ‚ āĻāĻ–āĻžāύ⧇ āĻāχāϚāϟāĻŋāĻāĻŽāĻāϞ āϕ⧋āĻĄ, āφāĻŽāϰāĻž āĻāϟāĻŋ āĻĒāĻžāĻŦāϞāĻŋāĻ• āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇āϰ āĻ­āĻŋāϤāϰ⧇ āϰāĻžāĻ–āĻŋāĨ¤

<!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>

āϏāĻžāĻŽāύ⧇āϰ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āĻĨ⧇āϕ⧇ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĻ⧇āĻ–āϤ⧇ āϞ⧋āĻ•āĻžāϞāĻšā§‹āĻ¸ā§āϟ: 8080 āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύāĨ¤

āφāĻŽāϰāĻž Node.js āĻāĻŦāĻ‚ ARDrone āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻĒā§āϟāĻžāϰ⧇āϰ āĻ­āϝāĻŧ⧇āϏ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻ•āϰāĻŋ

āϏāĻšāĻžāϝāĻŧāĻ• āϟāĻŋāĻĒāϏ

  • āĻāχ āĻĄā§āϰ⧋āύāϟāĻŋ āĻŦāĻžāĻĄāĻŧāĻŋāϰ āĻ­āĻŋāϤāϰ⧇ āωāĻĄāĻŧāĻžāύāĨ¤
  • āωāĻĄā§āĻĄāϝāĻŧāύ⧇āϰ āφāϗ⧇ āϏāĻ°ā§āĻŦāĻĻāĻž āφāĻĒāύāĻžāϰ āĻĄā§āϰ⧋āύāϟāĻŋāϤ⧇ āĻĒā§āϰāϤāĻŋāϰāĻ•ā§āώāĻžāĻŽā§‚āϞāĻ• āĻ•āĻ­āĻžāϰ āϰāĻžāϖ⧁āύāĨ¤
  • āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āϚāĻžāĻ°ā§āϜ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻ•āĻŋāύāĻž āϤāĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύāĨ¤
  • āϝāĻĻāĻŋ āĻĄā§āϰ⧋āύāϟāĻŋ āĻ…āĻĻā§āϭ⧁āϤ āφāϚāϰāĻŖ āĻ•āϰ⧇ āϤāĻŦ⧇ āĻāϟāĻŋāϕ⧇ āϧāϰ⧇ āϰāĻžāϖ⧁āύ āĻāĻŦāĻ‚ āĻāϟāĻŋāϕ⧇ āωāĻ˛ā§āϟāĻŋāϝāĻŧ⧇ āĻĻāĻŋāύāĨ¤ āĻāχ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϟāĻŋ āĻ•āĻĒā§āϟāĻžāϰāϟāĻŋāϕ⧇ āϜāϰ⧁āϰ⧀ āĻŽā§‹āĻĄā§‡ āϰāĻžāĻ–āĻŦ⧇ āĻāĻŦāĻ‚ āϰ⧋āϟāĻžāϰāϗ⧁āϞāĻŋ āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āĻŦāĻ¨ā§āϧ āĻšāϝāĻŧ⧇ āϝāĻžāĻŦ⧇āĨ¤

āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āϕ⧋āĻĄ āĻāĻŦāĻ‚ āĻĄā§‡āĻŽā§‹

āĻœā§€āĻŦāĻ¨ā§āϤ āωāĻĻāĻžāĻšāϰāĻŖ

āĻĄāĻžāωāύāϞ⧋āĻĄ

āϘāĻŸā§‡āĻ›āĻŋāϞ⧋!

āϕ⧋āĻĄ āϞ⧇āĻ–āĻž āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ āĻŽā§‡āĻļāĻŋāύ āĻŽāĻžāύāϤ⧇ āĻļ⧁āϰ⧁ āĻ•āϰāĻž āφāĻĒāύāĻžāϕ⧇ āφāύāĻ¨ā§āĻĻ āĻĻ⧇āĻŦ⧇! āĻāĻ–āύ āφāĻŽāϰāĻž āϚāĻŋāĻ¨ā§āϤāĻž āĻ•āϰ⧇āĻ›āĻŋ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ­āϝāĻŧ⧇āϏ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻļ⧁āύāϤ⧇ āĻĄā§āϰ⧋āύ āĻļ⧇āĻ–āĻžāύ⧋ āϝāĻžāϝāĻŧāĨ¤ āφāϏāϞ⧇, āφāϰāĻ“ āĻ…āύ⧇āĻ• āϏāĻŽā§āĻ­āĻžāĻŦāύāĻž āϰāϝāĻŧ⧇āϛ⧇: āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻŽā§āϖ⧇āϰ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāϤāĻŋ, āĻ¸ā§āĻŦāĻžāϝāĻŧāĻ¤ā§āϤāĻļāĻžāϏāĻŋāϤ āĻĢā§āϞāĻžāχāϟ, āĻ…āĻ™ā§āĻ—āĻ­āĻ™ā§āĻ—āĻŋ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāϤāĻŋ āĻāĻŦāĻ‚ āφāϰāĻ“ āĻ…āύ⧇āĻ• āĻ•āĻŋāϛ⧁āĨ¤

āφāĻĒāύāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āωāĻ¨ā§āύāϤ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āĻŋ āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύ?

Skillbox āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰ⧇:

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster