Attach two Gazebo models with a virtual joint in a generalized grasp hack
Python C++ CMake
Latest commit 981880c Jul 19, 2016 @awesomebytes awesomebytes committed on GitHub Merge pull request #4 from job-1994/master
Added the dependency line which forces the catkin_make to first build…

README.md

Attach two Gazebo models with a virtual joint in a generalized grasp hack

Build

mkdir -p gazebo_link_attacher_ws/src
cd gazebo_link_attacher_ws/src
catkin_init_workspace
git clone https://github.com/pal-robotics/gazebo_ros_link_attacher.git
cd ..
catkin_make
source devel/setup.bash

Launch

roslaunch gazebo_ros_link_attacher test_attacher.launch

Empty world with the plugin libgazebo_ros_link_attacher.so loaded (in the worlds folder).

Which provides the /link_attacher_node/attach service to specify two models and their links to be attached.

And /link_attacher_node/detach service to specify two models and their links to be detached.

gazebo screenshot

Run demo

In another shell, be sure to do source devel/setup.bash of your workspace.

rosrun gazebo_ros_link_attacher spawn.py

Three cubes will be spawned.

rosrun gazebo_ros_link_attacher attach.py

The cubes will be attached all between themselves as (1,2), (2,3), (3,1). You can move them with the GUI and you'll see they will move together.

rosrun gazebo_ros_link_attacher detach.py

The cubes will be detached and you can move them separately again.

You can also spawn items with the GUI and run a rosservice call:

rosservice call /link_attacher_node/attach "model_name_1: 'unit_box_1'
link_name_1: 'link'
model_name_2: 'unit_sphere_1'
link_name_2: 'link'"

And same thing to detach:

rosservice call /link_attacher_node/detach "model_name_1: 'unit_box_1'
link_name_1: 'link'
model_name_2: 'unit_sphere_1'
link_name_2: 'link'"

Current status

It works!

Currently it crashes with:

***** Internal Program Error - assertion (self->inertial != __null) failed in static void gazebo::physics::ODELink::MoveCallback(dBodyID):
/tmp/buildd/gazebo4-4.1.3/gazebo/physics/ode/ODELink.cc(178): Inertial pointer is NULL
Aborted (core dumped)

Which I've only seen this other useful information: Bitbucket gazebo removing moving model with ode friction fails. But it didn't help me solve my crash. I guess when attaching one model to the other it removes the second one to re-create it attached to the first or something like that.

And also this other issue: Visualizing dynamically created joints made me add a couple of lines more.

The method to attach the links is based on the grasp hack of the Gripper in gazebo/physics: Gripper.hh Gripper.cc

Which is to create a revolute joint on the first model (with range of motion 0) linking a link on the first model and a link on the second model.