17
17
- See related wrapper functions for convenient generators of helix patterns in 2D,
18
18
- Real valued `xr_t(t)` and `yr_t(t)` can be modified (and will override) complex valued `spine_t` instead.
19
19
- use `postpose_cb = (fg_, lastestpose) -> ...` for additional user features after each new pose
20
+ - can be used to grow a graph with repeated calls, but keyword parameters are assumed identical between calls.
20
21
21
- Related
22
-
23
- [`generateCanonicalFG_Helix2DSlew!`](@ref), [`generateCanonicalFG_Helix2DSpiral!`](@ref)
22
+ See also: [`generateCanonicalFG_Helix2DSlew!`](@ref), [`generateCanonicalFG_Helix2DSpiral!`](@ref), [`generateCanonicalFG_Beehive!`](@ref)
24
23
"""
25
24
function generateCanonicalFG_Helix2D! (numposes:: Integer = 40 ;
26
25
posesperturn:: Integer = 20 ,
@@ -34,40 +33,51 @@ function generateCanonicalFG_Helix2D!(numposes::Integer=40;
34
33
poseRegex:: Regex = r" x\d +" ,
35
34
μ0= [0 ;0 ;pi / 2 ],
36
35
refKey:: Symbol = :simulated ,
37
- Qd:: Matrix {<:Real}= diagm ( [0.1 ;0.1 ;0.05 ]. ^ 2 ),
36
+ Qd:: AbstractMatrix {<:Real}= diagm ( [0.1 ;0.1 ;0.05 ]. ^ 2 ),
38
37
postpose_cb:: Function = (fg_,latestpose)-> () )
39
38
#
40
39
41
40
# add first pose if not already exists
42
- if ! ( :x0 in ls (dfg) )
41
+ _initpose = Symbol (match (r" [A-Za-z]+" , poseRegex. pattern). match, 0 )
42
+ if ! exists ( dfg, _initpose )
43
43
generateCanonicalFG_ZeroPose (dfg= dfg, μ0= μ0, graphinit= graphinit, postpose_cb= postpose_cb) # , μ0=[0;0;1e-5] # tried for fix NLsolve on wrap issue
44
44
getSolverParams (dfg). useMsgLikelihoods = useMsgLikelihoods
45
45
# reference ppe on :x0
46
46
ppe = DFG. MeanMaxPPE (refKey, μ0, μ0, μ0)
47
47
setPPE! (dfg[:x0 ], refKey, DFG. MeanMaxPPE, ppe)
48
48
end
49
49
50
- # what is the last pose
51
- lastpose = (ls (dfg, poseRegex) |> sortDFG)[end ]
52
- # get latest posecount number
50
+ # start from existsing poses
51
+ _poses = ls (dfg, poseRegex) |> sortDFG
52
+ # what is the last pose and posecount number
53
+ lastpose = _poses[end ]
53
54
posecount = match (r" \d +" , string (lastpose)). match |> x-> parse (Int,x)
55
+ # init how many poses at the beginning of a new turn
56
+ bidx = length (_poses) # 1
54
57
58
+ # fractional number of turns to make in total (after all graph generation is done)
55
59
turns = numposes/ posesperturn
56
- # TODO dont always start from 0
60
+ # generate helix pattern algebraically
57
61
tmp = calcHelix_T (0 , turns, posesperturn, radius= radius, spine_t= spine_t, xr_t= xr_t, yr_t= yr_t)
58
-
59
- Tμ = SE2 (μ0- [0 ;0 ;pi / 2 ])
60
-
61
- bidx = 1
62
+ # TODO , dont always start from 0 -- i.e. chop first repeat elements from deterministic helix
63
+
64
+ # select the starting point
65
+ _μ0 = μ0
66
+ # @show _μ0 = 1 == bidx ? μ0 : getPPE(dfg, lastpose, refKey).suggested
67
+ Tμ = SE2 (_μ0- [0 ;0 ;pi / 2 ])
68
+
69
+ # current end pose count for number of turns
62
70
eidx = 1
63
71
for tn in 0 : (ceil (Int, turns)- 1 )
64
72
eidx += posesperturn
73
+ # skip out early if extending a previous existing graph
65
74
eidx = minimum ( [eidx, length (tmp[1 ])] )
66
75
# tmp_ = _calcHelix2DApprox(N_ppt=posesperturn, radius=radius, runback=runback)
67
76
tmp_ = hcat (tmp[2 ][bidx: eidx,:],tmp[3 ][bidx: eidx])'
68
77
# adjust for turn progression in x
69
78
# tmp_[1,:] .+= tn*(2radius*(1-runback))
70
79
oldpose = Tμ* SE2 (tmp_[:,1 ])
80
+ eidx < bidx ? continue : nothing
71
81
72
82
# add each new pose (skippin the first element)
73
83
for ps in 2 : size (tmp_,2 )
0 commit comments