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






Summary





This is the sixth quarterly report for “Fractal branching ultra-dexterous robots.”

In this quarter we abandoned our effort to build a mechanical prototype of a bush robot as premature and extremely unlikely to succeed. Machines of bush-robot complexity await automated construction methods, perhaps scaled up relatives of the integrated-circuit techniques being used now to construct modest micro-electro-mechanical devices. We redirected our efforts to presently feasible simulations, and stereolithographic construction of a static bush robot solid model. The report includes a videotape of animations showing two simple bush robot behaviors.

1: Abandonment of Mechanical Prototype

We have spent several months investigating alternative approaches to building a working model bush robot, including some test prototyping. The result of this investigation is a decision to abandon further effort towards a mechanical prototype for now. We have concluded that such an effort has almost no chance of succeeding with present resources, not only in our project, but in the larger technological sphere. The idea becomes plausible once automated micromechanical construction allows complex three-dimensional mechanisms to be automatically “printed” from digital descriptions.

It is presently possible to generate simulations of complex mechanisms from digital descriptions. In the last decade it has also become possible to automatically generate complex static physical 3D objects from such descriptions, in a solid printing process called stereolithography, among other techniques. We plan to direct our prototyping efforts to those channels.

In our abortive investigation of mechanical implementations of bush robots within the scope of our modest resources, we had investigated structures actuated by hobby remote-control servos. These were easy to use and interface, but too bulky and heavy to use in three dimensional joints. Secondarily, they were also available only in an approximately 4:1 size range. We then looked at joints actuated by shape-memory wire, which promised very compact actuation and and almost unlimited scalability. A two-dimensional test joint was easy to build, and it was possible to use more complicated variants of the 2D approach to build 3D joints. However, experiments with a test joint convinced us that our simple approach would result in unreliable and damage prone mechanisms. For instance, it was easy to overstretch and destroy the actuating wires by applying modest external forces. Also, the electrical connections to the many actuating wires of the upper twigs of a bush would begin to impede the lower branches after only two or three levels of branching. These, and many other problems, convinced us that to avoid further time-consuming effort to construct a working prototype. We had very little chance of succeeding. Related efforts illustrate the difficulty.

Many years and millions of dollars have been expended in designing two- and three-axis joints for conventional robot arms. To this day, they are expensive, complex, heavy, problematic, and little used. An example is the Rosheim design illustrated below, of which there are several prototypes:


[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. We’ve 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





















Appendix


Open Inventor
Bush Animation Files


Inventor file for oscillation between left- and right-handed 2D fractal fill pattern: level 6 bush
Inventor file for oscillation between left- and right-handed 2D fractal fill pattern: level 5 twig
Inventor file for uncoordinated oscillation, with rate being size dependent: level 6 bush
Inventor file for uncoordinated oscillation, with rate being size dependent: level 5 twig


#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
    }
  }

}