Hi all,
I am working on setting up stretch for autonomous mobile manipulation and was wondering now that stretch comes with moveit2 integrated if it makes sense to directly use octomaps that are already integrated with moveit. This would seem convenient from an integration point of view. Has someone weighed these two against each other and has some advice?
Best,
Michal
Hello @Michal,
It is not clear to me what you mean to ask. Are you asking for a comparison between using FUNMAP and MoveIt with Octomap, as per the title, or do you want to know if it’s possible to use Octomap with MoveIt 2 like with MoveIt, as per the description?
Best,
Chintan Desai
Correct me if I’m wrong, but I think the question is about MoveIt2’s Octomap representation of a map vs FUNMAP’s max height image representation, and about the pros/cons of each approach.
I can try to provide some background/my perspective, but I’ll start with where things live:
- There’s Stretch ROS, which has ROS1 Noetic packages and every package is stable/well-tested. This is where FUNMAP lives.
- Next is Stretch ROS2, which is where we are actively developing ROS2 Galactic packages, so you might run into some out-of-date docs or bugs while using it and we can fix those for you. ROS2 currently supports the drivers and MoveIt2. Don’t be fooled by the fact that there’s packages called stretch_octomap or stretch_funmap, they’re actually ROS1 packages from when we started the ROS2 port and haven’t been ported yet. The full list of what has been ported is here. Personally, I think you would have a pretty easy time getting Octomap working with MoveIt2. There’s tutorials and people have explored down this path.
A bit of background: FUNMAP represents the world as a “Max height image” (MHI), meaning its maps are images where each pixel represents the highest z point seen by the camera. MHIs look like a top down view of the world.
MHIs make it easy to do path planning, object segmentation, surface fitting, and other common perception tasks related to mobile manipulation via efficient image space operations. For example, you can get a mask of the floor through a threshold convolution, which can be very fast on a GPU. Hello Robot’s CTO, Dr. Charlie Kemp, created FUNMAP and wrote up some of the implementation details here.
Octomaps are voxelized representation of the world and you can control the granularity to increase/decrease the detail of the map. The underlying octree segments 3D space into 8 octants, recursively. Octomaps are probabilistic, which can clear up sensor noise from the Realsense and ephemeral things that move around in the environment.
A few other ways in which the two options differ:
- FUNMAP is currently ROS1 based, whereas MoveIt2 is ROS2 based. If you have to choose a ROS stack, it’ll dictate which planner is available to you.
- FUNMAP is all Python, whereas MoveIt2 is written in C++. One thing to note is that Moveit2 is getting Python bindings soon.
- FUNMAP is a optimization/heuristic based planner, whereas MoveIt2 is a geometric planner.
- FUNMAP tends to make saner plans for common rooms, both in terms of mobile base navigation and manipulation on a surface. MoveIt2 can manipulate under surfaces/obstacles.
- FUNMAP doesn’t have support for the Dex Wrist right now (likely to change this month), whereas MoveIt2 already has experimental support.
- FUNMAP was written for Stretch, so it actively makes use of Stretch’s features. For example, it takes advantage of Stretch’s ability to do contact sensitive motion in order to open drawers. MoveIt2 is written to work for any robot and doesn’t do fine-grain contact sensitivity.
- FUNMAP provides other utility ROS services, like aligning to cliffs in the environment.
- MoveIt2 definitely has the larger user base, so there’s also the option to ask MoveIt2 questions to ROS Answers or MoveIt2’s Discord.
From a “getting started” point of view, I’d recommend exploring both for a little bit since the barrier of entry is pretty low. There’s tutorial here to get started with FUNMAP. And there’s three tutorials here to get started with MoveIt2.