рд╣рдо Node.js рдФрд░ ARdrone рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдкреНрдЯрд░ рдХрд╛ рдзреНрд╡рдирд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рд╣рдо Node.js рдФрд░ ARdrone рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдкреНрдЯрд░ рдХрд╛ рдзреНрд╡рдирд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдо Node.js рдФрд░ рд╡реЗрдм рд╕реНрдкреАрдЪ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╛рдЬ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рд▓реЗ рдбреНрд░реЛрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдиреЗ рдкрд░ рдЧреМрд░ рдХрд░реЗрдВрдЧреЗред рдХреЙрдкреНрдЯрд░ - рддреЛрддрд╛ рдПрдЖрд░рдбреНрд░реЛрди 2.0ред

рдЕрдиреБрд╕реНрдорд╛рд░рдХ: "рд╣реИрдмрд░" рдХреЗ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП - "рд╣реИрдмрд░" рдкреНрд░рдЪрд╛рд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдирд╛рдорд╛рдВрдХрди рдХрд░рддреЗ рд╕рдордп 10 рд░реВрдмрд▓ рдХреА рдЫреВрдЯред

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо "рдореЛрдмрд╛рдЗрд▓ рдбреЗрд╡рд▓рдкрд░ рдкреНрд░реЛ".

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

рдбреНрд░реЛрди рдЕрджреНрднреБрдд рд╣реИрдВ. рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рдХреНрд╡рд╛рдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛, рдлрд╝реЛрдЯреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд▓реЗрдирд╛ рдпрд╛ рдмрд╕ рдореМрдЬ-рдорд╕реНрддреА рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдорд╛рдирд╡рд░рд╣рд┐рдд рд╣рд╡рд╛рдИ рд╡рд╛рд╣рдиреЛрдВ (рдпреВрдПрд╡реА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдордиреЛрд░рдВрдЬрди рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рд╕рд┐рдиреЗрдорд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЧреНрд▓реЗрд╢рд┐рдпрд░реЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕реЗрдирд╛ рдФрд░ рдХреГрд╖рд┐ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдо рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдиреЗ рдкрд░ рдЧреМрд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреЛ рдбреНрд░реЛрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╡реЙрдЗрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд╣рд╛рдБ, рд╣реИрд▓реАрдХрд╛рдкреНрдЯрд░ рд╡рд╣реА рдХрд░реЗрдЧрд╛ рдЬреЛ рдЖрдк рдЙрд╕реЗ рдХрд░рдиреЗ рдХреЛ рдХрд╣реЗрдВрдЧреЗред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдпреВрдПрд╡реА рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдПрдХ рддреИрдпрд╛рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╣реИред

рд▓реЛрд╣рд╛

рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рддреЛрддрд╛ рдПрдЖрд░рдбреНрд░реЛрди 2.0;
  • рдИрдерд░рдиреЗрдЯ рдХреЗрдмрд▓;
  • рдЕрдЪреНрдЫрд╛ рдорд╛рдЗрдХреНрд░реЛрдлреЛрдиред

рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкреНрд░рдмрдВрдзрди рд╡рд┐рдВрдбреЛрдЬрд╝/рдореИрдХ/рдЙрдмрдВрдЯреВ рдХреЗ рд╕рд╛рде рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ Mac рдФрд░ Ubuntu 18.04 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ред

рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░

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

рдЬрд░реВрд░рдд рднреА рд╣реИ Google Chrome рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг.

рдХреЙрдкреНрдЯрд░ рдХреЛ рд╕рдордЭрдирд╛

рдЖрдЗрдП рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдкреИрд░рдЯ рдПрдЖрд░рдбреНрд░реЛрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреЙрдкреНрдЯрд░ рдореЗрдВ рдЪрд╛рд░ рдореЛрдЯрд░реЗрдВ рд╣реИрдВ.

рд╣рдо Node.js рдФрд░ ARdrone рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдкреНрдЯрд░ рдХрд╛ рдзреНрд╡рдирд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рд╡рд┐рдкрд░реАрдд рдореЛрдЯрд░реЗрдВ рдПрдХ рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИрдВред рдПрдХ рдЬреЛрдбрд╝рд╛ рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд рдШреВрдорддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рд╡рд╛рдорд╛рд╡рд░реНрддред рдбреНрд░реЛрди рдкреГрдереНрд╡реА рдХреА рд╕рддрд╣ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЭреБрдХрд╛рд╡ рдХреЗ рдХреЛрдг рдХреЛ рдмрджрд▓рдХрд░, рдореЛрдЯрд░реЛрдВ рдХреЗ рдШреВрдордиреЗ рдХреА рдЧрддрд┐ рдФрд░ рдХрдИ рдЕрдиреНрдп рдЧрддрд┐рд╢реАрд▓ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдХрд░ рдЪрд▓рддрд╛ рд╣реИред

рд╣рдо Node.js рдФрд░ ARdrone рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдкреНрдЯрд░ рдХрд╛ рдзреНрд╡рдирд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдХреЙрдкреНрдЯрд░ рдХреА рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рд░реЛрдЯрд╛рд░ рдХреА рдШреВрд░реНрдгрди рдЧрддрд┐ рдХреЛ рдХрдо рдпрд╛ рдмрдврд╝рд╛рдиреЗ рд╕реЗ рдПрдХ рд░реЛрд▓ рдмрдирддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдбреНрд░реЛрди рдЖрдЧреЗ рдпрд╛ рдкреАрдЫреЗ рдЙрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рдореЛрдЯрд░реЛрдВ рдХреА рдЧрддрд┐ рдФрд░ рджрд┐рд╢рд╛ рдХреЛ рдмрджрд▓рдХрд░, рд╣рдо рдЭреБрдХрд╛рд╡ рдХреЛрдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХреЙрдкреНрдЯрд░ рдХреЛ рдЕрдиреНрдп рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рдпреБрдЧрддрд┐рдХреА рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рддреЛрддрд╛ рдПрдЖрд░рдбреНрд░реЛрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдбреНрд░реЛрди рдПрдХ рд╡рд╛рдИ-рдлрд╛рдИ рд╣реЙрдЯрд╕реНрдкреЙрдЯ рд╣реИред рдХреЙрдкреНрдЯрд░ рдХреЛ рдХрдорд╛рдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕реЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдХреНрд╡рд╛рдбрдХреЙрдкреНрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рд╣рдо Node.js рдФрд░ ARdrone рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдкреНрдЯрд░ рдХрд╛ рдзреНрд╡рдирд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рдЬреИрд╕реЗ рд╣реА рдбреНрд░реЛрди рдХрдиреЗрдХреНрдЯ рд╣реЛ рдЬрд╛рдП, рдЯрд░реНрдорд┐рдирд▓ рдФрд░ рдЯреЗрд▓рдиреЗрдЯ 192.168.1.1 рдЦреЛрд▓реЗрдВ - рдпрд╣ рдХреЙрдкреНрдЯрд░ рдХрд╛ рдЖрдИрдкреА рд╣реИред рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓рд┐рдирдХреНрд╕ рдмрд┐рдЬреАрдмреЙрдХреНрд╕.

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛

рд╣рдорд╛рд░рд╛ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдЧрд╛:

  • рдЖрд╡рд╛рдЬ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреАрдЪ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕;
  • рдЖрджреЗрд╢реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдФрд░ рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдирд╛;
  • рдбреНрд░реЛрди рдХреЛ рдЖрджреЗрд╢ рднреЗрдЬрдирд╛;
  • рд▓рд╛рдЗрд╡ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╕рд╛рд░рдг.

рдПрдкреАрдЖрдИ рддрдм рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдИрдерд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!

рдХреЛрдб

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдПрдХ рдирдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ рдФрд░ рдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред

рдлрд┐рд░ рд╣рдо рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдиреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдПрдирдПрдордкреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВтАК

рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрджреЗрд╢реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗ:

  • рдЙрдбрд╝рд╛рди рднрд░рдирд╛;
  • рдЙрддрд░рдирд╛;
  • рдКрдкрд░ - рдбреНрд░реЛрди рдЖрдзрд╛ рдореАрдЯрд░ рдКрдкрд░ рдЙрдарддрд╛ рд╣реИ рдФрд░ рдордВрдбрд░рд╛рддрд╛ рд╣реИ;
  • рдиреАрдЪреЗ - рдЖрдзрд╛ рдореАрдЯрд░ рдЧрд┐рд░рддрд╛ рд╣реИ рдФрд░ рдЬрдо рдЬрд╛рддрд╛ рд╣реИ;
  • рдмрд╛рдИрдВ рдУрд░ - рдмрд╛рдИрдВ рдУрд░ рдЖрдзрд╛ рдореАрдЯрд░ рдЬрд╛рддрд╛ рд╣реИ;
  • рджрд╛рдИрдВ рдУрд░ - рджрд╛рдИрдВ рдУрд░ рдЖрдзрд╛ рдореАрдЯрд░ рдЬрд╛рддрд╛ рд╣реИ;
  • рдШреВрд░реНрдгрди - рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд 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>

рдФрд░ рд╡реЙрдпрд╕ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рднреА, рдЙрдиреНрд╣реЗрдВ рдиреЛрдб рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрдирд╛ред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ