kopia lustrzana https://github.com/cyoung/stratux
Testing heading functions for MPU6050.
rodzic
5e62d75a2f
commit
8d88e4f91c
|
@ -24,6 +24,9 @@ const (
|
||||||
|
|
||||||
PWR_MGMT_1 = 0x6B
|
PWR_MGMT_1 = 0x6B
|
||||||
|
|
||||||
|
GYRO_CONFIG = 0x1B
|
||||||
|
ACCEL_CONFIG = 0x1C
|
||||||
|
|
||||||
ACCEL_SCALE = 16384.0 // Assume AFS_SEL = 0.
|
ACCEL_SCALE = 16384.0 // Assume AFS_SEL = 0.
|
||||||
GYRO_SCALE = 131.0 // Assume FS_SEL = 0.
|
GYRO_SCALE = 131.0 // Assume FS_SEL = 0.
|
||||||
|
|
||||||
|
@ -55,6 +58,7 @@ type MPU6050 struct {
|
||||||
|
|
||||||
pitch float64
|
pitch float64
|
||||||
roll float64
|
roll float64
|
||||||
|
heading float64
|
||||||
// gyro chan XYZ
|
// gyro chan XYZ
|
||||||
// accel chan XYZ
|
// accel chan XYZ
|
||||||
|
|
||||||
|
@ -72,6 +76,9 @@ func New(bus embd.I2CBus) *MPU6050 {
|
||||||
func (d *MPU6050) StartUp() error {
|
func (d *MPU6050) StartUp() error {
|
||||||
d.Bus.WriteByteToReg(address, PWR_MGMT_1, 0) // Wake device up.
|
d.Bus.WriteByteToReg(address, PWR_MGMT_1, 0) // Wake device up.
|
||||||
|
|
||||||
|
d.Bus.WriteByteToReg(address, GYRO_CONFIG, 0) // FS_SEL = 0
|
||||||
|
d.Bus.WriteByteToReg(address, ACCEL_CONFIG, 0) // AFS_SEL = 0
|
||||||
|
|
||||||
d.pitch_history = make([]float64, 0)
|
d.pitch_history = make([]float64, 0)
|
||||||
d.roll_history = make([]float64, 0)
|
d.roll_history = make([]float64, 0)
|
||||||
|
|
||||||
|
@ -153,10 +160,10 @@ func (d *MPU6050) calculatePitchAndRoll() {
|
||||||
// Accel.
|
// Accel.
|
||||||
|
|
||||||
p1 := math.Atan2(float64(accel.y), dist(accel.x, accel.z))
|
p1 := math.Atan2(float64(accel.y), dist(accel.x, accel.z))
|
||||||
p1_deg := p1 * (180 / math.Pi)
|
p1_deg := p1 * (180.0 / math.Pi)
|
||||||
|
|
||||||
r1 := math.Atan2(float64(accel.x), dist(accel.y, accel.z))
|
r1 := math.Atan2(float64(accel.x), dist(accel.y, accel.z))
|
||||||
r1_deg := -r1 * (180 / math.Pi)
|
r1_deg := -r1 * (180.0 / math.Pi)
|
||||||
|
|
||||||
// Gyro.
|
// Gyro.
|
||||||
|
|
||||||
|
@ -172,24 +179,46 @@ func (d *MPU6050) calculatePitchAndRoll() {
|
||||||
d.pitch_history = append(d.pitch_history, d.pitch)
|
d.pitch_history = append(d.pitch_history, d.pitch)
|
||||||
d.roll_history = append(d.roll_history, d.roll)
|
d.roll_history = append(d.roll_history, d.roll)
|
||||||
|
|
||||||
|
//FIXME: Experimental (heading).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
f := math.Atan2(float64(d.gyro_reading.z), dist(float32(d.pitch), float32(d.roll)))
|
||||||
|
h1_deg := -float64(3.42857142857)*f * (180.0 / math.Pi)
|
||||||
|
// d.heading = float64((float64(3.42857142857)*sample_period * float64(-d.gyro_reading.z)) + d.heading)
|
||||||
|
d.heading = float64((sample_period * h1_deg) + d.heading)
|
||||||
|
if d.heading > 360.0 {
|
||||||
|
d.heading = d.heading - float64(360.0)
|
||||||
|
} else if d.heading < 0.0 {
|
||||||
|
d.heading = d.heading + float64(360.0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *MPU6050) measure() error {
|
func (d *MPU6050) measureGyro() error {
|
||||||
XYZ_gyro, err := d.readGyro()
|
XYZ_gyro, err := d.readGyro()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
d.gyro_reading = XYZ_gyro
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *MPU6050) measureAccel() error {
|
||||||
XYZ_accel, err := d.readAccel()
|
XYZ_accel, err := d.readAccel()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// glog.V(1).Infof("mpu6050: scaled gyro: (%f, %f, %f)", XYZ_gyro.x, XYZ_gyro.y, XYZ_gyro.z)
|
|
||||||
// glog.V(1).Infof("mpu6050: scaled accel: (%f, %f, %f)", XYZ_accel.x, XYZ_accel.y, XYZ_accel.z)
|
|
||||||
|
|
||||||
d.accel_reading = XYZ_accel
|
d.accel_reading = XYZ_accel
|
||||||
d.gyro_reading = XYZ_gyro
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *MPU6050) measure() error {
|
||||||
|
if err := d.measureGyro(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := d.measureAccel(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,6 +233,10 @@ func (d *MPU6050) PitchAndRoll() (float64, float64) {
|
||||||
return (d.pitch - d.pitch_resting), (d.roll - d.roll_resting)
|
return (d.pitch - d.pitch_resting), (d.roll - d.roll_resting)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *MPU6050) Heading() float64 {
|
||||||
|
return d.heading
|
||||||
|
}
|
||||||
|
|
||||||
func (d *MPU6050) Run() {
|
func (d *MPU6050) Run() {
|
||||||
go func() {
|
go func() {
|
||||||
d.quit = make(chan struct{})
|
d.quit = make(chan struct{})
|
||||||
|
@ -212,8 +245,8 @@ func (d *MPU6050) Run() {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-timer.C:
|
case <-timer.C:
|
||||||
// read values.
|
d.measureGyro()
|
||||||
d.measure()
|
d.measureAccel()
|
||||||
d.calculatePitchAndRoll()
|
d.calculatePitchAndRoll()
|
||||||
case <-calibrateTimer.C:
|
case <-calibrateTimer.C:
|
||||||
d.calibrate()
|
d.calibrate()
|
||||||
|
@ -226,6 +259,12 @@ func (d *MPU6050) Run() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set heading from a known value (usually GPS true heading).
|
||||||
|
func (d *MPU6050) ResetHeading(heading float64) {
|
||||||
|
log.Printf("reset true heading: %f\n", heading)
|
||||||
|
d.heading = heading
|
||||||
|
}
|
||||||
|
|
||||||
// Close.
|
// Close.
|
||||||
func (d *MPU6050) Close() {
|
func (d *MPU6050) Close() {
|
||||||
if d.quit != nil {
|
if d.quit != nil {
|
||||||
|
|
Ładowanie…
Reference in New Issue