Fractal branching ultra-dexterous robots (Bush robots) #
NASA ACRP Quarterly Report, May 1998, Hans Moravec
NASA
ADVANCED CONCEPTS RESEARCH PROJECTS
PR-Number 10-86888 Appropriation: 806/70110
CMU Cooperative Agreement NCC7-7
Quarterly Report
for
March 1, 1998 - May 31, 1998
Fractal branching ultra-dexterous robots
(Bush robots)
Hans Moravec
Carnegie Mellon University
Robotics Institute
5000 Forbes Avenue
Pittsburgh, PA 15213
USA
May 25, 1998
Table of Contents
Summary 3
Section 1: Abandonment of Mechanical Prototype 4
Section 2: Fabrication of Structural Models 6
Section 3: Simulations 8
Appendix: Open Inventor animation files 13
[Copyrighted image removed March 6, 2001 at the request of Mark Rosheim.
Note added March 17, 2003: Though multi-axis mechanical joints may be unsuitable for
conceptual fractal bush robots, they have proven themselves in practical
applications that require rapid complex motion, in robots and otherwise,
notably in antenna dish pointing systems for mobile
platforms like swaying ships. See
images from Ross-Hime web site
]
Building single joints of this kind
is at the limit of the robotics art, yet this joint does not have the
strength nor the easy scalability to be cascaded into a bush robot
structure. Even if many problems were solved, it seems new techniques
would be necessary to build such joints at sub-centimeter scales.
The present efforts in micro-electro-mechanical systems present an
interesting future possibility for the small fingers of a bush robot.
At present these techniques are confined to the surfaces of chips, and
the structures they build no bigger than a few millimeters. But
perhaps, someday, MEMS techniques will evolve into something that can
construct working meter-scale integrated electromechanical systems
with micron-scale features. MEMS integrated-circuit-like techniques
are probably the best route to early construction of a working bush
robot prototype, but they are not yet ready to take on the task.
2: Fabrication of Structural Models
We cannot build a mechanical model, but there are techniques that
will allow us to make static sculptures of bush robots.
We will work on this in the next quarter. The most convenient avenue
seems to be a ten-year-old prototyping method called
stereolithography. Stereolithography is a three-dimensional printing
process that produces a solid plastic model. A computer-controlled
ultraviolet laser draws cross sections of the model onto the surface
of photo-curable liquid plastic, hardening it. A vertical elevator
system lowers the newly formed layer, while a leveling system
establishes the thickness of the next layer. Successive cross
sections, each of which adheres to the one below it, are built one
layer on top of another to form the part from the bottom up.
We have two stereolithography machines located near us, and old,
neglected one in a Carnegie-Mellon lab, and a better-maintained newer
model at a local company. The working volume of the first is a cube
10cm on a side, the second is a 20cm cube, both have a resolution of
0.25mm. The costs of fabricating a 10cm object can range from a few
hundred to a few thousand dollars, primarily determined by the
fabrication time. A large, detailed model can consume several weeks
of stereolithography machine time. The process has various
limitations, for instance partially fabricated objects must be
self-supporting at all stages. The software controlling the machine
automatically inserts struts as needed for temporary scaffolding,
which must be manually removed on completion. The myriad floating
fingers of an awkwardly posed, partially fabricated bush robot could
require an unwieldy number of struts, so we will have to plan the
poses carefully. Following is a picture of the SLA-350 20cm
stereolithography machine.

3: Simulations
The most accessible modeling technique we have is simulation. We
have used 3D graphics on desktop Silicon Graphics machines to produce
static images of 10-level, three-way branching bush robots, composed
of about 90,000 branches. On our fastest machine, it took five hours
for the program to sort the data structure for those images, and
several minutes to render each view. Weve determined that we
can obtain smooth real-time animation of 5-level bushes, and slightly
jerky animation of 6-level bushes. Enclosed with this report is a VHS
tape containing 30 minutes of animation of four simple bush robot
scenarios that were chosen for ease of implementation, in that they
involve regular oscillations of the branch angles that can be encoded
directly into the animation file. In the next quarter we will deliver
animations of more elaborate behaviors computed by the same off-line
program that configured the robot for the static images. We
anticipate the program will need to run for several hours to compute
these elaborate animations. For now we have simple motions.
Scenario 1 is a 6-level B=3 D=2 bush oscillating
between a left- and right-handed version of the surface-filling
fractal arrangement that can be seen more clearly in the static
images. Because the present animation simply moves the branch angles
in a regular way, the folded bush takes on a rough-surface shape
strongly resembling a vegetable sprig, rather than the deliberate
smooth surfaces of the static images! Between the formation of the
fractal interleaves, the robot undergoes fractal bunching, to keep the
branchlets as far away from each other as possible.
Scenario 2 is a 5-level twig of the above bush, doing the same dance
more smoothly, but with 1/3 the number of branches.
Scenario 3 shows a 6-level bush oscillating its branches at
incommensurate rates, but with the oscillation periods at different
levels proportional to the scale of the level. Thus the small
branches wag faster than the large ones, as would be natural if all
levels of actuation had equal power density.
Scenario 4 is a 5-level twig giving a smoother but reduced rendition
of scenario 3.
We will attempt to capture some of the animations as short Quicktime
movies for the next period. Difficulties prevented us from providing
movies in digital form this time. Here are some stills from the
videotape sequences:
Scenario 1: Left-/Right-handed fractal fill oscillation




Scenario 3: Unsynchronized oscillations



#Inventor V2.0 ascii
# Left-/Right-handed fractal fill oscillation
BaseColor{ rgb 1 .85 .45 }
# Make whichChild 8 for 6-level bush, 7 for 5-level twig
Switch { whichChild 8
DEF SPRIG-0 # Expensive cylindrical branch, with spherical end cap
Separator {
Separator {
Transform { translation 0 -1 0 }
Transform{ scaleFactor .1 1 .1}
Cylinder{}
}
Transform { scaleFactor .1 .1 .1 }
Sphere{}
}
DEF SPRIG-0b # Cheap hexagonal branch, with triangular open ends
Separator {
Coordinate3 {
point [ 0.15 -2.0 0.0, # 0
0.075 0.0 0.13, # 4
-0.075 -2.0 0.13, # 1
-0.15 0.0 0.0, # 3
-0.075 -2.0 -0.13, # 2
0.075 0.0 -0.13, # 5
0.15 -2.0 0.0, # 0
0.075 0.0 0.13, # 4
]
}
TriangleStripSet {}
}
DEF SPRIG-0c # Cheaper quadrilateral branch, with knife edges
Separator {
Coordinate3 {
point [ .15 -2 0, # 0
0 0 .15, # 1
-.15 -2 0, # 2
0 0 -.15, # 3
.15 -2 0, # 0
0 0 .15, # 1
]
}
TriangleStripSet {}
}
DEF SPRIG-1
Separator {
USE SPRIG-0c
Pendulum { rotation0 0 1 0 1.57 rotation1 0 1 0 -1.57 speed .07 }
Separator {
Pendulum { rotation0 0 0 1 .6 rotation1 0 0 1 .3 speed .14 } # Branch A
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-0c
}
Separator {
Pendulum { rotation0 .866 0 -.5 .6 rotation1 .866 0 -.5 .3 speed .14 } # Branch B
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-0c
}
Separator {
Pendulum { rotation0 -.866 0 -.5 .6 rotation1 -.866 0 -.5 .3 speed .14 } # Branch C
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-0c
}
}
DEF SPRIG-2
Separator {
USE SPRIG-0b
Pendulum { rotation0 0 1 0 1.57 rotation1 0 1 0 -1.57 speed .07 }
Separator {
Pendulum { rotation0 0 0 1 .5 rotation1 0 0 1 .4 speed .14 } # Branch A
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-1
}
Separator {
Pendulum { rotation0 .866 0 -.5 .5 rotation1 .866 0 -.5 .4 speed .14 } # Branch B
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-1
}
Separator {
Pendulum { rotation0 -.866 0 -.5 .5 rotation1 -.866 0 -.5 .4 speed .14 } # Branch C
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-1
}
}
DEF SPRIG-3
Separator {
USE SPRIG-0b
Pendulum { rotation0 0 1 0 1.57 rotation1 0 1 0 -1.57 speed .07 }
Separator {
Pendulum { rotation0 0 0 1 .4 rotation1 0 0 1 .5 speed .14 } # Branch A
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-2
}
Separator {
Pendulum { rotation0 .866 0 -.5 .4 rotation1 .866 0 -.5 .5 speed .14 } # Branch B
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-2
}
Separator {
Pendulum { rotation0 -.866 0 -.5 .4 rotation1 -.866 0 -.5 .5 speed .14 } # Branch C
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-2
}
}
DEF SPRIG-4
Separator {
USE SPRIG-0
Pendulum { rotation0 0 1 0 1.57 rotation1 0 1 0 -1.57 speed .07 }
Separator {
Pendulum { rotation0 0 0 1 .3 rotation1 0 0 1 .6 speed .14 } # Branch A
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-3
}
Separator {
Pendulum { rotation0 .866 0 -.5 .3 rotation1 .866 0 -.5 .6 speed .14 } # Branch B
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-3
}
Separator {
Pendulum { rotation0 -.866 0 -.5 .3 rotation1 -.866 0 -.5 .6 speed .14 } # Branch C
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-3
}
}
DEF SPRIG-5
Separator {
USE SPRIG-0
Pendulum { rotation0 0 1 0 1.57 rotation1 0 1 0 -1.57 speed .07 }
Separator {
Pendulum { rotation0 0 0 1 .2 rotation1 0 0 1 .7 speed .14 } # Branch A
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-4
}
Separator {
Pendulum { rotation0 .866 0 -.5 .2 rotation1 .866 0 -.5 .7 speed .14 } # Branch B
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-4
}
Separator {
Pendulum { rotation0 -.866 0 -.5 .2 rotation1 -.866 0 -.5 .7 speed .14 } # Branch C
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-4
}
}
DEF SPRIG-6
Separator {
BaseColor{ rgb .85 1 .45 }
Separator {
Transform {scaleFactor .1 .1 .1}
Sphere {}
}
Pendulum { rotation0 0 1 0 1.57 rotation1 0 1 0 -1.57 speed 0 }
Separator {
Pendulum { rotation0 0 0 1 .1 rotation1 0 0 1 .8 speed .14 } # Branch A
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-5
}
Separator {
Pendulum { rotation0 .866 0 -.5 .1 rotation1 .866 0 -.5 .8 speed .14 } # Branch B
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-5
}
Separator {
Pendulum { rotation0 -.866 0 -.5 .1 rotation1 -.866 0 -.5 .8 speed .14 } # Branch C
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-5
}
}
}
#Inventor V2.0 ascii
# Bush robot with levels in uncorrelated oscillation
BaseColor{ rgb 1 .85 .45 }
# Make whichChild 8 for 6-level bush, 7 for 5-level twig
Switch { whichChild 8
DEF SPRIG-0 # Classy cylindrical branch
Separator {
Separator {
Transform { translation 0 -1 0 }
Transform{ scaleFactor .1 1 .1}
Cylinder{}
}
Transform { scaleFactor .1 .1 .1 }
Sphere{}
}
DEF SPRIG-0b # Cheap hexagonal branch
Separator {
Coordinate3 {
point [ 0.15 -2.0 0.0, # 0
0.075 0.0 0.13, # 4
-0.075 -2.0 0.13, # 1
-0.15 0.0 0.0, # 3
-0.075 -2.0 -0.13, # 2
0.075 0.0 -0.13, # 5
0.15 -2.0 0.0, # 0
0.075 0.0 0.13, # 4
]
}
TriangleStripSet {}
}
DEF SPRIG-0c # Cheaper quadrilateral branch, with knife edges
Separator {
Coordinate3 {
point [ .15 -2 0, # 0
0 0 .15, # 1
-.15 -2 0, # 2
0 0 -.15, # 3
.15 -2 0, # 0
0 0 .15, # 1
]
}
TriangleStripSet {}
}
DEF SPRIG-1
Separator {
USE SPRIG-0c
Separator {
Pendulum { rotation0 0 0 1 .3 rotation1 0 0 2.1 .95 speed .57 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-0c
}
Separator {
Pendulum { rotation0 1 0 0 .4 rotation1 1 0 0 1.9 speed .88 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-0c
}
Separator {
Pendulum { rotation0 -1 0 -1 .6 rotation1 -1 0 -1 1.3 speed 1.23 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-0c
}
}
DEF SPRIG-2
Separator {
USE SPRIG-0b
Separator {
Pendulum { rotation0 0 0 1 .3 rotation1 0 0 2.1 .95 speed .32 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-1
}
Separator {
Pendulum { rotation0 1 0 0 .4 rotation1 1 0 0 1.9 speed .29 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-1
}
Separator {
Pendulum { rotation0 -1 0 -1 .6 rotation1 -1 0 -1 1.3 speed .71 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-1
}
}
DEF SPRIG-3
Separator {
USE SPRIG-0b
Separator {
Pendulum { rotation0 0 0 1 .3 rotation1 0 0 2.1 .95 speed .19 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-2
}
Separator {
Pendulum { rotation0 1 0 0 .4 rotation1 1 0 0 1.9 speed .29 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-2
}
Separator {
Pendulum { rotation0 -1 0 -1 .6 rotation1 -1 0 -1 1.3 speed .41 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-2
}
}
DEF SPRIG-4
Separator {
USE SPRIG-0
Separator {
Pendulum { rotation0 0 0 1 .3 rotation1 0 0 2.1 .95 speed .11 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-3
}
Separator {
Pendulum { rotation0 1 0 0 .4 rotation1 1 0 0 1.9 speed .17 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-3
}
Separator {
Pendulum { rotation0 -1 0 -1 .6 rotation1 -1 0 -1 1.3 speed .24 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-3
}
}
DEF SPRIG-5
Separator {
USE SPRIG-0
Separator {
Pendulum { rotation0 0 0 1 .3 rotation1 0 0 2.1 .95 speed .06 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-4
}
Separator {
Pendulum { rotation0 1 0 0 .4 rotation1 1 0 0 1.9 speed .1 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-4
}
Separator {
Pendulum { rotation0 -1 0 -1 .6 rotation1 -1 0 -1 1.3 speed .14 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-4
}
}
DEF SPRIG-6
Separator {
BaseColor{ rgb .85 1 .45 }
Separator {
Transform {scaleFactor .1 .1 .1}
Sphere {}
}
Separator {
Pendulum { rotation0 0 0 1 .3 rotation1 0 0 2.1 .95 speed .035 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-5
}
Separator {
Pendulum { rotation0 1 0 0 .4 rotation1 1 0 0 1.9 speed .05 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-5
}
Separator {
Pendulum { rotation0 -1 0 -1 .6 rotation1 -1 0 -1 1.3 speed .08 }
Transform { scaleFactor 0.577 0.577 0.577 }
Transform { translation 0 2 0 }
USE SPRIG-5
}
}
}