-
Notifications
You must be signed in to change notification settings - Fork 112
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Best approach to calibrate kinematic parameters #96
Comments
Yes, this setup should work. Basically you'd add a fixed joint in your URDF between the camera and the robot arm's root link.
Your setup is pretty standard for this package, you might be interested to check out the Fetch calibration: https://github.com/fetchrobotics/fetch_ros/tree/melodic-devel/fetch_calibration/config - basically your files will be pretty similar to capture_checkerboards.yaml and calibrate.yaml, namely the things added there are:
I should also mention I wrote a blog post last year which includes links to a ROSCON talk on this, as well as an (unaccepted for ICRA) paper on how the system works: https://www.robotandchisel.com/2020/04/09/robot-calibration-for-ros/ |
Thanks! One more question-- The checkerboard will be mounted on the end effector. How does I thought part of the answer is |
Given this setup:
I'm guessing it automatically finds a frame named |
Let's talk about the checkerboard frame first: "checkerboard" is a made up frame (since it does not exist in the URDF). The name of this frame can actually be set using a ROS parameter in the checkerboard finder.The "checkerboard" frame is then connected to the end of the arm (the "frame" of the "chain" - which in MoveIt/KDL terms is actually called the "tip" of the "chain"). Which arm to connect to is specified by the "chain_sensor_name" parameter (similarly, the "camera_sensor_name" can be used to specify from which camera to grab images). Next, the "free_frames_initial_values" should really be thought of as "free_frames_initial_offsets" - as these are basically the offsets added to any particular frame transformation. In the case of "checkerboard", since it is virtual there is no other initial offset. For other frames in the robot, there is usually an offset specified for the joint/link in the URDF. In either case, these offsets are in the frame of the parent link - effectively, this specifies the transformation from "wrist_roll_link" (or whichever frame is the "tip" of your manipulator) to "checkerboard" (the origin of the checkerboard). And finally, one word of warning: you have pitch and yaw as free parameters, and roll as not a free parameter. This does not work as noted in the README: "Roll, pitch and yaw can also be set free, however it is important to note that because calibration internally uses an angle-axis representation, either all 3 should be set free, or only one should be free. You should never set two out of three to be free parameters." Gritty Details Of What Is Actually Happening: When the checkerboard finder detects a checkerboard it creates two observations - the first is the 3d pose of the checkerboard points in the camera frame, the second is the ideal poses in the checkerboard frame (based on the X/Y size and known size of the checkerboard squares) in this "checkerboard" frame. By making the transform that connects the checkerboard frame to the wrist end effector a free parameter, we can optimize that transform at the same time we optimize the rest of the robot free parameters until the reproduction of the points through the head camera+kinematics most closely matches the reproduction of the ideal checkerboard through the arm kinematics. |
I'm going to reopen this until I transcribe some of the information into the README |
I'm interested in calibrating the kinematic parameters of a manipulator.
The best way I can think of to do this is:
Can you help me confirm this setup would be correct then?
Chains: the MoveIt planning group with 6 robot joints
Features: checkerboard finder
Models: kinematic chain of the manipulator.
Frame
is the planning frame of this planning group, I suppose?Free params: 6 joints of the robot
Free frames: none since we're assuming camera transform is perfectly known
Error blocks: camera3d_to_arm
The text was updated successfully, but these errors were encountered: