Next we will calibrate the robot so that it can map between image coordinates and world coordinates. This process takes several steps. Calibration data is stored in the directory ‘default/config_<your robot’s serial>’. There is one file with robot-specific parameters such as table height, and a separate directory for each camera.

Make a magic circle

First, print out about 10 pages of magic paper. Send the gripper to the home position by running goHome. (If you would like to change the home position, follow these instructions.) Then drive down to close to the table height using zDown. Create a magic circle underneath the gripper as depicted here:

Magic Circle

The goal is for the magic circle to fill the wrist camera’s field of view as the arm moves up. The magic paper contains a superposition of three plane waves at different orientations and colors. It is textured at every point, allowing the robot to set its calibration parameters by making known movements.

Set the table height

Ein assumes there is a planar horizontal table and stores the height of this table for use in various calculations and motions. It can set the table height using the robot’s range sensor. To set the table height, first goHome, then use zDown to move the arm so that the IR sensor is approximately 10cm from the table. (The short grippers should be a centimeter or two above the table.) Run setTable to use the IR sensor to set the table height. You should see the console print information about the process; it takes multiple readings and waits for them to stablize. At the end it will print the table height. The numbers should be changing slightly, and the final delta should be small.

Set the camera parameters

Baxter’s wrist camera uses automatic adjustment of gain, exposure, and color settings. However these automatic adjustments prevent our system from reliably detecting objects it has previously seen. Our solution is to set them once to good values and fix them. To set these parameters, start with this command:

80 25 1124 1024 2048 fixCameraLighting

The parameters are: <gain> <exposure> <red> <green> <blue> fixCameraLighting

First tune the gain, then the exposure, and then adjust the color if necessary. You can set it to the automatic parameters with fixCameraLightingToAutomaticParameters. This word will set the camera to automatic control, then fix the parameters to the automatically adjusted values. You can observe these values with the variables cameraGain, cameraExposure, cameraWhiteBalanceRed, cameraWhiteBalanceGreen, cameraWhiteBalanceBlue.

To save these settings to disk (so they will be loaded automatically every time Ein starts), run:

saveCalibration

An example of a reasonably well adjusted (slightly yellow) wrist view image of magic paper is here:

Wrist View

Set the gripper mask

Ein needs to know the location of the grippers in its wrist camera image in order to ignore those pixels when mapping its tabletop environment. To set the gripper mask run setGripperMaskWithMotion. View the progress in the window “Object Viewer.” At the beginning the window will be blue; as it moves, high-variance parts of the averaged image are considered not part of the gripper mask; low variance parts are considered as part of the mask. You should see something like what appears below:

Gripper Mask 1 Gripper Mask 2 Gripper Mask 3

Verify that the blue region completely covers the grippers when they are open, and that there is no extra blue areas remaining. If this does not work, recenter the gripper (goHome) and try again. You may need to rearrange the magic circle or adjust the lighting or colors on your camera. When the mask looks good, you can stop the process by running clearStacks. It saves after every iteration.

The gripper will move to four different heights and take a series of measurements at different orientations. This process takes about 20 minutes to complete. Because Ein is single threaded, the gui will periodically freeze while it is running the inference; this freezing does not mean it is broken. If it fails you may have to run it again; in that case restart Ein or run loadCalibration to reload your old calibration (which, while not perfect, is a reasonable initialization). When you obtain a good calibration (described below), save it by running saveCalibration.

Set the hand/camera offset

To check the hand/camera offset, drive the gripper so it is just above the table. Place a marker (e.g., a small washer) exactly in the center of the gripper. The red and green reticles should be exactly in the center of the washer, but they are probably not. Run setDefaultHandCameraOffset to load a reasonable set of default values. Then run handCameraOffset print to print the “createEEPose” command. Copy this command to the repl and run something like:

0.014 0.007 0.015890 0.000000 0.000000 0.000000 1.000000 createEEPose setHandCameraOffset

to adjust the hand camera offset. The reticles should update immediately. Adjust the x and y terms (the first two numbers) until the reticle is directly above the marker. Then run 1 changeToHeight and do it at height 1 (the most common scanning height. Ideally it should be adjusted the same for all heights, but if the camera is not mounted perfectly perpendicularly, it will be different. In that case you will need to set a quaternion. In the future we plan to make an automatic calibration process for this term.

Check the calibration

To check the calibration, you need to learn more about the wrist view. We have included a legend showing the various reticles and markers below.

Rendered Wrist View

Exercise: Explore the movement state.

Move the arm with large and small movements. Observe the movement state indicator; watch as it changes from moving to hovering to stopped. You can try large movements by double clicking in the Object Map Viewer; this action sends the arm to the corresponding position.

Exercise: Check the calibration.

To check the calibration, verify that the gripper projection line appears as shown in the above legend. It should be a relatively straight line, no zig-zags or curves. It should also not be absent. If there is a problem, rearrange the magic circle and try the calibration again. Do not hesitate to post an issue if you have problems.

Second, find the calibration reticle, drawn in red and green near the gripper projection line. Drive the arm so that the calibration reticle is above a well-distinguished point in the image. In the sequence below, we did this so the crosshairs were above the penny. Then run saveRegister1 to save this location. It will create a new reticle drawn at this point in global space. Then drive the arm around in the neighborhood and verify this reticle appears in the same space. Be sure to check movements in all axes (x, y, and z), as sometimes a calibration will work well in one dimension and not others. Some example images are shown below, using a penny as a marker.

This calibration is somewhat imperfect; the reticle stays inside the penny but ideally it would be centered inside the penny, perfectly picking out the global location in the image.

Rendered Wrist View Calibrated 1 Rendered Wrist View Calibrated 2
Rendered Wrist View Calibrated 3 Rendered Wrist View Calibrated 4

Here is a bad calibration, where the gripper calibration line is absent: Rendered Wrist View with Null Calibration

Here is bad calibration where it goes in the opposite direction: Rendered Wrist View with Backwards Calibration