Custom moveit *_tcp and *_global planning groups

Hello,

In Tormach’s fork of moveit, what is the rationale behind the *tcp and *global planning groups and do they give me any new functionality that I can use to my advantage? They are identical in the setup for the default manipulator, so I am having a hard time understanding why they are there. I have added a custom gripper and therefore a custom group, but it seems that these other groups that are identical to my custom group but named differently are mandatory, even though I never specify them in my move_group goals. It wouldn’t plan without the global group, but it only plans sometimes without the tcp group. Other times it gives an error that my_custom_group_tcp was not found. When do I need that group and when do I not?

Also, why are the tool0_tcp and tcp_lin_link links/tf frames needed? Is that related to the groups?

Thanks!

Hi @tbh,
tcp related question:
tcp rot and lin provide information on the current path travel and state.
Imagine that you develop an application that uses a robot for glue deposition on some path. If you know the speed at which the nozzle (tcp) is advancing in the current path domain [tcp_lin, tcp_rot] and the required volume of glue per unit linear distance on the path, you can control the actuator that presses the syringe with the glue to deposit the correct amount of glue.

Side note:
tcp_lin and tcp_rot are experimental features. If you wish to send low-level joint trajectories to ros_controller, we support skipping tcp_lin and tcp_rot, you do not need to declare them.
[Please be extra careful if you send direct low-level ros joint_trajectory message to a real robot. This can be very dangerous.]

I need some more investigation for your other question about moveit groups.

Thanks for the partial clarification about tcp_lin and tcp_rot.

Regarding the other groups, I see that in overrides.yaml, the manipulator kinematics mode is gd_c (gradient descent-constrained) while the manipulator_global mode is bio2_memetic. I’m still trying to unpack what that means. It looks like it calls both IK solvers every time. There’s a comment in TrajectoryGenerator::generate that says.

// check goal pose ik before Cartesian motion plan starts, we use a separate planning group with global solving enabled

I am very new to this part of moveit, so I am not sure I 100% understand, even with the comment, why this is necessary or desired, and I still don’t see a distinction for the manipulator_tcp group anywhere.