рдЖрдореНрд╣реА Node.js рдЖрдгрд┐ ARDrone рд╡рд╛рдкрд░реВрди рдХреЙрдкреНрдЯрд░рдЪреЗ рд╡реНрд╣реЙрдЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЛ

рдЖрдореНрд╣реА Node.js рдЖрдгрд┐ ARDrone рд╡рд╛рдкрд░реВрди рдХреЙрдкреНрдЯрд░рдЪреЗ рд╡реНрд╣реЙрдЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЛ

рдпрд╛ рдЯреНрдпреБрдЯреЛрд░рд┐рдпрд▓рдордзреНрдпреЗ рдЖрдкрдг Node.js рдЖрдгрд┐ рд╡реЗрдм рд╕реНрдкреАрдЪ API рд╡рд╛рдкрд░реВрди рд╡реНрд╣реЙрдИрд╕ рдХрдВрдЯреНрд░реЛрд▓рд╕рд╣ рдбреНрд░реЛрдирд╕рд╛рдареА рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдХрдбреЗ рд▓рдХреНрд╖ рджреЗрдК. рдХреЙрдкреНрдЯрд░ - рдкреЛрдкрдЯ рдПрдЖрд░рдбреНрд░реЛрди 2.0.

рдЖрдореНрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ: рд╕рд░реНрд╡ Habr рд╡рд╛рдЪрдХрд╛рдВрд╕рд╛рдареА - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рд╡рд╛рдкрд░реВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдирд╛рд╡рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ 10 рд░реВрдмрд▓ рд╕рд╡рд▓рдд.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ: рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕ "рдореЛрдмрд╛рдЗрд▓ рдбреЗрд╡реНрд╣рд▓рдкрд░ рдкреНрд░реЛ".

рдкрд░рд┐рдЪрдп

рдбреНрд░реЛрди рдЖрд╢реНрдЪрд░реНрдпрдХрд╛рд░рдХ рдЖрд╣реЗрдд. рдорд▓рд╛ рдорд╛рдЭреНрдпрд╛ рдХреНрд╡рд╛рдбрд╕реЛрдмрдд рдЦреЗрд│рдгреНрдпрд╛рдд, рдлреЛрдЯреЛ рдЖрдгрд┐ рд╡реНрд╣рд┐рдбрд┐рдУ рдХрд╛рдврдгреНрдпрд╛рдд рдХрд┐рдВрд╡рд╛ рдлрдХреНрдд рдордЬрд╛ рдХрд░рд╛рдпрд▓рд╛ рдЖрд╡рдбрддреЗ. рдкрд░рдВрддреБ рдорд╛рдирд╡рд░рд╣рд┐рдд рд╣рд╡рд╛рдИ рд╡рд╛рд╣рдиреЗ (UAV) рдлрдХреНрдд рдордиреЛрд░рдВрдЬрдирд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддрд╛рдд. рддреЗ рд╕рд┐рдиреЗрдорд╛рдд рдХрд╛рдо рдХрд░рддрд╛рдд, рдЧреНрд▓реЗрд╢рд┐рдпрд░реНрд╕рдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рддрд╛рдд рдЖрдгрд┐ рд▓рд╖реНрдХрд░реА рдЖрдгрд┐ рдХреГрд╖реА рдХреНрд╖реЗрддреНрд░рд╛рдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзреА рд╡рд╛рдкрд░рддрд╛рдд.

рдпрд╛ рдЯреНрдпреБрдЯреЛрд░рд┐рдпрд▓рдордзреНрдпреЗ рдЖрдкрдг рдбреНрд░реЛрди рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдгрд╛рд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╡рд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВ. рд╡реНрд╣реЙрдЗрд╕ рдХрдорд╛рдВрдб рд╡рд╛рдкрд░рдгреЗ. рд╣реЛрдп, рд╣реЗрд▓рд┐рдХреЙрдкреНрдЯрд░ рддреБрдореНрд╣реА рд╕рд╛рдВрдЧрд╛рд▓ рддреЗрдЪ рдХрд░реЗрд▓. рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рдпреВрдПрд╡реНрд╣реА рдирд┐рдпрдВрддреНрд░рдгрд╛рдЪрд╛ рдПрдХ рддрдпрд╛рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрдгрд┐ рд╡реНрд╣рд┐рдбрд┐рдУ рдЖрд╣реЗ.

рд▓реЛрдЦрдВрдб

рдЖрдореНрд╣рд╛рд▓рд╛ рдкреБрдвреАрд▓ рдЧреЛрд╖реНрдЯреАрдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:

  • рдкреЛрдкрдЯ рдПрдЖрд░рдбреНрд░реЛрди 2.0;
  • рдЗрдерд░рдиреЗрдЯ рдХреЗрдмрд▓;
  • рдЪрд╛рдВрдЧрд▓рд╛ рдорд╛рдпрдХреНрд░реЛрдлреЛрди.

Windows/Mac/Ubuntu рд╕рд╣ рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рдиреНрд╕рд╡рд░ рд╡рд┐рдХрд╛рд╕ рдЖрдгрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдХреЗрд▓реЗ рдЬрд╛рдИрд▓. рд╡реИрдпрдХреНрддрд┐рдХрд░рд┐рддреНрдпрд╛, рдореА Mac рдЖрдгрд┐ Ubuntu 18.04 рд╕рд╣ рдХрд╛рдо рдХреЗрд▓реЗ.

рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░

рдпреЗрдереВрди Node.js рдЪреА рдирд╡реАрдирддрдо рдЖрд╡реГрддреНрддреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рд╛ рдЕрдзрд┐рдХреГрдд рд╕рд╛рдЗрдЯ.

рддрд╕реЗрдЪ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ Google Chrome рдЪреА рдирд╡реАрдирддрдо рдЖрд╡реГрддреНрддреА.

рд╣реЗрд▓рд┐рдХреЙрдкреНрдЯрд░ рд╕рдордЬреВрди рдШреЗрдгреЗ

рдкреЛрдкрдЯ рдПрдЖрд░рдбреНрд░реЛрди рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛. рдпрд╛ рдХреЙрдкреНрдЯрд░рдордзреНрдпреЗ рдЪрд╛рд░ рдореЛрдЯрд░реНрд╕ рдЖрд╣реЗрдд.

рдЖрдореНрд╣реА Node.js рдЖрдгрд┐ ARDrone рд╡рд╛рдкрд░реВрди рдХреЙрдкреНрдЯрд░рдЪреЗ рд╡реНрд╣реЙрдЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЛ

рд╡рд┐рд░реЛрдзреА рдореЛрдЯрд░реНрд╕ рддреНрдпрд╛рдЪ рджрд┐рд╢реЗрдиреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд. рдПрдХ рдЬреЛрдбреА рдШрдбреНрдпрд╛рд│рд╛рдЪреНрдпрд╛ рджрд┐рд╢реЗрдиреЗ рдлрд┐рд░рддреЗ, рджреБрд╕рд░реА рдШрдбреНрдпрд╛рд│рд╛рдЪреНрдпрд╛ рдЙрд▓рдЯ рджрд┐рд╢реЗрдиреЗ. рдбреНрд░реЛрди рдкреГрдереНрд╡реАрдЪреНрдпрд╛ рдкреГрд╖реНрдарднрд╛рдЧрд╛рдЪреНрдпрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рдЭреБрдХрд╛рд╡ рдХреЛрди рдмрджрд▓реВрди, рдореЛрдЯрд░реНрд╕рдЪреНрдпрд╛ рд░реЛрдЯреЗрд╢рдирдЪрд╛ рд╡реЗрдЧ рдмрджрд▓реВрди рдЖрдгрд┐ рдЗрддрд░ рдЕрдиреЗрдХ рдХреБрд╢рд▓ рд╣рд╛рд▓рдЪрд╛рд▓реАрдВрджреНрд╡рд╛рд░реЗ рд╣рд▓рддреЛ.

рдЖрдореНрд╣реА Node.js рдЖрдгрд┐ ARDrone рд╡рд╛рдкрд░реВрди рдХреЙрдкреНрдЯрд░рдЪреЗ рд╡реНрд╣реЙрдЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЛ

рдЬрд╕реЗ рдЖрдкрдг рд╡рд░реАрд▓ рдЖрдХреГрддреАрдордзреНрдпреЗ рдкрд╛рд╣реВ рд╢рдХрддреЛ, рд╡рд┐рд╡рд┐рдз рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдмрджрд▓рд▓реНрдпрд╛рдиреЗ рд╣реЗрд▓рд┐рдХреЙрдкреНрдЯрд░рдЪреНрдпрд╛ рд╣рд╛рд▓рдЪрд╛рд▓реАрдЪреНрдпрд╛ рджрд┐рд╢реЗрдиреЗ рдмрджрд▓ рд╣реЛрддреЛ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдбрд╛рд╡реНрдпрд╛ рдЖрдгрд┐ рдЙрдЬрд╡реНрдпрд╛ рд░реЛрдЯрд░реНрд╕рдЪреНрдпрд╛ рд░реЛрдЯреЗрд╢рдирдЪреА рдЧрддреА рдХрдореА рдХрд░рдгреЗ рдХрд┐рдВрд╡рд╛ рд╡рд╛рдврд╡рд┐рдгреЗ рдПрдХ рд░реЛрд▓ рддрдпрд╛рд░ рдХрд░рддреЗ. рдпрд╛рдореБрд│реЗ рдбреНрд░реЛрдирд▓рд╛ рдкреБрдвреЗ рдХрд┐рдВрд╡рд╛ рдорд╛рдЧреЗ рдЙрдбрддрд╛ рдпреЗрддреЗ.

рдореЛрдЯрд░реНрд╕рдЪрд╛ рд╡реЗрдЧ рдЖрдгрд┐ рджрд┐рд╢рд╛ рдмрджрд▓реВрди, рдЖрдореНрд╣реА рдЭреБрдХрд╛рд╡ рдХреЛрди рд╕реЗрдЯ рдХрд░рддреЛ рдЬреЗ рдХреЙрдкреНрдЯрд░рд▓рд╛ рдЗрддрд░ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢рд╛рдВрдордзреНрдпреЗ рд╣рд▓рд╡рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддрд╛рдд. рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рдПрд░реЛрдбрд╛рдпрдиреЕрдорд┐рдХреНрд╕рдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА, рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдореВрд▓рднреВрдд рддрддреНрддреНрд╡реЗ рд╕рдордЬреВрди рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдкреЛрдкрдЯ рдПрдЖрд░рдбреНрд░реЛрди рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ

рдбреНрд░реЛрди рд╣реЗ рд╡рд╛рдп-рдлрд╛рдп рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдЖрд╣реЗ. рдХреЙрдкреНрдЯрд░рд▓рд╛ рдЖрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдкрд╛рдард╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рдмрд┐рдВрджреВрд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЕрд╕реЗ рдмрд░реЗрдЪ рднрд┐рдиреНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрд╣реЗрдд рдЬреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХреНрд╡рд╛рдбрдХреЙрдкреНрдЯрд░реНрд╕ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддрд╛рдд. рд╣реЗ рд╕рд░реНрд╡ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕рддреЗ:

рдЖрдореНрд╣реА Node.js рдЖрдгрд┐ ARDrone рд╡рд╛рдкрд░реВрди рдХреЙрдкреНрдЯрд░рдЪреЗ рд╡реНрд╣реЙрдЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЛ

рдбреНрд░реЛрди рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛рдЪ, рдЯрд░реНрдорд┐рдирд▓ рдЙрдШрдбрд╛ рдЖрдгрд┐ рдЯреЗрд▓рдиреЗрдЯ 192.168.1.1 - рд╣рд╛ рдХреЙрдкреНрдЯрд░рдЪрд╛ рдЖрдпрдкреА рдЖрд╣реЗ. рд▓рд┐рдирдХреНрд╕рд╕рд╛рдареА рддреБрдореНрд╣реА рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ рд▓рд┐рдирдХреНрд╕ рдмрд┐рдЭреАрдмреЙрдХреНрд╕.

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░

рдЖрдордЪрд╛ рдХреЛрдб рдЦрд╛рд▓реАрд▓ рдореЙрдбреНрдпреВрд▓реНрд╕рдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓рд╛ рдЬрд╛рдИрд▓:

  • рдЖрд╡рд╛рдЬ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрдкреАрдЪ API рд╕рд╣ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕;
  • рдЖрджреЗрд╢ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдорд╛рдирдХрд╛рдВрд╢реА рддреБрд▓рдирд╛ рдХрд░рдгреЗ;
  • рдбреНрд░реЛрдирд▓рд╛ рдЖрджреЗрд╢ рдкрд╛рдард╡рдгреЗ;
  • рдереЗрдЯ рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╕рд╛рд░рдг.

рдЬреЛрдкрд░реНрдпрдВрдд рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдЖрд╣реЗ рддреЛрдкрд░реНрдпрдВрдд API рдХрд╛рд░реНрдп рдХрд░рддреЗ. рд╣реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдЗрдерд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдЬреЛрдбрддреЛ.

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ!

рдХреЛрдб

рдкреНрд░рдердо, рдПрдХ рдирд╡реАрди рдлреЛрд▓реНрдбрд░ рддрдпрд╛рд░ рдХрд░реВ рдЖрдгрд┐ рдЯрд░реНрдорд┐рдирд▓ рд╡рд╛рдкрд░реВрди рддреНрдпрд╛рд╡рд░ рд╕реНрд╡рд┐рдЪ рдХрд░реВ.

рддреНрдпрд╛рдирдВрддрд░ рдЦрд╛рд▓реАрд▓ рдХрдорд╛рдВрдбреНрд╕ рд╡рд╛рдкрд░реВрди рдиреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддрдпрд╛рд░ рдХрд░реВ.

рдкреНрд░рдердо, рдЖрдореНрд╣реА рдЖрд╡рд╢реНрдпрдХ рдЕрд╡рд▓рдВрдмрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЛ.

рдПрдирдкреАрдПрдо рд╕реНрдерд╛рдкрд┐рддтАК

рдЖрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рдЖрдЬреНрдЮрд╛рдВрдЪреЗ рд╕рдорд░реНрдерди рдХрд░реВ:

  • рдЯреЗрдХрдСрдл;
  • рдЙрддрд░рдгреЗ;
  • рд╡рд░ - рдбреНрд░реЛрди рдЕрд░реНрдзрд╛ рдореАрдЯрд░ рдЙрдЧрд╡рддреЛ рдЖрдгрд┐ рдШрд┐рд░рдЯреНрдпрд╛ рдШрд╛рд▓рддреЛ;
  • рдЦрд╛рд▓реА - рдЕрд░реНрдзрд╛ рдореАрдЯрд░ рдкрдбрддреЛ рдЖрдгрд┐ рдЧреЛрдарддреЛ;
  • рдбрд╛рд╡реАрдХрдбреЗ - рдбрд╛рд╡реАрдХрдбреЗ рдЕрд░реНрдзрд╛ рдореАрдЯрд░ рдЬрд╛рддреЛ;
  • рдЙрдЬрд╡реАрдХрдбреЗ - рдЕрд░реНрдзрд╛ рдореАрдЯрд░ рдЙрдЬрд╡реАрдХрдбреЗ рдЬрд╛рддреЗ;
  • рд░реЛрдЯреЗрд╢рди - рдШрдбреНрдпрд╛рд│рд╛рдЪреНрдпрд╛ рджрд┐рд╢реЗрдиреЗ 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 рдХреЛрдб рдЖрд╣реЗ рдЬреЛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреЗ рдРрдХрддреЛ рдЖрдгрд┐ рдиреЛрдб рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рдХрдорд╛рдВрдб рдкрд╛рдард╡рддреЛ.

<!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 рдХреЛрдб, рддреНрдпрд╛рдВрдирд╛ рдиреЛрдб рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдкрд╛рдард╡рдгреЗ.

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

рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд╛рдБрдЪ рдХрд░рдд рдЖрд╣реЗ

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рд▓реЙрдиреНрдЪ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ (рдХреЙрдкреНрдЯрд░ рд╡рд╛рдп-рдлрд╛рдпрд╢реА рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдЗрдерд░рдиреЗрдЯ рдХреЗрдмрд▓ рд╕рдВрдЧрдгрдХрд╛рд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рдЖрд╣реЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреЗ рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ).

рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ: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);

рдЖрдгрд┐ рд╣рд╛ 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>

рд╕рдореЛрд░рдЪреНрдпрд╛ рдХреЕрдореЗрд▒реНрдпрд╛рддреВрди рд╡реНрд╣рд┐рдбрд┐рдУ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ:8080 рд▓рд╛рдБрдЪ рдХрд░рд╛ рдЖрдгрд┐ рдХрдиреЗрдХреНрдЯ рдХрд░рд╛.

рдЖрдореНрд╣реА Node.js рдЖрдгрд┐ ARDrone рд╡рд╛рдкрд░реВрди рдХреЙрдкреНрдЯрд░рдЪреЗ рд╡реНрд╣реЙрдЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЛ

рдЙрдкрдпреБрдХреНрдд рдЯрд┐рдкрд╛

  • рд╣реЗ рдбреНрд░реЛрди рдШрд░рд╛рдордзреНрдпреЗ рдЙрдбрд╡рд╛.
  • рдЙрдбреНрдбрд╛рдг рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рддреБрдордЪреНрдпрд╛ рдбреНрд░реЛрдирд╡рд░ рдиреЗрд╣рдореА рд╕рдВрд░рдХреНрд╖рдХ рдХрд╡реНрд╣рд░ рдареЗрд╡рд╛.
  • рдмреЕрдЯрд░реА рдЪрд╛рд░реНрдЬ рдЭрд╛рд▓реА рдЖрд╣реЗ рдХрд╛ рддреЗ рддрдкрд╛рд╕рд╛.
  • рдЬрд░ рдбреНрд░реЛрди рд╡рд┐рдЪрд┐рддреНрд░рдкрдгреЗ рд╡рд╛рдЧрд▓рд╛ рддрд░ рддреЗ рджрд╛рдмреВрди рдареЗрд╡рд╛ рдЖрдгрд┐ рдЙрд▓рдЯ рдХрд░рд╛. рдпрд╛ рдХреГрддреАрдореБрд│реЗ рд╣реЗрд▓рд┐рдХреЙрдкреНрдЯрд░ рдЖрдкрддреНрдХрд╛рд▓реАрди рдореЛрдбрдордзреНрдпреЗ рдпреЗрдИрд▓ рдЖрдгрд┐ рд░реЛрдЯрд░реНрд╕ рддрд╛рдмрдбрддреЛрдм рдерд╛рдВрдмрддреАрд▓.

рддрдпрд╛рд░ рдХреЛрдб рдЖрдгрд┐ рдбреЗрдореЛ

рдереЗрдЯ рдбреЗрдореЛ

рдбрд╛рдКрдирд▓реЛрдб

рдЭрд╛рд▓реЗ!

рдХреЛрдб рд▓рд┐рд╣рд┐рдгреЗ рдЖрдгрд┐ рдирдВрддрд░ рдорд╢реАрдирдЪреЗ рдкрд╛рд▓рди рдХрд░рдгреНрдпрд╛рд╕ рд╕реБрд░рд╡рд╛рдд рдХрд░рдгреЗ рд╣реЗ рдкрд╛рд╣рдгреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрдирдВрдж рджреЗрдИрд▓! рдЖрддрд╛ рдЖрдореНрд╣реА рдбреНрд░реЛрдирд▓рд╛ рд╡реНрд╣реЙрдИрд╕ рдХрдорд╛рдВрдбреНрд╕ рдРрдХрдгреНрдпрд╛рд╕рд╛рдареА рдХрд╕реЗ рд╢рд┐рдХрд╡рд╛рдпрдЪреЗ рддреЗ рд╢реЛрдзреВрди рдХрд╛рдврд▓реЗ рдЖрд╣реЗ. рдЦрд░рдВ рддрд░, рдмрд░реЗрдЪ рдХрд╛рд╣реА рдЖрд╣реЗрдд: рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЪреЗрд╣рд░реНрдпрд╛рд╡рд░реАрд▓ рдУрд│рдЦ, рд╕реНрд╡рд╛рдпрддреНрдд рдлреНрд▓рд╛рдЗрдЯ, рдЬреЗрд╢реНрдЪрд░ рдУрд│рдЦ рдЖрдгрд┐ рдмрд░реЗрдЪ рдХрд╛рд╣реА.

рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рдХрд╛рдп рд╕реБрдЪрд╡реВ рд╢рдХрддрд╛?

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛