Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| tutorials:advanced:bullet_world_boxy [2015/09/11 15:53] – removed gkazhoya | tutorials:advanced:bullet_world_boxy [2015/09/17 14:58] (current) – created gkazhoya | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Setting up the Bullet world with a new robot ====== | ||
| + | |||
| + | This tutorial will walk you though creating your own repo / metapackage from scratch that will use CRAM and Bullet world with your own robots. In this tutorial we will use the Boxy robot as an example. | ||
| + | |||
| + | The starting point of this tutorial is an installation of CRAM including projection with PR2. If you followed the installation manual, you should have all the necessary packages already. | ||
| + | |||
| + | |||
| + | ===== Robot URDF description ===== | ||
| + | |||
| + | The first thing that we actually need is the robot, more precisely, its URDF description. | ||
| + | For Boxy it is located in a repo on Github, so let's clone it into our ROS workspace: | ||
| + | |||
| + | <code bash> | ||
| + | cd ROS_WORKSPACE_FOR_LISP_CODE | ||
| + | cd src | ||
| + | git clone https:// | ||
| + | cd .. | ||
| + | catkin_make | ||
| + | </ | ||
| + | |||
| + | CRAM takes the URDF descriptions of the robots from the ROS parameter server, i.e., you will need to upload the URDFs of your robots as a ROS parameter. For Boxy there is a launch file doing that, you will find it here: | ||
| + | |||
| + | <code bash> | ||
| + | roscd iai_boxy_description/ | ||
| + | </ | ||
| + | |||
| + | It's called '' | ||
| + | |||
| + | <code xml> | ||
| + | < | ||
| + | <arg name=" | ||
| + | <arg name=" | ||
| + | |||
| + | <param | ||
| + | name=" | ||
| + | command=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | As we will need to know the names of the TF frames later, we will launch a general file that includes uploading the URDF as well as a robot state publisher: | ||
| + | |||
| + | <code bash> | ||
| + | roslaunch iai_boxy_description display.launch | ||
| + | </ | ||
| + | |||
| + | (It also starts a GUI to play with the joint angles but let's ignore that.) | ||
| + | |||
| + | Let's check if the URDF's on the parameter server using RViz: | ||
| + | |||
| + | <code bash> | ||
| + | rosrun rviz rviz | ||
| + | Add -> RobotModel -> Robot Description: | ||
| + | Add -> TF | ||
| + | </ | ||
| + | |||
| + | To be able to see the TF frames choose '' | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | |||
| + | ===== Directory / file setup ===== | ||
| + | |||
| + | Now let's setup a directory structure for our own packages: a directory (repo) and the metapackage inside: in the '' | ||
| + | |||
| + | <code bash> | ||
| + | mkdir cram_boxy && cd cram_boxy | ||
| + | catkin_create_pkg cram_boxy && cd cram_boxy | ||
| + | </ | ||
| + | |||
| + | Edit the '' | ||
| + | |||
| + | <code cmake> | ||
| + | cmake_minimum_required(VERSION 2.8.3) | ||
| + | project(cram_boxy) | ||
| + | find_package(catkin REQUIRED) | ||
| + | catkin_metapackage() | ||
| + | </ | ||
| + | |||
| + | The first ROS package we will create will be the Prolog description of our robot. We will call it '' | ||
| + | Go back to the root of your '' | ||
| + | |||
| + | <code bash> | ||
| + | cd .. | ||
| + | catkin_create_pkg cram_boxy_knowledge cram_prolog cram_robot_interfaces | ||
| + | </ | ||
| + | |||
| + | Now let's create the corresponding ASDF file called '' | ||
| + | |||
| + | <code lisp> | ||
| + | ;;; You might want to add a license header first | ||
| + | |||
| + | (defsystem cram-boxy-knowledge | ||
| + | :author "Your Name" | ||
| + | :license " | ||
| + | :depends-on (cram-prolog | ||
| + | | ||
| + | :components | ||
| + | ((:module " | ||
| + | :components | ||
| + | ((:file " | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Now create the corresponding '' | ||
| + | |||
| + | <code lisp> | ||
| + | ;;; license | ||
| + | |||
| + | (in-package :cl-user) | ||
| + | |||
| + | (defpackage cram-boxy-knowledge | ||
| + | (:use #: | ||
| + | #: | ||
| + | #: | ||
| + | </ | ||
| + | |||
| + | Also, an empty '' | ||
| + | |||
| + | Now, let's compile our new packages and load them through the REPL: | ||
| + | |||
| + | <code lisp> | ||
| + | CL-USER> , | ||
| + | ros-load-system | ||
| + | cram_boxy_knowledge | ||
| + | cram-boxy-knowledge | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Boxy Prolog description ===== | ||
| + | |||
| + | Now, let's describe our robot in Prolog, such that we could do some reasoning with it. | ||
| + | |||
| + | We fill in the file '' | ||
| + | |||
| + | As can be seen from the TF tree, our robot has 3 camera frames, 1 depth and 1 RGB frame from a Kinect camera, and an RGB frame from a Kinect2 camera. | ||
| + | {{ : | ||
| + | |||
| + | It's camera can be from 1.60 m to 2.10 m above the ground, depending on the torso position. | ||
| + | It also has a pan-tilt-unit. | ||
| + | |||
| + | < | ||
| + | ;;; license | ||
| + | |||
| + | (in-package : | ||
| + | |||
| + | (def-fact-group boxy-metadata (robot | ||
| + | | ||
| + | | ||
| + | | ||
| + | (<- (robot boxy)) | ||
| + | (<- (camera-frame boxy " | ||
| + | (<- (camera-frame boxy " | ||
| + | (<- (camera-frame boxy " | ||
| + | (<- (camera-minimal-height boxy 1.60)) | ||
| + | (<- (camera-maximal-height boxy 2.10)) | ||
| + | (<- (robot-pan-tilt-links boxy " | ||
| + | (<- (robot-pan-tilt-joints boxy " | ||
| + | </ | ||
| + | |||
| + | Finally, compile the file ('' | ||
| + | |||
| + | |||
| + | |||
| + | ===== Loading the world ===== | ||
| + | |||
| + | Now let's try to load our robot also into the Bullet world. | ||
| + | We will spawn the floor, the robot, and a couple of household objects. | ||
| + | |||
| + | For that, we | ||
| + | - load the bullet reasoning package in the REPL | ||
| + | - start a ROS node | ||
| + | - spawn the robot and the floor | ||
| + | - spawn a big box for a table and a couple of household objects to go on top | ||
| + | |||
| + | <code lisp> | ||
| + | ;; step 1 | ||
| + | (asdf: | ||
| + | (in-package :btr) | ||
| + | |||
| + | ;; step 2 | ||
| + | (roslisp: | ||
| + | |||
| + | ;; step 3 | ||
| + | (let ((robot-urdf (cl-urdf: | ||
| + | (prolog | ||
| + | `(and | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | : | ||
| + | : | ||
| + | | ||
| + | |||
| + | ;; step 4 | ||
| + | (prolog | ||
| + | `(and | ||
| + | | ||
| + | | ||
| + | :size (0.7 1.5 1) :mass 10.0)) | ||
| + | | ||
| + | :mesh :pot)) | ||
| + | | ||
| + | :mesh :mug)) | ||
| + | | ||
| + | :mesh :mug)))) | ||
| + | </ | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | |||
| + | ===== Reasoning with Boxy ===== | ||
| + | |||
| + | Let's try some reasoning: | ||
| + | |||
| + | <code lisp> | ||
| + | BTR> (prolog ' | ||
| + | NIL | ||
| + | </ | ||
| + | |||
| + | The query asks if the object '' | ||
| + | The answer is " | ||
| + | Now let's put the object higher and try again: | ||
| + | |||
| + | <code lisp> | ||
| + | BTR> (prolog ' | ||
| + | | ||
| + | | ||
| + | BTR> (prolog ' | ||
| + | (((?WORLD . #< | ||
| + | (?ROBOT . CRAM-BOXY-KNOWLEDGE:: | ||
| + | . # | ||
| + | </ | ||
| + | |||
| + | Now it is visible. | ||
| + | |||
| + | Let's put the pot down: | ||
| + | |||
| + | <code lisp> | ||
| + | BTR> (simulate *current-bullet-world* 50) | ||
| + | </ | ||
| + | |||
| + | Now let's do something more complex: let's generate a visibility costmap, that will generate poses from where Boxy will be able to see the pot. | ||
| + | As we're going to be using costmaps, we will need to define costmap metadata first: | ||
| + | |||
| + | <code lisp> | ||
| + | BTR> (def-fact-group costmap-metadata () | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | We should also load the '' | ||
| + | <code lisp> | ||
| + | BTR> (asdf: | ||
| + | </ | ||
| + | |||
| + | Now let's create a location designator for a pose to see the '' | ||
| + | |||
| + | <code lisp> | ||
| + | BTR> (let ((location-to-see (desig: | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | {{ : | ||
| + | |||

