|
1 | 1 | package main
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "github.com/felixge/godrone" |
| 4 | + "github.com/felixge/godrone/attitude" |
| 5 | + "github.com/felixge/godrone/control" |
| 6 | + "github.com/felixge/godrone/drivers/motorboard" |
| 7 | + "github.com/felixge/godrone/drivers/navboard" |
5 | 8 | "github.com/felixge/godrone/http"
|
| 9 | + "github.com/felixge/log" |
6 | 10 | gohttp "net/http"
|
7 | 11 | "os"
|
8 | 12 | "os/signal"
|
9 | 13 | "syscall"
|
| 14 | + "time" |
10 | 15 | )
|
11 | 16 |
|
| 17 | +type Config struct { |
| 18 | + NavboardTTY string |
| 19 | + MotorboardTTY string |
| 20 | + RollPID [3]float64 |
| 21 | + PitchPID [3]float64 |
| 22 | + YawPID [3]float64 |
| 23 | + HttpAddr string |
| 24 | +} |
| 25 | + |
| 26 | +var ( |
| 27 | + defaultRollPitchPID = [3]float64{0.02, 0, 0} |
| 28 | + |
| 29 | + green = motorboard.Leds(motorboard.LedGreen) |
| 30 | + orange = motorboard.Leds(motorboard.LedOrange) |
| 31 | + red = motorboard.Leds(motorboard.LedRed) |
| 32 | +) |
| 33 | + |
| 34 | +var DefaultConfig = Config{ |
| 35 | + NavboardTTY: "/dev/ttyO1", |
| 36 | + MotorboardTTY: "/dev/ttyO0", |
| 37 | + RollPID: defaultRollPitchPID, |
| 38 | + PitchPID: defaultRollPitchPID, |
| 39 | + YawPID: [3]float64{1, 0, 0}, |
| 40 | + HttpAddr: ":80", |
| 41 | +} |
| 42 | + |
| 43 | +type Instances struct { |
| 44 | + log *log.Logger |
| 45 | + navboard *navboard.Navboard |
| 46 | + motorboard *motorboard.Motorboard |
| 47 | + attitude *attitude.Complementary |
| 48 | + control *control.Control |
| 49 | + http gohttp.Handler |
| 50 | +} |
| 51 | + |
12 | 52 | func main() {
|
13 |
| - log := godrone.DefaultConfig.Log |
14 |
| - firmware := godrone.DefaultFirmware |
15 |
| - if err := firmware.Start(); err != nil { |
| 53 | + config := DefaultConfig |
| 54 | + i, err := NewInstances(config) |
| 55 | + if err != nil { |
16 | 56 | panic(err)
|
17 | 57 | }
|
18 |
| - defer firmware.Stop() |
| 58 | + i.log.Info("Starting godrone") |
| 59 | + defer i.motorboard.Close() |
19 | 60 |
|
20 |
| - h := http.NewHandler(firmware, log) |
21 |
| - go gohttp.ListenAndServe(":80", h) |
| 61 | + i.motorboard.SetLeds(green) |
| 62 | + time.Sleep(500 * time.Millisecond) |
| 63 | + i.motorboard.SetLeds(red) |
| 64 | + |
| 65 | + i.log.Info("Calibrating sensors") |
| 66 | + for { |
| 67 | + if err := i.navboard.Calibrate(); err == nil { |
| 68 | + break |
| 69 | + } |
| 70 | + } |
| 71 | + i.motorboard.SetLeds(green) |
| 72 | + |
| 73 | + navDataCh := make(chan navboard.Data) |
| 74 | + go readNavData(i.navboard, navDataCh) |
22 | 75 |
|
23 | 76 | sigCh := make(chan os.Signal, 1)
|
24 | 77 | signal.Notify(sigCh, syscall.SIGINT)
|
25 |
| - sig := <-sigCh |
26 |
| - log.Info("Received signal=%s, shutting down", sig) |
| 78 | + |
| 79 | + go gohttp.ListenAndServe(config.HttpAddr, i.http) |
| 80 | + |
| 81 | + i.log.Info("Entering main loop") |
| 82 | +mainLoop: |
| 83 | + for { |
| 84 | + select { |
| 85 | + case navData := <-navDataCh: |
| 86 | + attitudeData := i.attitude.Update(navData.Data) |
| 87 | + motorSpeeds := i.control.Update(attitudeData) |
| 88 | + if err := i.motorboard.SetSpeeds(motorSpeeds); err != nil { |
| 89 | + i.log.Error("Could not set motor speeds. err=%s", err) |
| 90 | + } |
| 91 | + case sig := <-sigCh: |
| 92 | + i.log.Info("Received signal=%s, shutting down", sig) |
| 93 | + break mainLoop |
| 94 | + } |
| 95 | + } |
| 96 | +} |
| 97 | + |
| 98 | +func readNavData(board *navboard.Navboard, ch chan<- navboard.Data) { |
| 99 | + for { |
| 100 | + navData, err := board.NextData() |
| 101 | + if err != nil { |
| 102 | + continue |
| 103 | + } |
| 104 | + select { |
| 105 | + case ch <- navData: |
| 106 | + default: |
| 107 | + } |
| 108 | + } |
| 109 | +} |
| 110 | + |
| 111 | +func NewInstances(c Config) (i Instances, err error) { |
| 112 | + i.log = log.DefaultLogger |
| 113 | + i.navboard = navboard.NewNavboard(c.NavboardTTY, i.log) |
| 114 | + i.motorboard, err = motorboard.NewMotorboard(c.MotorboardTTY) |
| 115 | + if err != nil { |
| 116 | + return |
| 117 | + } |
| 118 | + i.attitude = attitude.NewComplementary() |
| 119 | + i.control = control.NewControl(c.RollPID, c.PitchPID, c.YawPID) |
| 120 | + i.http = http.NewHandler(i.control, i.log) |
| 121 | + return |
27 | 122 | }
|
0 commit comments