Roboten Counter-Strike (15 / 16 steg)
Steg 15: Klienten GUI
Som sagt tidigare, kommer vi att använda Shoes.rb, en GUI wrapper för Ruby kod. Skor projektet är ganska snyggt - definitivt kolla in deras hemsida. Jag kunde har valt för att använda Java, men beslutade att det skulle vara snyggare provar ett annat ramverk.
Klientkoden är kopplad. Som ni ser, är det en relativt normal .rb ruby fil.
Mycket av denna kod är självförklarande, så jag ska bara gå över de delar som kan vara förvirrande.
# MOTION CAPTURE BEGIN
= noll, noll
motion gör |_x, _y|
om och och (! = _x eller! = _y) och _x < 500 och _y < 500 och _x > 0 och _y > 0 och < 500 och < 500
Lägg till göra
linje _x, _y
slutet
"X är nu #{
"Y är nu #{
slutet
= _x, _y
slutet
Här, använder vi skons 'rörelse' block för att fånga musen rörelse. Vi sparar den nya x, y av musen som _x och _y. Att först om uttalande, vi kontrollera att x och y båda finns, och anger sedan att vi bara bryr sig om x / y-värden som ändras om den inledande/produkten ligger båda inom 0-500 pixlar (en 500 x 500 pixel kvadrat).
Om som uppfyller våra villkor, vi kommer att uppdatera med nya positioner.
Nästa, vi har våra block som är ansvarig för att faktiskt skicka meddelanden till vår server. Kommentarer förklara en hel del.:
def x_scaler(raw_x)
(raw_x.to_f / 250.to_f).round(1) * 2
slutet
def y_scaler(raw_y)
# minsta värdet bör vara 800 (hela vägen upp):-700
# största värdet bör vara 2200 (hela vägen ner): +800
# noll bör vara 1500 (center)
# så:
# 0 -> 800
# 250 -> 1500
# 500 -> 2200
Return (((raw_y * 2.8) + 800) / 10) .to_i * 10
slutet
# Startvärde
= 1500
# Animate(2) körs det två gånger en andra. Animate(8) (snabbaste) skulle köra denna kod 8 gånger per sekund.
Animate(2) gör
# För y-variabel
om och > 0 och < 500 och! = och > 0 och < 500
= y_scaler)
"Skicka Y: #{(rå: #{
0)
annat
slutet
# För x-variabel
om och och > 0 och < 500 och! =
= x_scaler (-() #x_scaler
"Skicka X: #{(rå: #{
0)
annat
"Ingenting förändrats."
= 0
slutet
# Rädda dessa värden till nästa gång
=
=
slutet
Vi definierar x_scaler och y_scaler som formatters för rå X och Y ingång, att ge det ett värde som är mer vänlig till uppsättningen upp vi har på Pi-servern.
Blocket animate(2) innebär att vi kommer att köra detta kommando två gånger varje sekund. Shoes.RB gör saker att köra så snabbt som 8 gånger en andra, men för våra ändamål, två gånger en andra räcker. Detta i huvudsak styr våra Samplingsfrekvens för och (hur ofta vi röstningen dessa variabler)
Inom det kvarteret, vi hanterar och annorlunda. I vårt fall betyder tornet, som kontrolleras av en PWM servo motor pulse. Detta innebär att vi behöver bara ge det ett värde för att det ska gå till, och så vi kan mata i direkt till y_scaler
Däremot betecknar sedan gir vinkel pi, som kontrolleras av våra motorer körs på en variabel tid längd, detta måste faktiskt vara ett tal som betyder värdeförändring sedan förra valet. En lite mer komplicerat, men inte rocket-science math.
I slutet av detta block, vi sparar och framtida jämförelse för nästa polling produktionscykel.
Resten av klienten GUI koden är relativt självförklarande, så jag kommer inte att klå upp punkten försöker gå över den här.