使用定姿四元数计算图像位置

This commit is contained in:
nuknal
2024-06-07 10:51:20 +08:00
parent f7c4237c77
commit cf5012f2a8
8 changed files with 192 additions and 82 deletions

View File

@@ -0,0 +1,64 @@
package calculator
import (
"math"
"time"
"gonum.org/v1/gonum/mat"
)
// 常量
const (
focal = 1.3 // 焦距, m
FOV = 1.7 // 视场角,degree
nPixels = 9344 // 像素数
)
func Intersection(q Quaternion, satPos []float64, satTime time.Time, ucam int) (float64, float64) {
alpha := FOV * math.Pi / 180.0
alpha = -alpha/2.0 + float64(ucam)*(alpha/float64(nPixels))
direction := []float64{0, math.Tan(alpha), -1.3}
Ratt := q.ToRotationMatrix()
RattT := &mat.Dense{}
RattT.Inverse(Ratt)
v := mat.NewVecDense(3, direction)
var result mat.VecDense
result.MulVec(Ratt, v)
eciDirection := result.RawVector().Data
// intersection := intersectWithEllipsoid(satPos, eciDirection)
// lat, lon, _ := J2000ToWGS84(intersection[0], intersection[1], intersection[2], satTime)
x, y, z := ECItoECEF(eciDirection[0], eciDirection[1], eciDirection[2], satTime)
ecefDirection := []float64{x, y, z}
intersection := intersectWithEllipsoid(satPos, ecefDirection)
lat, lon, _ := ECEFToGeodetic(intersection[0], intersection[1], intersection[2])
return lat, lon
}
// 计算与椭球表面的交点
func intersectWithEllipsoid(p0, d []float64) []float64 {
a2 := a * a
b2 := b * b
A := d[0]*d[0]/a2 + d[1]*d[1]/a2 + d[2]*d[2]/b2
B := 2 * (p0[0]*d[0]/a2 + p0[1]*d[1]/a2 + p0[2]*d[2]/b2)
C := p0[0]*p0[0]/a2 + p0[1]*p0[1]/a2 + p0[2]*p0[2]/b2 - 1
delta := B*B - 4*A*C
if delta < 0 {
return nil // No intersection
}
t1 := (-B + math.Sqrt(delta)) / (2 * A)
t2 := (-B - math.Sqrt(delta)) / (2 * A)
t := math.Max(t1, t2)
return []float64{
p0[0] + t*d[0],
p0[1] + t*d[1],
p0[2] + t*d[2],
}
}