frankaemika/franka_ros

How to set an external load with SetLoad()?

Closed this issue · 3 comments

Hello,
I am using the provided cartesian_impedance_example_controller and would like to set a load of a grasped object. I tried the following code, which does not work:

#include <franka_msgs/SetLoad.h>
     ros::ServiceClient client;
     franka_msgs::SetLoad srv;

     client = node_handle.serviceClient<franka_msgs::SetLoad>("set_load");
     srv.request.mass = mass_of_load;
     srv.request.F_x_center_load = gravity_vector; 
     srv.request.load_inertia = inertia_of_load ; 
     client.call(srv);

I am new to ROS and highly appreciate any help.
Thanks!

srv.request.F_x_center_load = gravity_vector;

This is the problem. F_x_center_load describes the translation between the flange and the center of mass of the grasped object. If it is directly between the fingers you can set it to {0,0,0.17}

Hi, I figured out that in Gazebo I have to use
client = node_handle.serviceClient<franka_msgs::SetLoad>("/set_load");
while on the real robot it is
client = node_handle.serviceClient<franka_msgs::SetLoad>("franka_control/set_load");

However, on the real robot I have the problem, that I cannot overwrite the setLoad command with a new client call. Only a restart of ROS can set the load back to zero. In Gazebo, overwriting works fine.

I would appreciate any help, how I can set back the load to zero on the real robot when I have set it before to a non zero value.

I cannot overwrite the setLoad command with a new client call

What exactly do you mean by that? Usually a new rosservice call /franka_control/set_load ... should work just fine, both on the real robot and in simulation. Could you give us some more details, like error messages?

Also please note that the set_load is a non-realtime command, which cannot be executed successfully when a control loop is running. Refer to this documentation for more information