-
https://github.com/tue-robotics/rgbd.git sensor stream
In order to classify and grasp objects, dynamic objects need to be integrated in the world model with the use of sensor data. The RGBD (kinect) plugin allows adding new entities to the world model with their associated RGBD measurements. Based on the entities already available in the scene, the rgbd plugin enables segmentation and association with use of specified segmentation areas. Segmentation, association and updating entities based on RGBD measurements will be illustrated in this tutorial.
First we need to update the model and specify an area that can be used for segmentation. We add a new model to the my-model-dir that is called cabinet:
mkdir my-model-dir && cd my-model-dir
mkdir cabinet && vim cabinet/model.yaml
Create the cabinet model
shape:
compound:
- box:
# Left side
pose: {x: 0, y: -0.37, z: 0.395}
size: {x: 0.395, y: 0.05, z: 0.79}
- box:
# Right side
pose: {x: 0, y: 0.37, z: 0.395}
size: {x: 0.395, y: 0.05, z: 0.79}
- box:
# Top
pose: {x: 0, y: 0, z: 0.765}
size: {x: 0.395, y: 0.69, z: 0.05}
- box:
# Bottom
pose: {x: 0, y: 0, z: 0.025}
size: {x: 0.395, y: 0.69, z: 0.05}
- box:
# Shelf
pose: {x: 0, y: 0, z: 0.395}
size: {x: 0.395, y: 0.69, z: 0.02}
- box:
# Shelf
pose: {x: 0, y: 0, z: 0.395}
size: {x: 0.395, y: 0.02, z: 0.69}
color:
red: 0.1
green: 0.1
blue: 0.1
areas: # These areas can be used by the kinect plugin for segmentation
- name: on_top_of
shape:
- box:
min: { x: -0.17, y: -0.37, z: 0.845 }
max: { x: 0.17, y: 0.37, z: 1.2 }
Update the robot-lab model:
mkdir robot-lab
vim robot-lab/model.yaml
composition:
- type: "robot-lab/walls"
id: "walls"
pose:
x: 0
y: 0
z: 0
- type: "cabinet"
id: "cabinet"
pose:
x: 3.30
y: 4.35
z: 0
X: 0
Y: 0
Z: 0
Copy the robot-lab heightmap model to robot-lab/walls.
Now we are going to create the config for ed and make sure that we load all required plugins:
world:
- type: robot-lab
pose: { x: 0, y: 0, z: 0 }
plugins:
- name: gui_server
type: ed_gui_server/gui_server
- name: localization
type: ed_localization/localization
parameters:
robot_name: amigo
initial_pose_topic: /amigo/initialpose
particle_filter:
min_particles: 100
max_particles: 750
kld_err: 0.02
kld_z: 0.98
recovery_alpha_slow: 0 #0.001
recovery_alpha_fast: 0 #0.1
cell_size_x: 0.5
cell_size_y: 0.5
cell_size_theta: 0.1745
initial_pose:
x: 0.586 #$(env ROBOT_INIT_X)
y: 4.259 #$(env ROBOT_INIT_Y)
rz: 0 #$(env ROBOT_INIT_PHI)
laser_model:
topic: /amigo/base_laser/scan
num_beams: 100
z_hit: 0.95
sigma_hit: 0.2
z_short: 0.1
z_max: 0.05
z_rand: 0.05
lambda_short: 0.1
range_max: 10
min_particle_distance: 0.01
min_particle_rotation_distance: 0.02
odom_model:
map_frame: map
odom_frame: /amigo/odom
base_link_frame: /amigo/base_link
alpha1: 0.05 # rot -> trans + strafe
alpha2: 0.5 # trans -> rot
alpha3: 0.5 # trans -> trans
alpha4: 0.5 # rot -> rot
alpha5: 0.5 # trans -> strafeb: libed_gui_server_plugin.so
- name: rgbd_integration # Kinect integration
type: ed_sensor_integration/rgbd
enabled: 1
parameters:
topic: /amigo/top_kinect/rgbd
Now that the config is set-up, the world model can be started:
rosrun ed ed my-ed-config.yaml
This looks quiet the same as previous tutorials but the cabinet entity present in the scene has now a specified area that can be used by the kinect plugin to do segmentation.
Now we move the robot towards the cabinet and open the RGBD sensor view:
With use of the exposed ROS services by the kinect integration plugin, we can segment the cans that are standing 'on_top_of' the cabinet:
rosservice call /ed/kinect/update "area_description: 'on_top_of robot-lab/cabinet'"
Now we have updated the world model with use of the kinect data. See the next tutorial how to use this data.