ROS MoveIt Dynamic Ground Plane?

asked 2021-02-02 08:57:48 -0500

grejj gravatar image

I am trying to setup and use ROS MoveIt with my mobile robot which has a single onboard manipulator. I have setup the ROS MoveIt config package for my robot, specified groups, and have seen successful doing some planning and execution. The robot has a 5-axis manipulator with claw on a differential drive, tracked mobile platform with "flippers".

Robot with Flippers

There is now a corner case that I am now trying to fix, and I am looking for the best way to go about this. The main problem I have is that the manipulator on my robot is colliding with the ground. First, I originally just added a ground plane to the moveit scene, as described in several other answers (https://answers.ros.org/question/3420...) . However, my main problem arises with the fact that the manipulator is on a mobile base so the entire manipulator is being rotated and translated in space as the robot moves over objects or "stands" on its flippers. As a result, when the robot is tilted on an object or pitched up on its flippers, for example, the actual ground plane changes with respect to my base link, hence causing issues and collisions.

The robot has no awareness of its surroundings at this point (where the ground is, other objects) but only worries about its own configuration. The only sensors I have available to me right now are an IMU mounted on the base and the "flipper" joint angles and obviously all the other manipulator joint angles. The robot has no awareness of its surroundings.

I am wondering how I can deal with this "dynamic" ground plane. I am thinking to simply read in the roll and pitch joint angles from the IMU and then use these angles to move the ground plane to assume that the ground will always be static relative to the "world" or "global" frame. But I am open to other ideas.

How do I handle this definition in the URDF? With MoveIt? I was thinking of setting something like this configuration:

ground_link -> prismatic_joint -> roll_link -> continuous_joint -> pitch_link -> continuous_joint -> base_link

The continuous joints would obviously be just the roll and pitch angles from the IMU. The prismatic joint would be determined by the "flipper" joint angle and my base_link geometry to determine how "high" off the ground the base link is.

Is this the right way to go about this? I have looked into the ROS navigation stack as well for my robot and noticed that I should be eventually using the IMU and wheel encoders to generate odometry as well as an odom->base_link transformation which may be the same thing I am trying to achieve here. However, I do not know if and how this would factor into the MoveIt scene.

How should I handle the ground to base link transformation with MoveIt?

edit retag flag offensive close merge delete

Comments

1

A quick comment: I'd probably use a collision object for this, which you insert into the MoveIt planning scene at runtime, and update when appropriate.

It doesn't even need to be a single one. Could be multiple planes (boxes probably). You could even insert a mesh into the planning scene (but you'd have to come up with a way to create that mesh, and I don't believe you have any suitable sensors).

MoveIt has API for this, which is service-based.

I would not use a ground plane (or at least, not the functionality provided around that in MoveIt). It'd be too limited.

You don't add anything to your URDF. That typically only models your robot proper, not the environment. The rest comes down to sensors (or post-processed data, which turns into collision objects).

gvdhoorn gravatar image gvdhoorn  ( 2021-02-02 10:43:19 -0500 )edit