ROS-Gazebo plugin for simulate the elastic bheavior of the qbmove actuators in Gazebo. For those not familiar with these actuators, in brief, the qbMove is a compliant actuator with varible stiffness, based on the agonistic-antagonistic principle presented in Catalano M. et. al., developed by qbRobotics.
The plugin supposes to be able to control the motor position references of the real qbmoves. I'm planning to include the motor dynamics as well, from which test torque controllers, developping another complementary plugin.
Clone the packages, one implementing the plugin and the others implementing a template example and the qbRobotics utils, in your current catkin workspace.
There are two ways of using the ROS-Gazebo-plugin-qbmove properly:
- Standalone, within a simple URDF;
- Embedded, leveraging on the ROS-qbmove nodes inside the utils folder.
For the first solution, the advanced plugin must be inserted directly into the URDF, associated to each joints of your robot (see below).
For the second solution the advanced plugin is embedded into the ROS-qbmove (or qbmove-ros) package, thus it is required. In order to include the plugin, you have to replace the /qbmove_description folder inside the qbmove-ros package with the one inside the /qbmove_utils folder. (NOTE: that package has been modified w.r.t. the qbRobotics!)
You can find a simple usage template inside the /example/template_description folder.
The namespace of your robot (required) is defined separately in a yaml file, inside the /config folder as follows
## Namespace of the robot
namespace: "your_namespace" # default = "toBEassigend"
and is loaded inside the launch file with the following
<!-- Load the parameter for the compliant plugin from the configuration file -->
<rosparam command="load" file="$(find template_description)/config/advanced_config.yaml"/>
The plugin can be inserted to each revolute (or continous) joint (your_joint) of your robot as follows
<gazebo>
<plugin name="advanced_vsa_j1" filename="libadvanced_plugin.so">
<joint>your_joint_name</joint>
<control_type>your_control_mode</control_type>
<pub_eltau>true</pub_eltau>
<pub_state>true</pub_state>
<sub_ext_tau>true</sub_ext_tau>
</plugin>
</gazebo>
<gazebo>
<plugin name="sea_j1" filename="libsea_plugin.so">
<joint>your_joint_name</joint>
<namespace>your_ns</namespace>
<stiffness>100</stiffness>
<pub_eltau>true</pub_eltau>
<pub_state>true</pub_state>
<sub_ext_tau>true</sub_ext_tau>
</plugin>
</gazebo>
According to the plugin and the tags seleceted, different topics are generated to allow publishing the relative references.
Here in the control mode tag, the available controllers and the relative topics are as follows:
- your_control_mode == 0, the two references are used as motor positions, topic names:
/your_namespace/your_joint_name/reference_1 /your_namespace/your_joint_name/reference_2
- your_control_mode == 1, the two reference are used as equilibirum position and preset (according to the qbmove functions) of the actuator, topic names:
/your_namespace/your_joint_name/equilibirum_pos /your_namespace/your_joint_name/preset
- your_control_mode == 2, only the first reference is used as torque input for the joint (suposed rigid), while the second reference is disabled. The topic names become
/your_namespace/your_joint_name/torque /your_namespace/your_joint_name/disabled
In this case, the only topic generated to command the motor reference is the following
/your_namespace/your_joint_name/theta_command
The remaining tags are used to enable other useful publishers, one for publishing the value of the elastic torques (not available in SEA mode), in the following topics
/your_namespace/your_joint_name/tau_el1_state
/your_namespace/your_joint_name/tau_el2_state
and the other one in which retrieving useful information about the joint state, i.e., joint position and velocity q,dq, current references _ref_1,ref_2, joint torque tau and joint stiffness stiff. All of these values are stored in a cusotom message on the following topic
/your_namespace/your_joint_name/state
Finally, it is possible to apply an external torque on the joint with the following subscriber topic (provided that the sub_ext_tau is set as true!)
/your_namespace/your_joint_name/ext_tau