Mobile manipulation and RMF (#136)

Posted by @RValner:

Hi,

Does mobile manipulation fit into the scope of RMF? If I have understood it correctly, the dispensers and ingestors are assumed to be static workcells, which absolutely makes sense. But is there a way to uniquely assign a “workcell” to a specific mobile robot which has a manipulator arm, so that RMF can trigger the dispensing sequence for the right robot?

The idea is to have a mixed dispenser system in a heterogenous fleet where mobile manipulators can dispense autonomously while mobile bases dispense via user picking up the cargo and verifying the act via an external interface. Installing a static manipulator as a dispenser is also feasible but I just wanted to explore the options.

Thanks


Edited by @RValner at 2022-02-04T14:49:39Z

Posted by @mxgrey:

The commands for picking up and dropping off items decouple the “location” (where the pickup/dropoff happens) from the “handler” (who or what will be placing/removing the item from the robot).

If you designate a unique dispenser/ingestor ID for the mobile robot then you can simply use that ID when filling in both the pickup_dispenser and dropoff_ingestor fields of the delivery request. Or in the new task request system of the upcoming release, you would fill in handler with the name of the robot.

Besides that, you’ll need to have a workcell adapter node for your robot’s manipulator. That way when the fleet adapter issues the command to perform the dispensing/ingesting, your robot can respond appropriately.

So there’s no assumption about workcells being static. At worst, we assume that the workcell will be present and available at the pickup/dropoff location as soon as the robot arrives. We could loosen that assumption if/when we support multi-agent cooperative tasks in the future.

Posted by @RValner:

Awesome, thanks!

Posted by @mrceki:

Hi, as far as I understand, if I implement this solution, I can assign a single robot for each “dispenser” and “ingestor” location, is that correct? If I understand correctly, how can I enable access to a workcell for multiple robots for a single workcell?

Posted by @mxgrey:

The original question is about how to command a workcell which is mounted on a mobile robot.

What you’re describing is the normal use case for RMF. Nothing special needs to be done.

Posted by @mrceki:

I just realized that my question doesn’t make any sense. I’m trying to understand the layout of the project, so where should I look to designate the “handler” with the robot name using the rmf_ros2 package?

Posted by @mxgrey:

The “handler” that I mentioned refers to the workcell that handles the pickup or drop-off action during a delivery. Each physical workcell in your deployment should have a unique name.

That unique name should be put into a payload_transfer dictionary which gets used for the pickup and dropoff fields of a delivery task definition.

That delivery task definition can be dispatched using ROS messages like what’s done by this command line tool or if you have web integration then you can use the rmf-web API server.

Posted by @mrceki:

I understand, but how can I find out which robot is assigned to this task so that I can fill in the robot ID as dispenser/ingestor as you mentioned before?

Posted by @sabbysim:

@mxgrey Do you have a sample of the workcell adapter node or something similar that I can refer to?
To include a static robotic arm as a dispenser, I will have to write the above node from scratch to subscribe to dispenser_requests and publish dispenser_results and dispenser_states?
When the robot arrives at the dispenser (static robotic arm), the workcell node will receive a dispenser_request message. This is the cue for me to send a command to activate the arm. Once the arm has completed its task, the workcell node will publish dispenser_results msg. If success, robot will move to ingestion location and repeat the process. Is my understanding correct?
Do I run the workcell node separately like door/robot adapters? Does the name of this node has to be aligned with the pickup_dispenser property in traffic editor?