Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
8cf9c77
Feed live IK solutions to cbirrt. Add request file that does not prod…
dgottlieb Oct 16, 2025
57f0a96
Clean up rudimentary working algorithm.
dgottlieb Oct 17, 2025
cfb4b52
revert noisy debugging
dgottlieb Oct 17, 2025
073b392
fix log line
dgottlieb Oct 17, 2025
cfe0bd5
merge in main
dgottlieb Nov 9, 2025
3197835
update scene with Inputs API change
dgottlieb Nov 9, 2025
0ea3e16
Merge remote-tracking branch 'origin/main' into live-ik-solutions-to-…
dgottlieb Nov 10, 2025
6f3579b
delete scene that is no longer relevant
dgottlieb Nov 10, 2025
111bba2
remove node names
dgottlieb Nov 11, 2025
48c50ef
lint
dgottlieb Nov 11, 2025
4ff7b6f
Revert "remove node names"
dgottlieb Nov 12, 2025
dedf5c2
merge in main
dgottlieb Nov 12, 2025
b9c464c
to match default performance, change plan max IK solutions to 10
dgottlieb Nov 12, 2025
aa739b8
More efficient waiting
dgottlieb Nov 12, 2025
80cd13f
further optimize IK cleanup waiting. batch at the end of plan manager…
dgottlieb Nov 12, 2025
4b22174
lint
dgottlieb Nov 12, 2025
49aa7f6
move debug output execution such that it waits for dependent input to…
dgottlieb Nov 12, 2025
55074ae
lint
dgottlieb Nov 12, 2025
1374f4b
lint
dgottlieb Nov 12, 2025
2f1937c
check channel close
dgottlieb Nov 12, 2025
1248e93
I was wrong, needed a copy
dgottlieb Nov 13, 2025
f48a693
move to safe spot
dgottlieb Nov 13, 2025
5e3793c
actually have "not mine" be true
dgottlieb Nov 13, 2025
c05f441
lint
dgottlieb Nov 13, 2025
d218331
Test joint to joint code paths.
dgottlieb Nov 13, 2025
d7a8613
and...add the test file
dgottlieb Nov 13, 2025
c5d8f8d
feedback
dgottlieb Nov 17, 2025
5c53c1c
remove max solutions
dgottlieb Nov 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Feed live IK solutions to cbirrt. Add request file that does not prod…
…uce enough to start.
  • Loading branch information
dgottlieb committed Oct 16, 2025
commit 8cf9c77faf9c18c7879711ac80dc9c4fa61925fa
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ require (
github.com/jedib0t/go-pretty/v6 v6.4.6
github.com/jhump/protoreflect v1.15.6
github.com/kellydunn/golang-geo v0.7.0
github.com/kr/pretty v0.3.1
github.com/kylelemons/godebug v1.1.0
github.com/lestrrat-go/jwx v1.2.29
github.com/lmittmann/ppm v1.0.2
Expand Down Expand Up @@ -285,6 +286,7 @@ require (
github.com/kkHAIKE/contextcheck v1.1.5 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/pgzip v1.2.6 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kulti/thelper v0.6.3 // indirect
github.com/kunwardeep/paralleltest v1.0.10 // indirect
github.com/kyoh86/exportloopref v0.1.11 // indirect
Expand Down Expand Up @@ -362,6 +364,7 @@ require (
github.com/rivo/uniseg v0.4.7 // indirect
github.com/robfig/cron v1.2.0 // indirect
github.com/robfig/cron/v3 v3.0.1 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/ryancurrah/gomodguard v1.3.5 // indirect
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1135,6 +1135,7 @@ github.com/pion/webrtc/v3 v3.2.36 h1:RM/miAv0M4TrhhS7h2mcZXt44K68WmpVDkUOgz2l2l8
github.com/pion/webrtc/v3 v3.2.36/go.mod h1:wWQz1PuKNSNK4VrJJNpPN3vZmKEi4zA6i2ynaQOlxIU=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
Expand Down Expand Up @@ -1221,6 +1222,7 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
Expand Down
40 changes: 25 additions & 15 deletions motionplan/armplanning/cBiRRT.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,11 @@ func newCBiRRTMotionPlanner(ctx context.Context, pc *planContext, psc *planSegme

// only used for testin.
func (mp *cBiRRTMotionPlanner) planForTest(ctx context.Context) ([]referenceframe.FrameSystemInputs, error) {
initMaps, err := initRRTSolutions(ctx, mp.psc)
initMaps, bgGen, err := initRRTSolutions(ctx, mp.psc)
if err != nil {
return nil, err
}
bgGen.StopAndWait() // Assume initial solutions are good enough.

x := []referenceframe.FrameSystemInputs{mp.psc.start}

Expand All @@ -71,7 +72,7 @@ func (mp *cBiRRTMotionPlanner) planForTest(ctx context.Context) ([]referencefram
return x, nil
}

solution, err := mp.rrtRunner(ctx, initMaps.maps)
solution, err := mp.rrtRunner(ctx, initMaps.maps, bgGen)
if err != nil {
return nil, err
}
Expand All @@ -84,21 +85,19 @@ func (mp *cBiRRTMotionPlanner) planForTest(ctx context.Context) ([]referencefram
func (mp *cBiRRTMotionPlanner) rrtRunner(
ctx context.Context,
rrtMaps *rrtMaps,
bgSolutionGenerator *backgroundGenerator,
) (*rrtSolution, error) {
ctx, span := trace.StartSpan(ctx, "rrtRunner")
defer span.End()

mp.pc.logger.CDebugf(ctx, "starting cbirrt with start map len %d and goal map len %d\n", len(rrtMaps.startMap), len(rrtMaps.goalMap))
mp.pc.logger.CDebugf(ctx, "starting cbirrt with start map len %d and goal map len %d", len(rrtMaps.startMap), len(rrtMaps.goalMap))

// setup planner options
if mp.pc.planOpts == nil {
return nil, errNoPlannerOptions
}

_, cancel := context.WithCancel(ctx)
defer cancel()
startTime := time.Now()

var seed referenceframe.FrameSystemInputs

// initialize maps
Expand All @@ -109,8 +108,9 @@ func (mp *cBiRRTMotionPlanner) rrtRunner(
break
}
}
mp.pc.logger.CDebugf(ctx, "goal node: %v\n", rrtMaps.optNode.inputs)
mp.pc.logger.CDebugf(ctx, "start node: %v\n", seed)

mp.pc.logger.CInfof(ctx, "goal node: %v Name: %v Goal? %v", rrtMaps.optNode.inputs, rrtMaps.optNode.name, rrtMaps.optNode.goalNode)
mp.pc.logger.CInfof(ctx, "start node: %v", seed)
mp.pc.logger.Debug("DOF", mp.pc.lfs.dof)

interpConfig, err := referenceframe.InterpolateFS(mp.pc.fs, seed, rrtMaps.optNode.inputs, 0.5)
Expand All @@ -119,13 +119,24 @@ func (mp *cBiRRTMotionPlanner) rrtRunner(
}

target := newConfigurationNode(interpConfig)
mp.pc.logger.CInfof(ctx, "initial target. Name: %v Goal? %v", target.name, target.goalNode)

map1, map2 := rrtMaps.startMap, rrtMaps.goalMap
for i := 0; i < mp.pc.planOpts.PlanIter; i++ {
mp.pc.logger.CDebugf(ctx, "iteration: %d target: %v\n", i, target.inputs)
if ctx.Err() != nil {
mp.pc.logger.CDebugf(ctx, "CBiRRT timed out after %d iterations", i)
return &rrtSolution{maps: rrtMaps}, fmt.Errorf("cbirrt timeout %w", ctx.Err())
mp.pc.logger.CInfof(ctx, "iteration: %d target: %v target name: %v", i, target.inputs, target.name)

addNewGoals:
for {
select {
case <-ctx.Done():
mp.pc.logger.CDebugf(ctx, "CBiRRT timed out after %d iterations", i)
return &rrtSolution{maps: rrtMaps}, fmt.Errorf("cbirrt timeout %w", ctx.Err())
case newGoal := <-bgSolutionGenerator.newSolutionsCh:
mp.pc.logger.CInfof(ctx, "Added new goal while birrting. Goal: %v GoalName: %v", newGoal.inputs, newGoal.name)
rrtMaps.goalMap[newGoal] = nil
default:
break addNewGoals
}
}

tryExtend := func(target *node) (*node, *node) {
Expand Down Expand Up @@ -169,8 +180,7 @@ func (mp *cBiRRTMotionPlanner) rrtRunner(

// Solved!
if reachedDelta <= mp.pc.planOpts.InputIdentDist {
mp.pc.logger.CDebugf(ctx, "CBiRRT found solution after %d iterations in %v", i, time.Since(startTime))
cancel()
mp.pc.logger.CInfof(ctx, "CBiRRT found solution after %d iterations in %v", i, time.Since(startTime))
path := extractPath(rrtMaps.startMap, rrtMaps.goalMap, &nodePair{map1reached, map2reached}, true)
return &rrtSolution{steps: path, maps: rrtMaps}, nil
}
Expand Down Expand Up @@ -254,7 +264,7 @@ func (mp *cBiRRTMotionPlanner) constrainedExtend(
doubled = false
}
// constrainNear will ensure path between oldNear and newNear satisfies constraints along the way
near = &node{inputs: newNear}
near = &node{name: int(nodeNameCounter.Add(1)), inputs: newNear}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not intended to be part of the final solution. But I found giving nodes a "name" to be useful. To verify, for instance, whether the goal node we eventually reached was a pregenerted IK solution or a live one fed midway.

rrtMap[near] = oldNear
}
return oldNear
Expand Down
3 changes: 2 additions & 1 deletion motionplan/armplanning/cBiRRT_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ func TestSimpleLinearMotion(t *testing.T) {

mp, err := newCBiRRTMotionPlanner(ctx, pc, psc)
test.That(t, err, test.ShouldBeNil)
solutions, err := getSolutions(ctx, psc)
solutions, bgGen, err := getSolutions(ctx, psc)
bgGen.StopAndWait() // Original solutions must be good enough.
test.That(t, err, test.ShouldBeNil)

near1 := &node{inputs: referenceframe.FrameSystemInputs{m.Name(): home7}}
Expand Down
2 changes: 2 additions & 0 deletions motionplan/armplanning/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ type planSegmentContext struct {

motionChains *motionChains
checker *motionplan.ConstraintChecker

continueGeneratingSolutions bool
}

func newPlanSegmentContext(ctx context.Context, pc *planContext, start referenceframe.FrameSystemInputs,
Expand Down
Loading