-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Introduce a RMF transportation workcell #42
Draft
luca-della-vedova
wants to merge
20
commits into
luca/ros2dds_bridge
Choose a base branch
from
luca/rmf_transporter
base: luca/ros2dds_bridge
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
+2,396
−38
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
luca-della-vedova
force-pushed
the
luca/rmf_transporter
branch
from
December 11, 2024 08:23
67b0faa
to
89203ff
Compare
Signed-off-by: Luca Della Vedova <[email protected]>
luca-della-vedova
force-pushed
the
luca/rmf_transporter
branch
from
December 11, 2024 09:18
66d911d
to
28bbd6b
Compare
Signed-off-by: Luca Della Vedova <[email protected]>
luca-della-vedova
force-pushed
the
luca/rmf_transporter
branch
from
December 12, 2024 03:10
28bbd6b
to
cd666b0
Compare
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
luca-della-vedova
force-pushed
the
luca/rmf_transporter
branch
from
December 13, 2024 07:23
6dc0918
to
5eb6449
Compare
luca-della-vedova
changed the title
WIP: introduce a RMF transportation workcell
Introduce a RMF transportation workcell
Dec 13, 2024
Signed-off-by: Luca Della Vedova <[email protected]>
luca-della-vedova
force-pushed
the
luca/rmf_transporter
branch
from
December 13, 2024 08:12
5eb6449
to
3452bf7
Compare
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Signed-off-by: Luca Della Vedova <[email protected]>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR introduces RMF integration into nexus, where RMF is a workcell, managed by the workcell orchestrator, that is capable of executing
transportation
tasks through a new behavior tree and set of capabilities.This is in a simple demo stage. I brought in a modified office world, with the only modifications being renaming the dispensers to the names of the workcells, and added a new launch to
nexus_integration_tests
that launches RMF together with Nexus, as well as changed the movement of items to be based on an AMR rather than a mock transporter.Test it!
Clone, build and run:
Submit a task:
You should see the transportation happening:
Screencast.from.2024-12-12.18-10-14.webm
PR breakdown
The PR is large but I'll try to condense the main decision (and potentially controversial) points I went through during the design.
nexus_integration_tests vs nexus_demos
It would be more natural to create a new
nexus_demos
package that contains the bringup and I got halfway there before realising it would make the diff explode even further, so I went for an initial approach that reduces the number of changes innexus_integration_tests
, we can then do a followup PR that splits the package into anexus_demos
and anexus_integration_tests
, or maybe just rename it.Task cancellation
As noted in #40, the cancellation behavior of the workcell can't be customized and defaults to letting tasks run to completion. This means that the RMF task will not be cancelled and if a robot happens to be halfway through a long task and be waiting for a workcell that is cancelled, it will hang its waiting indefinitely. Once #40 is addressed we should add task cancellation to the
TransportAmr
capability.Is task doable / navgraph checking
As noted in #41, the payload can't be used for verifying task capability. Transportation tasks have a payload with a list of destinations and they will currently always return
true
regardless of whether the destinations exist or not. A more advanced capability checking that, for example, checks the fleet's navgraph for existence of waypoints, would be a better design.Map annotation
Visualizing the workcell requires its position to be populated, however Nexus (and the workcell orchestrator) currently have no way to populate this information.
For now just for the sake of visualizing I wrote a node that subscribes to the
/map
topic and looks for all waypoints with thepickup_dispenser
property and use their location to populate markers. It will then subscribe to states and update them.A better long term design would involve passing the workcell orchestrator information about the location of the workcell, pass it to the
system orchestrator
when registering and refactoring the visualization node to regularly calls the/list_workcells
service to query for existence of new workcells. I deferred this to avoid adding a large diff to the workcell orchestrator node and keep changes strictly addictive for review simplicity.Signaling
I introduced the capability of receiving signals for the
system orchestrator
, as well as change the default behavior tree to wait for the AMR before starting the workcell, rather than halfway. This was done to improve reliability in case of parallel tasks (i.e. there is no risk of a workcell starting a task, just for the wrong AMR to come in) but parallel tasks are still not quite there so not sure if it is still needed. An example of behavior tree that implements this new logic is here.What's next
Many things! But this PR is already at a very large size and I tried to keep the diff minimal (where I liberally define "diff" as pre-existing files that are changed and risk breaking existing behavior, not new additions that are more likely to be safe).
Create a Gazebo simulation that includes workcells together with AMRs
Right now the workcells are not simulated in Gazebo, it would be great to have a proper simulation world so users can inspect what is happening.
Often these workcells have conveyor belts to feed the items to / from the AMRs, these would also be valuable additions.
Simulate humans for workcells that are manually operated
In real life, not all workcells are automated and some are just operated by humans. We could mock this in simulation by just having a human in the dropoff point and a special behavior tree that just waits for an input.
Task parallelism
Currently submitting parallel tasks can risk deadlocking the system, since RMF and Nexus are somewhat independent. We should revisit the implementation to make sure we can have parallel tasks.
SKU Tracking
It would be interesting to show the position and status of the SKUs in rviz. This is especially useful to know their state as they are being moved throughout the facility.
Better handling of workcell location and registration
As noted in the
Map annotation
section of the PR description, populate the information at workcell registration time and not by subscribing to a/map
topic.Post processing of waypoints for AMR tasks
Currently, whenever a work order is received, an AMR task that goes through all the workcells will be generated and each workcell will only be signaled to start when the AMR arrives.
This however, will be suboptimal in two corner cases:
It is actually a bit tricky to design a single behavior tree that works for all cases and I would actually suggest using a different behavior tree for different purposes, such as the first case.