@@ -13,6 +13,7 @@ import (
13
13
"github.com/edaniels/golog"
14
14
"go.viam.com/utils"
15
15
16
+ "go.viam.com/rdk/motionplan/ik"
16
17
"go.viam.com/rdk/referenceframe"
17
18
"go.viam.com/rdk/spatialmath"
18
19
)
@@ -55,7 +56,7 @@ func newCbirrtOptions(planOpts *plannerOptions) (*cbirrtOptions, error) {
55
56
// https://ieeexplore.ieee.org/document/5152399/
56
57
type cBiRRTMotionPlanner struct {
57
58
* planner
58
- fastGradDescent * NloptIK
59
+ fastGradDescent * ik. NloptIK
59
60
algOpts * cbirrtOptions
60
61
}
61
62
@@ -74,7 +75,7 @@ func newCBiRRTMotionPlanner(
74
75
return nil , err
75
76
}
76
77
// nlopt should try only once
77
- nlopt , err := CreateNloptIKSolver (frame , logger , 1 , opt . GoalThreshold )
78
+ nlopt , err := ik . CreateNloptIKSolver (frame , logger , 1 , true )
78
79
if err != nil {
79
80
return nil , err
80
81
}
@@ -132,7 +133,7 @@ func (mp *cBiRRTMotionPlanner) rrtBackgroundRunner(
132
133
rrt .maps = planSeed .maps
133
134
}
134
135
mp .logger .Infof ("goal node: %v\n " , rrt .maps .optNode .Q ())
135
- target := referenceframe .InterpolateInputs (seed , rrt .maps .optNode .Q (), 0.5 )
136
+ target := newConfigurationNode ( referenceframe .InterpolateInputs (seed , rrt .maps .optNode .Q (), 0.5 ) )
136
137
137
138
map1 , map2 := rrt .maps .startMap , rrt .maps .goalMap
138
139
@@ -163,13 +164,13 @@ func (mp *cBiRRTMotionPlanner) rrtBackgroundRunner(
163
164
default :
164
165
}
165
166
166
- tryExtend := func (target []referenceframe. Input ) (node , node , error ) {
167
+ tryExtend := func (target node ) (node , node , error ) {
167
168
// attempt to extend maps 1 and 2 towards the target
168
169
utils .PanicCapturingGo (func () {
169
- m1chan <- nm1 .nearestNeighbor (nmContext , mp .planOpts , newConfigurationNode ( target ) , map1 )
170
+ m1chan <- nm1 .nearestNeighbor (nmContext , mp .planOpts , target , map1 )
170
171
})
171
172
utils .PanicCapturingGo (func () {
172
- m2chan <- nm2 .nearestNeighbor (nmContext , mp .planOpts , newConfigurationNode ( target ) , map2 )
173
+ m2chan <- nm2 .nearestNeighbor (nmContext , mp .planOpts , target , map2 )
173
174
})
174
175
nearest1 := <- m1chan
175
176
nearest2 := <- m2chan
@@ -186,10 +187,10 @@ func (mp *cBiRRTMotionPlanner) rrtBackgroundRunner(
186
187
rseed2 := rand .New (rand .NewSource (int64 (mp .randseed .Int ())))
187
188
188
189
utils .PanicCapturingGo (func () {
189
- mp .constrainedExtend (ctx , rseed1 , map1 , nearest1 , newConfigurationNode ( target ) , m1chan )
190
+ mp .constrainedExtend (ctx , rseed1 , map1 , nearest1 , target , m1chan )
190
191
})
191
192
utils .PanicCapturingGo (func () {
192
- mp .constrainedExtend (ctx , rseed2 , map2 , nearest2 , newConfigurationNode ( target ) , m2chan )
193
+ mp .constrainedExtend (ctx , rseed2 , map2 , nearest2 , target , m2chan )
193
194
})
194
195
map1reached := <- m1chan
195
196
map2reached := <- m2chan
@@ -206,24 +207,24 @@ func (mp *cBiRRTMotionPlanner) rrtBackgroundRunner(
206
207
return
207
208
}
208
209
209
- reachedDelta := mp .planOpts .DistanceFunc (& Segment {StartConfiguration : map1reached .Q (), EndConfiguration : map2reached .Q ()})
210
+ reachedDelta := mp .planOpts .DistanceFunc (& ik. Segment {StartConfiguration : map1reached .Q (), EndConfiguration : map2reached .Q ()})
210
211
211
212
// Second iteration; extend maps 1 and 2 towards the halfway point between where they reached
212
213
if reachedDelta > mp .planOpts .JointSolveDist {
213
- target = referenceframe .InterpolateInputs (map1reached .Q (), map2reached .Q (), 0.5 )
214
+ target = newConfigurationNode ( referenceframe .InterpolateInputs (map1reached .Q (), map2reached .Q (), 0.5 ) )
214
215
map1reached , map2reached , err = tryExtend (target )
215
216
if err != nil {
216
217
rrt .solutionChan <- & rrtPlanReturn {planerr : err , maps : rrt .maps }
217
218
return
218
219
}
219
- reachedDelta = mp .planOpts .DistanceFunc (& Segment {StartConfiguration : map1reached .Q (), EndConfiguration : map2reached .Q ()})
220
+ reachedDelta = mp .planOpts .DistanceFunc (& ik. Segment {StartConfiguration : map1reached .Q (), EndConfiguration : map2reached .Q ()})
220
221
}
221
222
222
223
// Solved!
223
224
if reachedDelta <= mp .planOpts .JointSolveDist {
224
225
mp .logger .Debugf ("CBiRRT found solution after %d iterations" , i )
225
226
cancel ()
226
- path := extractPath (rrt .maps .startMap , rrt .maps .goalMap , & nodePair {map1reached , map2reached })
227
+ path := extractPath (rrt .maps .startMap , rrt .maps .goalMap , & nodePair {map1reached , map2reached }, true )
227
228
rrt .solutionChan <- & rrtPlanReturn {steps : path , maps : rrt .maps }
228
229
return
229
230
}
@@ -268,8 +269,8 @@ func (mp *cBiRRTMotionPlanner) constrainedExtend(
268
269
default :
269
270
}
270
271
271
- dist := mp .planOpts .DistanceFunc (& Segment {StartConfiguration : near .Q (), EndConfiguration : target .Q ()})
272
- oldDist := mp .planOpts .DistanceFunc (& Segment {StartConfiguration : oldNear .Q (), EndConfiguration : target .Q ()})
272
+ dist := mp .planOpts .DistanceFunc (& ik. Segment {StartConfiguration : near .Q (), EndConfiguration : target .Q ()})
273
+ oldDist := mp .planOpts .DistanceFunc (& ik. Segment {StartConfiguration : oldNear .Q (), EndConfiguration : target .Q ()})
273
274
switch {
274
275
case dist < mp .planOpts .JointSolveDist :
275
276
mchan <- near
@@ -286,7 +287,7 @@ func (mp *cBiRRTMotionPlanner) constrainedExtend(
286
287
newNear = mp .constrainNear (ctx , randseed , oldNear .Q (), newNear )
287
288
288
289
if newNear != nil {
289
- nearDist := mp .planOpts .DistanceFunc (& Segment {StartConfiguration : oldNear .Q (), EndConfiguration : newNear })
290
+ nearDist := mp .planOpts .DistanceFunc (& ik. Segment {StartConfiguration : oldNear .Q (), EndConfiguration : newNear })
290
291
if nearDist < math .Pow (mp .planOpts .JointSolveDist , 3 ) {
291
292
if ! doubled {
292
293
doubled = true
@@ -343,7 +344,7 @@ func (mp *cBiRRTMotionPlanner) constrainNear(
343
344
return nil
344
345
}
345
346
346
- newArc := & Segment {
347
+ newArc := & ik. Segment {
347
348
StartPosition : seedPos ,
348
349
EndPosition : goalPos ,
349
350
StartConfiguration : seedInputs ,
@@ -356,29 +357,29 @@ func (mp *cBiRRTMotionPlanner) constrainNear(
356
357
if ok {
357
358
return target
358
359
}
359
- solutionGen := make (chan []referenceframe. Input , 1 )
360
+ solutionGen := make (chan * ik. Solution , 1 )
360
361
// Spawn the IK solver to generate solutions until done
361
362
err = mp .fastGradDescent .Solve (ctx , solutionGen , target , mp .planOpts .pathMetric , randseed .Int ())
362
363
// We should have zero or one solutions
363
- var solved []referenceframe. Input
364
+ var solved * ik. Solution
364
365
select {
365
366
case solved = <- solutionGen :
366
367
default :
367
368
}
368
369
close (solutionGen )
369
- if err != nil {
370
+ if err != nil || solved == nil {
370
371
return nil
371
372
}
372
373
373
374
ok , failpos := mp .planOpts .CheckSegmentAndStateValidity (
374
- & Segment {StartConfiguration : seedInputs , EndConfiguration : solved , Frame : mp .frame },
375
+ & ik. Segment {StartConfiguration : seedInputs , EndConfiguration : solved . Configuration , Frame : mp .frame },
375
376
mp .planOpts .Resolution ,
376
377
)
377
378
if ok {
378
- return solved
379
+ return solved . Configuration
379
380
}
380
381
if failpos != nil {
381
- dist := mp .planOpts .DistanceFunc (& Segment {StartConfiguration : target , EndConfiguration : failpos .EndConfiguration })
382
+ dist := mp .planOpts .DistanceFunc (& ik. Segment {StartConfiguration : target , EndConfiguration : failpos .EndConfiguration })
382
383
if dist > mp .planOpts .JointSolveDist {
383
384
// If we have a first failing position, and that target is updating (no infinite loop), then recurse
384
385
seedInputs = failpos .StartConfiguration
@@ -439,7 +440,7 @@ func (mp *cBiRRTMotionPlanner) smoothPath(
439
440
// Note this could technically replace paths with "longer" paths i.e. with more waypoints.
440
441
// However, smoothed paths are invariably more intuitive and smooth, and lend themselves to future shortening,
441
442
// so we allow elongation here.
442
- dist := mp .planOpts .DistanceFunc (& Segment {StartConfiguration : inputSteps [i ].Q (), EndConfiguration : reached .Q ()})
443
+ dist := mp .planOpts .DistanceFunc (& ik. Segment {StartConfiguration : inputSteps [i ].Q (), EndConfiguration : reached .Q ()})
443
444
if dist < mp .planOpts .JointSolveDist {
444
445
for _ , hitCorner := range hitCorners {
445
446
hitCorner .SetCorner (false )
0 commit comments