Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
どうしてもPerlでドローンを飛ばしたい人のためのハードウェアハック概論
Search
mackee
August 21, 2015
Programming
0
5.5k
どうしてもPerlでドローンを飛ばしたい人のためのハードウェアハック概論
マコピー a.k.a mackee_w
面白法人カヤック
YAPC::Asia 2015 2015-08-21 #yapcasiaC
mackee
August 21, 2015
Tweet
Share
More Decks by mackee
See All by mackee
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
15
5.2k
ワンバイナリWebサービスのススメ
mackee
10
8k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
120
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
920
perl for shell, awk and sed programmers
mackee
3
2.5k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
890
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
770
マイクロサービス化を利用した Goへの移行事例
mackee
0
910
PerlでつくるフルスクラッチWebAuthn/パスキー認証 / Demonstration of full-scratch WebAuthn/Passkey Authentication written in Perl
mackee
3
5.3k
Other Decks in Programming
See All in Programming
Catch Up: Go Style Guide Update
andpad
0
210
エンジニアとして高みを目指す、 利益を生み出す設計の考え方 / design-for-profit
minodriven
24
12k
バッチ処理を「状態の記録」から「事実の記録」へ
panda728
PRO
0
130
After go func(): Goroutines Through a Beginner’s Eye
97vaibhav
0
280
チームの境界をブチ抜いていけ
tokai235
0
130
dynamic!
moro
10
7k
CI_CD「健康診断」のススメ。現場でのボトルネック特定から、健康診断を通じた組織的な改善手法
teamlab
PRO
0
200
Cursorハンズオン実践!
eltociear
2
540
止められない医療アプリ、そっと Swift 6 へ
medley
1
140
Railsだからできる 例外業務に禍根を残さない 設定設計パターン
ei_ei_eiichi
0
400
CSC305 Lecture 04
javiergs
PRO
0
260
オープンソースソフトウェアへの解像度🔬
utam0k
8
1.7k
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Designing Experiences People Love
moore
142
24k
How to Think Like a Performance Engineer
csswizardry
27
2k
YesSQL, Process and Tooling at Scale
rocio
173
14k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Statistics for Hackers
jakevdp
799
220k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
970
Site-Speed That Sticks
csswizardry
11
890
Why Our Code Smells
bkeepers
PRO
339
57k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
How GitHub (no longer) Works
holman
315
140k
Transcript
Ͳ͏ͯ͠PerlͰ υϩʔϯΛ ඈ͍ͨ͠ ਓͷͨΊͷϋʔυΣ ΞϋοΫ֓ Ϛίϐʔ a.k.a mackee_w ໘ന๏ਓΧϠοΫ YAPC::Asia
2015 2015-08-21 #yapcasiaC
͜Μʹͪ
@mackee_w a.k.a Ϛίϐʔ ໘ന๏ਓΧϠοΫ ࣄ ιʔγϟϧήʔϜͷ αʔόαΠυΤϯδχΞ ӡ༻&։ൃ ओʹPerlͱGolang
PR
1िؒલʹϦϦʔε͠·ͨ͠ PR
ʹग़͔ͨ͠Βʹ ͪΐͬͱຊʹͭͳ͍͛ͯ͘ ΜͰ͚͢ΕͲ
Pocket Footballer(PSGI) yellowpages (Go)
ෳͷΞʔΩςΫνϟͰ ׂΛ୲ͯ͠ ҰͭͷతΛୡ͢Δ
ϋʔυΣΞʹಉ͡Α͏ͳ ͜ͱ ద༻Ͱ͖ͳ͍͔ͱ͍͏Λ͠ ·͢
Agenda (લઓ) • ങͬͨΫΞουίϓλʔΛ֎෦͔Βૢ࡞͢Δ • ిؾతհೖ • ͦΕͰμϝͳΒྫ͑ཧͰ͑͜Ή • ΈΜͳେ͖ిͷ
• ͬऔΔͷ͕μϝͳΒج൘͝ͱೖΕସ͑Δ
• ങͬͨΫΞουίϓλʔΛ֎෦͔Βૢ࡞͢Δ • ిؾతհೖ • ͦΕͰμϝͳΒྫ͑ཧͰ͑͜Ή • ΈΜͳେ͖ిͷ • ͬऔΔͷ͕μϝͳΒج൘͝ͱೖΕସ͑Δ
Agenda (લઓ)
͕࣌ؒ༨ͬͨΒΞΠσΟΞϨ ϕϧͰ͕͢ ×ͷ෦Λͦ͏͔ͱ
Agenda (ޙઓ) • ͕ΜͬͯΫΞουίϓλʔΛ࡞Δ • ΫΞουίϓλʔͷߏཁૉ • AmazonͰύʔπΛങ͍ͬͯ͘ • PerlͰૢ࡞ͯ͠ΈΔ
ͬͪ͜ͳΜͱ͔ͳͬͨ ͷͰָ͓͠Έʹ
ങ͖ͬͯͨυϩʔϯΛ ૢ࡞͢Δ
τΠϔϦ(ʙ̎ສԁ)
Parrotͷυϩʔϯ(3ສԁʙ)
DJI Phantom(10ສԁʙ)
Ready To Fly • ϓϩϙ(ૹ৴ػ)ͱຊମ͕ηοτͰೖ͍ͬͯΔౕ • ϖΞϦϯάࡁΈ ௐࡁΈ • తͱۭͯ͠ࡱ
or ඈߦ
ిؾతհೖ
DJI Phantom • ͜Μͳײ͡ͷίϯτϩʔϥ͕ೖ͍ͬͯΔ
DJI Phantom • ͜Μͳײ͡ͷίϯτϩʔϥ͕ೖ͍ͬͯΔ →Ϟʔλʔ ϓϩϙˠ
NAZAͱ͍͏ίϯτϩʔϥ • தͲ͏ͳ͍ͬͯΔͷ͔ෆ໌ • WindowsͰPIDΛ͍͡Διϑτ͕͋Δ͚Ε Ͳɺϓϩτίϧͱ͔Θ͔Βͳ͍ • ϋοΫ͢Δޱͳ͍ͷͰɾɾɾɾʁ
ϒϥοΫϘοΫεతʹ ϋοΫ͍ͯ͘͠
ϓϩϙͷग़͢৴߸ • ݹ͖ྑ͖αʔϘ1ຊʹ͖ͭ1ຊͷέʔϒϧΛ ͏৴߸ = PWM (Pulse Width Modulation) •
ύϧε෯੍ޚ • 0ͱ1ͷ࣌ؒͷ͞ͰΛܾΊΔ
ܗΛݟͯΈΔ
ܗΛݟͯΈΔ ͜͜ͷ෯͕
ϋʔυΣΞߏ
ϋʔυΣΞߏ Firmata (UART) PWM
ೖΔ͔ͳʔೖΔ͔ͳʔ
RaspberryPi͕ͬ͢ΆΓऩ·Δ
Firmata • ArduinoΈ͍ͨͳϚΠίϯͱPCؒͷ௨৴ϓϩτί ϧ UART(Serial)Λ༻͍Δͷ͕جຊ • MIDIϕʔε • ArduinoIDEͷඪ४ϥΠϒϥϦͰ͏͜ͱ͕ग़དྷΔ •
PerlͩͱDevice::Firmata͕CPANʹ͋Δ
ArduinoͰͷPWMग़ྗ • analogWriteͱ͍͏ͷ͕͋Δ͕͜Εແࢹ(0-255 ·Ͱͷ͔͠औΕͳ͍ɻͦͷ͏ͪ͑Δͷ͘͝ Θ͔ͣͰਫ਼͕ѱ͍) • ArduinoʹαʔϘϞʔλͷϥΠϒϥϦ͕͋Δͷ ͰͦΕΛ͏ɻus୯ҐͰॻ͖ࠐΊΔ • ϓϩϙ৴߸௨ৗ1000us
- 2000usͷؒΛऔΔ
RaspberryPiଆͷϓϩάϥϜ • OpenCVΛΈ߹ΘͤΔ্ؔɺ࣮ͷ͋Δ PythonΛ༻ • pyfirmataͰarduinoͱ௨৴͢ΔϓϩηεͱOpenCV ֎෦API͔Βͷૢ࡞Λड͚͚ΔϓϩηεΛ • ͜ͷؒΛੜιέοτ௨৴ͷςΩετϓϩτίϧͰ ΓͱΓ͢ΔΑ͏ʹͨ͠
ϘʔυΛ҆શʹ࡞Δ • Phantomͷͱ͖հೖ͢ΔϘʔυ͕ڰ͏ͱͲ͔ͬඈΜ Ͱ͍ͬͯ͠·͏ͷͰɺΓସ͑Λඪ४ICΛͬͨσΟ εΫϦʔτͷճ࿏Ͱߦ͍ͬͯͨ • 2chϚϧνϓϨΫαICΛԿݸ͔Έ߹Θͤͯ͏PWM ΛεΠον • հೖϘʔυ͕ނোͯ͠ϓϧΞοϓ߅Ͱ͋Δఔͷ
έʔεखಈଆʹΓସΘΔΑ͏ʹ͍ͯͨ͠
ICͷதͷճ࿏͕༨ͬͨͷͰ • ͬͨIC4053Ͱɺ2chϚϧνϓϨΫα͕3ݸ ೖ͍ͬͯͯɺϓϩϙ৴߸4ͭΛΓସ͑Δʹ 2ͭඞཁ • ͔ͦ͠͠ͷ߹2ݸͷճ࿏͕༨Δ
ICͷதͷճ࿏͕༨ͬͨͷͰ • ͪͳΈʹհೖճ࿏पลػثͷIO͕Γͳͯ͘2 ͭͷArduinoΛࠞࡌ͍ͯͨ͠ • Arduinoͷॻ͖ࠐΈʹUARTΛ͏ • ιϑτΣΞͰॻ͖ࠐΈઌͷArduinoΛεΠον ͯ͠ܨ͗ม͑ͣʹεέονΛॻ͖ࠐΉΑ͏ʹͨ͠
લઓऴྃ
Agenda (ޙઓ) • ͕ΜͬͯΫΞουίϓλʔΛ࡞Δ • ΫΞουίϓλʔͷߏཁૉ • AmazonͰύʔπΛങ͍ͬͯ͘ • PerlͰૢ࡞ͯ͠ΈΔ
͕Μͬͯ ΫΞουίϓλʔΛ࡞Δ
ͷલʹɺΫΞουίϓλʔ ԿނඈͿͷ͔ʁ
࣮ͦΕͧΕճసํ͕ҧ͏
࣮ࡍʹճͯ͠Έͯ ԻͰฉ͍ͯΈΔ
ΫΞουίϓλʔͷߏཁૉ ϑϨʔϜ
ΫΞουίϓλʔͷߏཁૉ ϒϥγϨεϞʔλʔ
ΫΞουίϓλʔͷߏཁૉ ESC(Ξϯϓ)
ΫΞουίϓλʔͷߏཁૉ ίϯτϩʔϥʔ
MultiWii • Arduino + WiiϦϞίϯͷ9࣠ηϯαΛ ͬͨΦʔϓϯιʔεϓϩδΣΫτ • ΦʔϓϯιʔεͳͷͰNAZAͱҧͬͯ தΛݟΔ͜ͱ͕ग़དྷΔ
MultiWii
ΫΞουίϓλʔͷߏཁૉ όοςϦʔ
ΫΞουίϓλʔͷߏཁૉ ϓϩϙͱड৴ػ
͜ΕΒΛਖ਼ͭ͘͠ͳ͙ͱඈͿʂ
ϑϨʔϜ
ઢ
ग़དྷͨͷ͕ίνϥͰ͢
ඈͯ͠ΈΔ
্ख͘ඈͳ͍࣌ • ΊͪΌͪ͘Όૢॎ͕͍͠ • খܕͷػମͳͷͰϑΟʔυόοΫ੍ޚΛڧΊ ʹೖΕͯΔඞཁ͕͋Δ • MultiWiiGUI/CUI͔ΒPIDΛ͍͡Δ͜ͱ͕ ग़དྷΔ ->
DΛߴΊʹͯ҆͠ఆ
MultiWiiͷνϡʔχϯά MultiWiiConf
MultiWiiͷνϡʔχϯά https://github.com/c---/MultiWiiCL
ͦͯ͜͠͏ͳΔ
Perl͔Βඈͯ͠ΈΔ
MultiWii Serial Protocol • MultiWiiͱ͍͏ϓϩδΣΫτͷίϯτϩʔϥΛ ͓ͬͯΓɺதΦʔϓϯιʔε • UARTͰίϚϯυܦ༝Ͱͷૢ࡞Մೳ(PIDΛ GUI͔Β͍͡ΔϓϩάϥϜ͜ΕΛ͍ͬͯΔ) •
͔ͤͬ͘ͳͷͰϞδϡʔϧΛ࡞ͬͨ
Device::MultiWii Protocol::MultiWii
͜Μͳײ͡ use Device::MultiWii; my $port = "/dev/tty.usbserial"; my $mw =
Device::MultiWii->new(port => $port); is exception { $mw->open }, undef; my $ident = $mw->fetch_ident; cmp_deeply $ident, { version => 230, multitype => 3, capability => ignore(), };
͜Μͳײ͡ my $rc = $mw->fetch_rc; cmp_deeply $rc, { yaw =>
1500, pitch => 1500, roll => 1500, throttole => 1500, auxs => ignore(), }; $rc->{yaw} = 1400; ok $mw->set_raw_rc(%$rc); $refetched_rc = $mw->fetch_rc; cmp_deeply $refetched_rc, { yaw => 1400, pitch => 1500, roll => 1500, throttole => 1500, auxs => ignore(), };
ৗʹૹΓଓ͚ͳ͍ͱ ϓϩϙ৴߸Ͱ্ॻ͖͞ΕΔ
MSPʹΑΔRC্ॻ͖ͷΈ MSP(UART) PWM
MSPʹΑΔRC্ॻ͖ͷΈ 1. MSPͰRC্ॻ͖
MSPʹΑΔRC্ॻ͖ͷΈ 1. MSPͰRC্ॻ͖ 2. Χϯλ͕50ʹηοτ͞Εͯ ͦͷ্ؒॻ͖
MSPʹΑΔRC্ॻ͖ͷΈ 1. MSPͰRC্ॻ͖ 2. Χϯλ͕50ʹηοτ͞Εͯ ͦͷ্ؒॻ͖ ←͜ͷΧϯλ͕ ҰॠͰ0ʹͳΔʂʂʂ
MSPʹΑΔRC্ॻ͖ͷΈ 1. MSPͰRC্ॻ͖ 2. Χϯλ͕50ʹηοτ͞Εͯ ͦͷ্ؒॻ͖ ←͜ͷΧϯλ͕ ҰॠͰ0ʹͳΔʂʂʂ 3. ͬͪ͜ͷ৴߸Ͱ
্ॻ͖͞ΕΔ
֘෦ͷίʔυ if (chan<8 && rcSerialCount > 0) { rcSerialCount --;
#if defined(FAILSAFE) failsafeCnt = 0; #endif if (rcSerial[chan] >900) { rcData[chan] = rcSerial[chan]; } }
͜͏ม͑ͨίʔυ if ( chan<8 && (rcData4Values[AUX1][rc4ValuesIndex] > 1800 || rcSerialCount
> 0)) { rcSerialCount --; #if defined(FAILSAFE) failsafeCnt = 0; #endif if (rcSerial[chan] >900 && (chan == ROLL || chan == PITCH || chan == THROTTLE || chan == YAW)) { rcData[chan] = rcSerial[chan]; } }
AUXΛεΠονϯάʹ͏ • εςΟοΫҎ֎ʹ͍Ζ ͍ΖεΠονͱ͔͍ͭ ͍ͯΔ͚ΕͲɺ͜Εͷ ૹ৴Ͱ͖Δ -> AUX • ࠓճӈ্ͷεΠον
ΛAUX1ʹׂΓͯͨ
ͯ͞Perl͔Β͑ΔΑ͏ʹ ͳͬͨͷͰ
Q: Perl͕ಈ͘ೖख༰қͷதͰ ͬͱϑοτϓϦϯτখ͞ ͍ίϯϐϡʔλʁ
Raspberry Pi
Raspberry Pi 85.60 mm × 56.5 mm
Raspberry Pi 85.60 mm × 56.5 mm
Intel Edison
Intel Edison 35.5mm × 25.0mm
Intel Edison + Breakout Board 61mm x 29mm
Intel Edison + Breakout Board 61mm x 29mm
Intel Edison • 500MHz Atom σϡΞϧίΞ (x86ͩʂʂʂʂ) • ϔϦͱͯ͠7V -
15Vͷిݯ͕৯͑ΔͷͰ3 ηϧLiPo12V͕ͦͷ··৯͑Δͷ͕͏Ε͍͠ • RasPiʹ͍͍ͭͯͳ͍WiFi ͱ BT ͕͋Δ
Intel Edison meets MultiWii • EdisonUARTΛ2ܥ౷͍࣋ͬͯΔ͕Ϩϕϧม͕ ඞཁ(1.8V IO)ͳͷͰOTGέʔϒϧͰUSB-UARTม Λհͯ͠ଓɻϋϯμ͚ෆཁͩʂ •
Breakout boardఈ໘ʹ2.54mmϐονͷϗʔϧ͕ ۭ͍͍ͯΔ͕͜ͷஔͩͱϒϨουϘʔυʹͤ͞ ͳ͍ͷͰळ݄ిࢠͷมϘʔυ͕࣮ݧ༻ʹ͓͢ ͢ΊͰ͢
ىಈͯ͠ΈΔ (ةͳ͍ͷͰӋͳ͠Ͱ͢)
EdisonʹೖΕͨͷ • plenv (System PerlͷίΞϞδϡʔϧ͕ශ૬Ͱ opkgͰಥͬࠐΈ·͘Βͳ͍ͱ͍͚ͳ͍) • mackerel-agent(ωλɻόοςϦʔిѹͱ͔ ߴͱ͔ܭଌͰ͖ͨΒ͍͍͔͛ͯ)
Slack௨ೖΕ͍ͯΔͷͰ ى͖Δ·ͰͬͯΈ·͢
جຊCRITICALͰىಈͨ࣌͠ʹ OKʹͳΔײ͡Ͱ૽
Perl͔Βૢ࡞͢Δ͚ͩͰ Γͳ͍ͷͰ ͪ͜ΒΛPerlͰಡΈ·͢
LeapMotion
LeapMotion • Ұ࣌ظΛฉ͔ͳ͘ͳΓ·͕ͨ͠ɺࠓͰ OculusͳͲͷVRϔουηοτʹ͚ͯࣗͷ खΛVRʹු͔ͤΔ༻్Ͱ෮ݖ͖͍ͯͯ͠Δ • ࠷ۙਫ਼্͕͕ͬͨΒ͍͠(͍ͭ࠷ۙങͬͨͷ ͰΑ͘Θ͔Βͳ͍Ͱ͕͢……)
LeapMotion x QuadCopter • WebSocketͰܨ͛ΒΕΔͷͰPerl͔ΒͰ ใΛऔΔ͜ͱ͕ग़དྷΔ • ͜͜ͰAnyEvent::LeapMotionΛ͏ • ϓϩϙ͡Όͳͯ͘खͷͻΒ͚ͩͰු͔ͤͯΈ
Δ
σϞ
݁ߏݫ͍͠ɾɾɾ
None
1. खͷ͖ΛऔΔ
1. खͷ͖ΛऔΔ 2. Edisonʹཱ͍ͬͯΔPSGIʹ ϦΫΤετΛ͛Δ
1. खͷ͖ΛऔΔ 2. Edisonʹཱ͍ͬͯΔPSGIʹ ϦΫΤετΛ͛Δ 3. PSGIͷதͰDevice::MultiWiiʹ ॻ͖ࠐΈ
1. खͷ͖ΛऔΔ 2. Edisonʹཱ͍ͬͯΔPSGIʹ ϦΫΤετΛ͛Δ 3. PSGIͷதͰDevice::MultiWiiʹ ॻ͖ࠐΈ 4. ΪϡΠϯΪϡΠʔϯʂ
·ͱΊ • ϋʔυΣΞϋοΫʹ༷ʑͳํ๏͕͋Δ͕ɺ Γத͕͔͍ͬͯΔͷΛͬऔΔͷ ͕Ұ൪༰қ͍ • υϩʔϯ࡞ΕΔɹΈΜͳ࡞Ζ͏ • Perl͔Βૢ࡞Ͱ͖Ε͍ΖΜͳ͍͍͜ͱѱ͍ ͜ͱ͕ग़དྷָ͍ͯ͠Ͷʂ
ϙέοτϑοτϘʔϥʔͰݕࡧ PR
ڈͷҾ͖ଓ͖શһਓࣄ෦
͋Γ͕ͱ͏͍͟͝·ͨ͠
ී௨ͷϔϦͷΈ
ΫΞουίϓλʔͷ߹ • ্ঢԼ߱ • શମͷճసͷ্͛Լ͛ • ԣͷҠಈ(ϩʔϧ) • ࠨӈͷճసͰ͔ͤΔ •
લޙͷҠಈ(ϐον) • લޙͷճసͰ͔ͤΔ
ΊͪΌͪ͘Ό؆୯ͩʂ
ϔϦͷ߹ • ্ঢɺԼ߱ • ڧ͍ऑ͍ ← Θ͔Δ • લޙࠨӈ •
ʁʁʁʁʁʁʁʁ
ϔϦͷϩʔλʔͷ͚ࠜΛ Α͘ݟͯΈΑ͏ʂ
ϔϦͷϩʔλʔͷ͚ࠜΛ Α͘ݟͯΈΑ͏ʂ
εϫογϡϓϨʔτ • ϩʔλʔͷ֯ճస͢Δ͏ͪʹՄม͢Δ • લʹਐΈ͍ͨ࣌ޙΖͷͱ͖ʹཱͯͯલʹདྷ ͨ࣌৸͔ͤΔ -> ػମ͕͘ • εϫογϡϓϨʔτͳΔ෦Ͱʮ͜ͷ֯ͷ
དྷͨ࣌৸͔ͤΔɺཱͨͤΔʯΈ͍ͨͳͷΛ ܾΊ͍ͯΔ
↑͔͜͜Β্͕ճΔ
͔ͤΔͱΞʔϜͱ ϦϯΫػߏͰ Ӌ͕৸Δ/ཱͭ
ΊͬͪΌෳࡶʂ Ͱඒ͍͠ʂʂʂ