Skip to content

Commit 15049e1

Browse files
authored
Merge pull request #609 from JuliaRobotics/22Q3/perform/pose_br
StaticArray Pose2Pose2 and Pose2Point2BearingRange
2 parents 865fedb + cf32ff9 commit 15049e1

File tree

3 files changed

+48
-15
lines changed

3 files changed

+48
-15
lines changed

src/factors/BearingRange2D.jl

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,30 @@ function IIF.getMeasurementParametric(s::Pose2Point2BearingRange{<:Normal, <:Nor
3636
return meas, iΣ
3737
end
3838

39-
function (cfo::CalcFactor{<:Pose2Point2BearingRange})(measX, p, l)
40-
#
41-
M = getManifold(cfo.factor)
39+
function (cfo::CalcFactor{<:Pose2Point2BearingRange})(_measX::AbstractArray{MT}, _p::AbstractArray{PT}, _l::AbstractArray{LT}) where {MT,PT,LT}
40+
T = promote_type(MT, PT, LT)
41+
measX = convert(ArrayPartition{T, Tuple{SMatrix{2, 2, T, 4}, SVector{1, T}}}, _measX)
42+
p = convert(ArrayPartition{T, Tuple{SVector{2, T}, SMatrix{2, 2, T, 4}}}, _p)
43+
l = convert(SVector{2, T}, _l)
44+
r = cfo(measX, p, l)
45+
return r
46+
end
4247

48+
function (cfo::CalcFactor{<:Pose2Point2BearingRange})(
49+
measX::ArrayPartition{<:Real},
50+
p::ArrayPartition{T, Tuple{SVector{2, T}, SMatrix{2, 2, T, 4}}},
51+
l::SVector{2,T}) where T<:Real
52+
#
4353
# wl = l
4454
# wTp = p
4555
# pl = pTw*wl
4656
pl = transpose(p.x[2]) * (l - p.x[1])
57+
# δθ = mθ - plθ
58+
# δr = mr - plr
59+
δθ = Manifolds.sym_rem(measX.x[1][2] - atan(pl[2], pl[1]))
60+
δr = measX.x[2][1] - norm(pl)
4761

48-
mθ,mr = vee(M, Manifolds.Identity(M), measX)
49-
δθ =- atan(pl[2], pl[1])
50-
δr = mr - norm(pl)
51-
52-
return [δθ; δr]
62+
return SA[δθ, δr]
5363
end
5464

5565
# quick check

src/factors/Pose2D.jl

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,38 @@ function preambleCache(dfg::AbstractDFG, vars::AbstractVector{<:DFGVariable}, pp
4040
(;manifold=M, ϵ0=getPointIdentity(M), Xc=zeros(3), q̂=getPointIdentity(M))
4141
end
4242

43+
@inline function _vee(::SpecialEuclidean{2}, X::ArrayPartition{T, Tuple{SVector{2, T}, SMatrix{2, 2, T, 4}}}) where T<:Real
44+
return SVector{3,T}(X.x[1][1],X.x[1][2],X.x[2][2])
45+
end
46+
47+
@inline function _compose(::SpecialEuclidean{2}, p::ArrayPartition{T, Tuple{SVector{2, T}, SMatrix{2, 2, T, 4}}}, q::ArrayPartition{T, Tuple{SVector{2, T}, SMatrix{2, 2, T, 4}}}) where T<:Real
48+
return ArrayPartition(p.x[1] + p.x[2]*q.x[1], p.x[2]*q.x[2])
49+
end
50+
4351
# Assumes X is a tangent vector
44-
function (cf::CalcFactor{<:Pose2Pose2})(X, p, q)
52+
function (cf::CalcFactor{<:Pose2Pose2})(_X::AbstractArray{MT}, _p::AbstractArray{PT}, _q::AbstractArray{LT}) where {MT,PT,LT}
53+
T = promote_type(MT, PT, LT)
54+
X = convert(ArrayPartition{T, Tuple{SVector{2, T}, SMatrix{2, 2, T, 4}}}, _X)
55+
p = convert(ArrayPartition{T, Tuple{SVector{2, T}, SMatrix{2, 2, T, 4}}}, _p)
56+
q = convert(ArrayPartition{T, Tuple{SVector{2, T}, SMatrix{2, 2, T, 4}}}, _q)
57+
return cf(X,p,q)
58+
end
59+
60+
# function calcPose2Pose2(
61+
function (cf::CalcFactor{<:Pose2Pose2})(
62+
X::ArrayPartition{XT, Tuple{SVector{2, XT}, SMatrix{2, 2, XT, 4}}},
63+
p::ArrayPartition{T, Tuple{SVector{2, T}, SMatrix{2, 2, T, 4}}},
64+
q::ArrayPartition{T, Tuple{SVector{2, T}, SMatrix{2, 2, T, 4}}}) where {XT<:Real,T<:Real}
4565

46-
= allocate(q)
4766
M = getManifold(Pose2)
48-
ϵ0 = getPointIdentity(M)
49-
exp!(M, q̂, ϵ0, X)
50-
Manifolds.compose!(M, q̂, p, q̂)
51-
Xc = vee(M, q, log!(M, q̂, q, q̂))
67+
ϵ0 = ArrayPartition(zeros(SVector{2,T}), SMatrix{2, 2, T}(I))
68+
69+
ϵX = exp(M, ϵ0, X)
70+
# q̂ = Manifolds.compose(M, p, ϵX)
71+
= _compose(M, p, ϵX)
72+
X_hat = log(M, q, q̂)
73+
# Xc = vee(M, q, X_hat)
74+
Xc = _vee(M, X_hat)
5275
return Xc
5376
end
5477

test/testParametric.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ end
153153

154154
##
155155
@testset "Test Parametric PriorPoint2 and Pose2Point2BearingRange" begin
156-
fg = LightDFG( solverParams=SolverParams(algorithms=[:default, :parametric]))
156+
fg = GraphsDFG( solverParams=SolverParams(algorithms=[:default, :parametric]))
157157

158158
addVariable!(fg, :x1, Pose2)
159159
addVariable!(fg, :l1, Point2)

0 commit comments

Comments
 (0)