Introduction: Give Yourself a (Robotic) Hand
In this Instructable, we see how to design, 3D-Print and test components of a Robotic Hand.
If you like any part of this project, please vote for it and then email the link to everybody you know!
I enjoy writing programs. I love building things. I don't build robots for a living, but I do design them for fun and research.
My team and I are considering building a robot for the DARPA Robotics Challenge. And today, we're looking at hands.
We need a realistic, reasonably priced robotic hand platform to test some ideas with. When I shopped around, I found a lot of really good models that I didn't have the budget for yet. I wanted to see what could be designed using mostly 3D printed parts. I'm happy to share our experiences with you here.
For this hand design, we want to be able to try lots of different types of servos, tendons, sensors, and control software. I'm choosing to design the palm and fingers separately in an interchangeable and modular way, so the design can evolve with the project.
In this Instructable, I'll be focusing on the design and build of the fingers. I'll spend a little time showing the palm design and talk briefly about the plan for tendons and servos. The design was made using mostly OpenSCAD, and we debug some of the control systems in V-Rep in a later instructable.
If you are already familiar with OpenSCAD, you can skip ahead.
If you like, you can jump directly to the printed fingers.
Let's get started!...
Step 1: The Tools to Get You Started...
The Tools Used:
Brain (I had one that I wasn’t using for anything else at the time...)
Some paper and a pen
My own hand (I had one handy)
Digital calipers $9-$20 from Harbor Freight
Computer (Linux, Mac, or Windows)
The Software Used:
OpenSCAD Programmatic 3D Modelling Program
http://www.openscad.org/
MiniMagics STL File viewer
http://software.materialise.com/minimagics
STL View by ModuleWorks
(Search the Android Marketplace)
3D Printing Service Used:
EngATech.com (ask for Tim)
How to Make it REAL:
While you are waiting for your download of OpenSCAD to finish, place your hand on a sheet of paper and trace the outline of your hand on the paper with the pen. (Starts out easy, right?)
I placed a dot on the tracing at each location I thought I’d want a hinge or joint of some kind; at each knuckle of each finger and the thumb. Afterwards, I used the digital calipers to measure (in millimeters) and make notes on the drawing of things like the width of each finger at the location of each joint.
I also measured the distance between joints, the overall length and breadth of the palm and wrist. Taking measurements from the paper tracing turned out to be much simpler than measuring with the calipers directly from my hand. I was able to measure more carefully, and got better results, I think.
Step 2: Quick Tutorial on OpenSCAD
If you're not already familiar with it, OpenSCAD is a free Constructive Solid Geometry (CSG) “programming” tool.
I think of it as “solids coding” because it is much more like writing and compiling a program than working with a modelling program like Blender or SolidWorks. You build your design from a few basic shapes and combining operations. See the openscad.org website for a tutorial. I'll only cover some of the basics here.
You can get pretty creative with the OpenSCAD syntax. For example, this set of twelve cylinders arranged like a 3D tic-tac-toe will be used later on to subtract pass-thru channels in each finger segment for routing tendon and sensor wires.
This shape is made using four OpenSCAD statements in one line of code.
Nice.
Here are a few short examples of OpenSCAD commands that we will be using in this project.
Commands: sphere() translate() and cylinder()
Step 3: Starting With the Joints
I started really small, the first joint of the tip of the index finger, and I tried to keep it as simple as possible.
I imagined a joint that only rotated around one axis, was a fixed width, and that I could attach other segments of the finger to when I got to that point.
It involved a little sketching on paper, and lot of trial and error coding the sketch in OpenSCAD; but that’s the point: quick and dirty, code-and-see, lots of low-cost iterations before any materials get committed to reality.
This design refers to this as a pinJoint. The main feature is the horizontal pin that joins the two lateral end caps. It passes through a tubular barrel section (shown here as translucent gray). The barrel intersects with two support wings that are made from a hollow elliptical cone that has been split along the main axis. OpenSCAD is useful at this kind of construction.
In the second image, I've used a few special formatting flags to make some of the subtractive shapes visible in transparent red and I've colored the hollow elliptical cone blue by prefixing it's shape statement with the command color("blue"). This is also a handy debugging trick that doesn't generally affect the final output..
The transparent red coloring is done by placing a '#' character just before a shape statement. It is a handy debugging tool worth remembering and using often.
You can also temporarily turn off the rendering of a shape statement with the '*' character without having to delete or comment-out an entire statement (which could run for several lines).
Step 4: Finger Segments
After the first rolling joint, came the finger segments. That's the part that connects between two finger joints.
I tried several styles: rectangular, cylindrical, solid, and hollow. After a while, I realized that if I got too carried away, OpenSCAD bogged down on the complexity, and it took longer for me to see the results of my changes.
So, I learned to keep it simple and change something called the “faceting number” ($fn) to lower the complexity and speed up rendering while designing. When you are ready to build an STL file for printing, you’ll want to raise the $fn value as high as practical on your computer to generate smooth surfaces and improve the look of your printed parts.
I eventually settled on a finger segment that uses two special commands in OpenSCAD. They are hull() and difference()
The hull() command let me design a closed surface by specifying just the two front and back ellipsoids (distal and proximal ends) of a finger segment and let OpenSCAD “wrap” a surface around them.
To make that segment hollow, I took the exact same hull shape, scaled it down by 8%, and used the smaller hull as a “negative stamp” to subtract away the interior of the larger hull. You can do this (and much, much, more) with the difference() command. The pattern goes like this: difference(){hull();scale()hull();}
This pattern is so useful that you’ll see it several times throughout the design. The first image shows a sequence of operations that build a hollow finger segment. The second image shows three segments of a typical finger.
Also, in these pictures you can see that I've told OpenSCAD to subtract the wire vias that were discussed earlier.
Step 5: A Complete Finger
Positioning the joints and segments so that they partially overlap is the way to make them into a single part, when printed.
In fact, I learned that the particular printer used to make my parts will only leave parts separate if you intentionally design a 0.3mm gap between them.
That minimum gap distance varies by the type of printer used, and it is good to know before your first print. Be sure to ask about the minimum spacing for movement whenever you print your designs.
The joint that is closest to the palm is a different design. It is intended to insert and snap into the large spherical joints at the base of each finger. It has a split peg with retaining nibs at the proximal end that will hold it in place and also prevent rotation or "finger-roll".
Step 6: Palm and Access Panel
Once you have a working design for a finger, you can copy it or turn it into a reusable module that can create all four fingers.
OpenSCAD supports a module command that lets you define a named shape that can accept input parameters. These parameters allow you to control specific details, while repeating a generic shape pattern.
With a little extra code, you can use things like true/false flags to control whether you want a three-segment finger, or a two-segment thumb. (rendering a hand with five thumbs is left to the reader as an exercise)
The design of the palm requires our friendly hull() command.
Basically, the idea is to place small parts of the overall shape of the palm at the corners and proximal surfaces that we want, and then use hull() to calculate the minimum surface that encloses all of those shapes.
We use two spheres, one at each corner of the palm near the wrist; and four discs (thin cylinders, actually). You might notice that this is the same difference(){hull();scale()hull();} pattern that we used for the finger segments. If you did, give yourself a hand......
To prepare for the thumb’s clamJoint and the four sphereJoints of the fingers, we include five spheres in the subtractions clause of the palm’s difference() command. That is similar to what you’d do if you used a ball mill and carved out a spherical opening in the physical part.
I won’t go into the design of the clamJoint and sphereJoints in much detail here. Basically they are just spheres that are captured by either two hemisperes or a ring, respectively. The sphereJoint is a bit more complex internally because I want to limit how much it can allow a finger to pitch, yaw, and roll. For a finger, a little pitch and yaw are expected; but I want almost no roll.
To create the access panel of the palm, I coded the shape of the panel using something called the minkowski() command to create a rectangular panel with rounded corners out of a cube() statement and a cylinder() statement. The positive shape of the panel includes a retaining tab underneath the leading edge and a living hinge on the trailing edge.
I was really happy when I found out that the positive shape design of the access panel could be “re-used” to subtract the panel opening from the main body of the palm. It even allowed me to subtract undercuts from the leading edge of the palm opening that help hold the leading edge in place once the panel is inserted.
Step 7: Poses and Gestures
Without any commands to the contrary, all shape statements in OpenSCAD are assumed to be relative to the common origin [0,0,0] and orientation [0,0,0]. To temporarily relocate the origin and orientation, we have to use the rotate() and translate() commands.
I decided that I wanted to be able to pose and curl the joints of the thumb and each finger while rendering on screen so that I could see if the finger segments were going to allow me to bend each joint as much as I hoped to, up to about 85 to 95 degrees for each knuckle.
To position a sub-assembly relative to the origin, or relative to a parent assembly, you can use the rotate() and translate() commands. For the thumb and fingers, I treated each of their sphereJoints as a sub-assembly of the palm, which was the top-level parent object.
As each sphereJoint was moved and oriented separately with a pair of rotate() and translate() commands, the corresponding thumb or finger was drawn as a sub-assembly of that sphereJoint.
As each segment of a finger is drawn, it is rotated relative to the preceding joint. The net result is that an entirely unique posture of the hand can be encoded in a few variables that describe the rotation angles of the various joints.
In a fully assembled hand, the actual motions that would be available would be controlled by the servos chosen and the tendons threaded through the fingers. The poses are just another debugging tool to test what the full range of motion might be in a printed model.
NOTE: Especially when separately printing the palm, I would suggest to use a pose that has little or no deflection of the sphereJoints so that you maintain the minimum separation gap (0.3mm) to allow free movement of the printed parts.
Finally!! Its time to email (part of) the design of to the Service Bureau for printing........
Step 8: Printing and Reviewing the Results
After you have tinkered, tested and refined your design, it’s time to export it to a format that most 3D Printing systems can work with. OpenSCAD can produce the STL (stereolithography) format of your design, but you first have to use the Compile and Render (F6) command.
Normal design compiling is done with the Compile (F5) command and takes additional time with each program code change that you make. The F6 command takes even longer, but it generates the data that OpenSCAD requires to export the design as an STL formatted file.
Remember the $fn variable? During design, we set $fn to a low value (about 15 to 20) to speed up design rendering cycles.
But now that we want output that is as smooth as possible, we have to increase $fn to a higher number. If you don’t, the printed part might have big, chunky facets that not only look awful, but might even freeze or bind your sliding and rolling parts in place because of unplanned intersections in the geometry.
My computer rarely lets me use anything above $fn=89; on this particular design.
After Compiling and Rendering with F6 create the STL file by choosing Menu > Design > Export as STL
After you export to an STL file its time to load it into a viewer to see how it looks.
Before you email or upload your STL file to have it printed, you should load it in a program like MiniMAGICS for analysis. What you are looking for is a property called water-tightness.
If your design has poorly aligned geometry that leaves gaps in what should be solid surfaces, it won’t be water-tight and the 3D Printer will usually refuse to attempt to print it. It’s easy to test if a model is water-tight with a program like MiniMAGICS, and it’s a time-saver if you can fix any problems before you send your design out for printing.
The Big Reveal. How did the 3D Printed Fingers turn out?
The thing that impressed me the most is that these fingers came out of the printer fully functional in one piece with no assembly required. No extra fasteners, no press fittings, no snap fittings. They rotated exactly as planned and all the wire vias were clean and clear of any support material.
Nice.
Step 9: Tendon Rigging and Demonstration
So, after I got the printed thumb and two fingers from EngATech, it was time to test them out with some simple tendons and look for possible improvements.
Any type of enameled metallic wire might seem to be a good candidate for a tendon, but it really isn’t. Not only is it difficult to thread in, around, and through the fingers; it works poorly as a tendon due to the friction of the enamel coating and the tendency of metal wire to retain deformities, kinks, and curves.
Dental floss is a bit more slippery, but not as strong. It is even harder to thread through the wire vias and around the pin joints of the knuckles. Rubber bands and belts have too much give and not enough strength. I was exhausting all of my options for things I had on-hand.
A trip to the local hobby shop at the mall RemoteControlHobbies.com brought a solid tip from the proprietor: SpiderWire. (Or in my case, Sufix 832 - white)
This stuff works the best so far. It is eight-stranded woven polyethylene fiber sold as fishing line at most sports and outdoor stores. The low contact surface area of the braiding against the pin joint improves the already low friction of the polyethelene. Filaments are commonly available in tensile strengths nominally rated up to 80 lbs. That should be plenty strong for that testing that I have in mind.
That concludes this Instructable. It was a lot of fun "Making it REAL".
I hope that if you've enjoyed any part of it, you'll vote for it in the "Make IT REAL" Challenge and then tell everyone you know about it.