16
INSTITUTO TECNOLOGICO SUPERIOR DE TEZIUTLAN Nombre: Márquez Patiño José Adrián Materia: Robótica Docente: Mario Eduardo Aguilar Ortha Carrera: Ing. Mecatornica Semestre: 8vo Semestre Control de Velocidad

Metodos Para Resolver Cinematica Inversa

Embed Size (px)

Citation preview

Page 1: Metodos Para Resolver Cinematica Inversa

INSTITUTO TECNOLOGICO SUPERIOR DE TEZIUTLAN

Nombre: Márquez Patiño José Adrián

Materia: Robótica

Docente: Mario Eduardo Aguilar Ortha

Carrera: Ing. Mecatornica

Semestre: 8vo Semestre

Control de Velocidad

Page 2: Metodos Para Resolver Cinematica Inversa

Índice

Resolución del problema cinematico inverso por métodos geométricos. .............................................. 3

Resolución del problema cinematico directo mediante uso de cuaternios. .......................................... 4

Desacoplo cinematico. ...................................................................................................................................... 6

Resolución del problema cinematico inverso a partir de la matriz de transformación homogénea. ............................................................................................................................................................................... 9

Teoría de Tornillos .......................................................................................................................................... 13

Referencias ...................................................................................................................................................... 16

Page 3: Metodos Para Resolver Cinematica Inversa

Resolución del problema cinematico inverso por métodos geométricos.

Como se ha indicado, este procedimiento es adecuado para robots de pocos grados de libertad o para el

caso de que se consideren solo los primeros grados de libertad, dedicados a posicionar el extremo.

El procedimiento en si se basa en encontrar suficiente numero de relaciones geométricas en las que

intervendrán las coordenadas del extremo del robot, sus coordenadas articulares y las dimensiones

físicas de sus elementos.

Para mostrar el procedimiento a seguir se va a aplicar el método a la resolución del problema cinematico

inverso de un robot con 3 grados de libertad de rotación (estructura típica articular). El dato de partida

son las coordenadas (Px, Py, Pz) referidas a (S0) en las que se requiere posicionar su extremo.

Como se ve este robot posee una estructura planar, quedando este plano definido por el ángulo de la

primera variable articular q1.

El valor de q1 se obtiene inmediatamente como:

q1 = arctg ( Py / Px )

Considerando ahora únicamente los dos elementos 2 y 3 que están situados en un plano y utilizando el

teorema del coseno, se tendrá:

r² = ( Px )² + ( Py )²

r² + ( Px )² = ( I2 )² + ( I3 )² + 2( I2 )( I3 )cosq3

cosq3 = ( Px )² + ( Py )² + ( Pz )² - ( I2 )² - ( I3 )² / 2( I2 )( I3 )

Esta expresión permite obtener q1 en función del vector de posición del extremo P. No obstante, por

motivos de ventajas computacionales, es más conveniente utilizar la expresión de la arco tangente en

lugar del arco seno.

Puesto que:

sen q3 = ± ( 1 - cos²q3 )½

Se tendrá que:

q3 = arctg ( ± ( 1 - cos²q3 )½ / cosq3 )

cosq3 = ( Px )² + ( Py )² + ( Pz )² - ( I2 )² - ( I3 )² / 2( I2 )( I3 )

Como se ve, existen dos posibles soluciones para q3 según se tome el signo positivo o negativo de la raíz.

Estas corresponden a las configuraciones de codo arriba y codo abajo del robot.

Page 4: Metodos Para Resolver Cinematica Inversa

El calculo de q2 se hace a partir de la diferencia entre ß y :

q2 = ß -

Siendo:

ß = arctg ( Pz / r ) = arctg ( Pz / ± ( ( px )² + ( Py )² )½ )

= arctg ( I3 senq3 / I2 + I3 cosq3 )

Luego finalmente:

q2 = arctg ( Pz / ± ( ( px )² + ( Py )² )½ ) - arctg ( I3 senq3 / I2 + I3 cosq3)

De nuevo los dos posibles valores según la elección del signo dan lugar a dos valores diferentes de q2

correspondientes a las configuraciones codo arriba y abajo.

Resolución del problema cinematico directo mediante uso de cuaternios.

Puesto que las matrices de transformación homogénea y los cuaternios son los métodos alternativos para

representar transformaciones de rotación y desplazamiento, será posible utilizar estos últimos de

manera equivalente a las matrices para la resolución del problema cinematico directo de un robot.

Para aclarar el uso de los cuaternios con ese fin, se van a utilizar a continuación para resolver el problema

cinematico directo de un robot tipo SCARA cuya estructura se representa en la figura.

El procedimiento a seguir será el de obtener la expresión que permite conocer las coordenadas de

posición y orientación del sistema de referencia asociado al extremo del robot (S4) con respecto al

Page 5: Metodos Para Resolver Cinematica Inversa

sistema de referencia asociado a la base (S0). Esta relación será función de las magnitudes I1, I2, y I3,

de los elementos del robot así como de las coordenadas articulares q1, q2, q3 y q4.

Para obtener la relación entre (S0) y (S4) se ira convirtiendo sucesivamente (S0) en (S1), (S2), (S3) y

(S4) según la siguiente serie de transformaciones:

1. Desplazamiento de (S0) una distancia I1 a lo largo del eje Z0 y giro un ángulo q1 alrededor del eje

Z0, llegándose a (S1).

2. Desplazamiento de (S1) una distancia I2 a lo largo del eje X1 y giro un ángulo q2 alrededor del

nuevo eje Z, para llegar al sistema (S2).

3. Desplazamiento alo largo del eje X2 una distancia I3 para llegar al sistema (S3).

4. Desplazamiento de (S3) una distancia q3 a lo largo del eje Z3 y un giro en torno a Z4 de un ángulo

q4, llegándose finalmente a (S4).

De manera abreviada las sucesivas transformaciones quedan representadas por:

S0 ---> S1: T( z,I1 ) Rot( z,q1 )

S1 ---> S2: T( x,I2 ) Rot( z,q2 )

S2 ---> S3: T( x,I3 ) Rot ( z,0 )

S3 ---> S4: T( z,-q3 ) Rot( z,q4 )

Donde los desplazamientos quedan definidos por los vectores:

p1 = ( 0,0,1 )

p2 = ( I2,0,0 )

p3 = ( I3,0,0 )

p4 = ( 0,0,-q3 )

Y los giros de los cuaternios:

Q1 = ( ^C1, 0, 0, ^S1 )

Page 6: Metodos Para Resolver Cinematica Inversa

Q2 = ( ^C2, 0, 0, ^S2 )

Q3 = ( 1, 0, 0, 0 )

Q4 = ( ^C4, 0, 0, ^S4 )

Donde:

^C1 = cos ( q1/2 )

^S1 = sen ( q1/2 )

Lo que indica que el extremo del robot referido al sistema de su base (S0), esta posicionado en:

x = a0x = I3 cos( q1 + q2 ) + I2 cosq1

y = a0y = I3 sen( q1 + q2 ) + I2 senq1

z = a0z = I1 -q3

Y esta girando respecto al sistema de la base con un ángulo q1 + q2 +q4 según a la rotación entorno al eje

z:

Rot( z, q1+q2+q4 )

Las expresiones anteriores permiten conocer la localización del extremo del robot referidas al sistema

de la base en función de las coordenadas articulares (q1, q2, q3, q4), correspondiendo por tanto a la

solución del problema cinematico directo.

Desacoplo cinematico.

Los procedimientos vistos en los apartados anteriores permiten obtener los valores de las 3 primeras

variables articulares del robot, aquellas que posicionan su extremo en las coordenadas (Px, Py, Pz)

determinadas, aunque pueden ser igualmente utilizadas para la obtención de las 6 a costa de una mayor

complejidad.

Ahora bien, como es sabido, en general no basta con posicionar el extremo del robot en un punto del

espacio, sino que casi siempre es preciso también conseguir que la herramienta que aquel porta se oriente

de una manera determinada. Para ello, los robots cuentan con otros tres grados de libertad adicionales,

situados al final de la cadena cinemática y cuyos ejes, generalmente, se cortan en un punto, que

informalmente se denomina muñeca del robot.

Si bien la variación de estos tres últimos grados de libertad origina un cambio en la posición final del

extremo real del robot, su verdadero objetivo es poder orientar la herramienta del robot libremente en

el espacio.

El método de desacoplo cinematico saca partido de este hecho, separando ambos problemas: Posición y

orientación. Para ello, dada una posición y orientación final deseadas, establece las coordenadas del punto

de corte de los 3 últimos ejes (muñeca del robot) calculándose los valores de las tres primeras variables

Page 7: Metodos Para Resolver Cinematica Inversa

articulares (q1, q2, q3) que consiguen posicionar este punto. A continuación, a partir de los datos de

orientación y de los ya calculados (q1, q2, q3) obtiene los valores del resto de las variables articulares.

Parámetros DH del robot de la figura.

Articulación d a

1 Ø1 I1 0 -90°

2 Ø2 0 I2 0

3 Ø3 0 0 90°

4 Ø4 I3 0 -90°

5 Ø5 0 0 90°

6 Ø6 I4 0 0

En la figura se representa un robot que reúne las citadas características, con indicación de los sistemas

de coordenadas asociados según el procedimiento de Denavit-Hartemberg, cuyos parámetros se pueden

observar en la tabla.

El punto central de la muñeca del robot corresponde al origen del sistema (S5): O5. Por su parte, el punto

final del robot será el origen del sistema (S6): O6.

Enseguida se utilizaran los vectores:

Pm = O0__O5

Pr = O0__O6

Que van desde el origen del sistema asociado a la base del robot (S0)hasta los puntos centro de la

Page 8: Metodos Para Resolver Cinematica Inversa

muñeca y fin del robot, respectivamente.

puesto que la dirección del eje Z6 debe coincidir con la de Z5 y la distancia entre O5 y O6 medida a lo

largo de Z5 es precisamente d4 = I4, se tendrá que:

Pr = ( Px, Py, Pz ) (exp)T

El director Z6 es el vector A correspondiente a la orientación deseada Z6 = ( Ax, Ay, Az ) (exp) T e I4

es un parámetro asociado con el robot. Por lo tanto, las coordenadas del punto central de la muñeca (

Pmx, Pmy, Pmz ) son fácilmente obtenibles.

Es posible, mediante un método geométrico, por ejemplo, calcular los valores de ( q1, q2, q3 ) que

consiguen posicionar el robot en el Pm deseado.

Quedan ahora obtener los valores de q4, q5, y q6 que consiguen la orientación deseada. Para ello

denominando 0R6 a la submatriz de rotación de 0T6 se tendrá:

0R6 = ( n o a ) = 0R3( 3R6 )

Donde 0R6 es conocida por la orientación deseada del extremo del robot, y 0R3 definida por:

0R3 = 0A1 ( 1A2 ) ( 2A3 )

También lo será a partir de los valores ya obtenidos de q1, q2 y q3. Por lo tanto:

3R6 = ( Rij ) = ( 1 / 0R3 ) ( 0R6 ) = ( 0R )(exp)T ( n o a )

Tendrá sus componentes numéricas conocidas.

Por otra parte, 3R6 corresponde a una submatriz (3X3)de rotación de la matriz de transformación

homogénea 3T6 que relaciona el sistema (S3) con el (S6), por lo tanto:

3R6 = 3R4 ( 4R5 )( 5R6 )

Donde i-1Ri es la submatriz de rotación de la matriz de Denavit-Hartemberg i-1Ai, cuyos valores son:

3R4 4R5 5R6

C4 0 -S4 C5 0 S5 C6 -S6 0

S4 0 C4 S5 0 -C5 S6 C6 0

0 -1 0 0 1 0 0 0 1

Luego se tiene que:

3R6 =

C4C5C6-S4S6 -C4C5S6-S4C6 C4S5

S4C5C6 + C4S6 -S4C5S6 + C4C6 -S4C5

-S5C6 S5S6 C5

Donde Rij, será por valores numéricos conocidos:

Page 9: Metodos Para Resolver Cinematica Inversa

Rij =

C4C5C6-S4S6 -C4C5S6-S4C6 C4S5

S4C5C6 + C4S6 -S4C5S6 + C4C6 -S4C5

-S5C6 S5S6 C5

De estas nueve relaciones expresadas se puede tomar las correspondientes a R13, R23, R33, R31, R32:

R13 = C4S5

R23 = -S4C5

R33 = C5

R31 = -S5C6

R32 = S5S6

Del conjunto de ecuaciones es inmediato obtener los parámetros articulares:

q4 = arcsen ( R23 / R33 )

q5 = arccos ( R33 )

q6 = arctg ( -R32 / R31 )

Estas expresiones y teniendo en cuenta que las posiciones de cero son distintas, constituyen la solución

completa del problema cinematico inverso del robot articular.

Resolución del problema cinematico inverso a partir de la matriz de transformación homogénea.

En principio es posible tratar de obtener el modelo cinematico inverso de un robot a partir del

conocimiento de su modelo directo. Es decir, suponiendo conocidas las relaciones que expresan el valor de

la posición y orientación del extremo del robot en función de sus coordenadas articulares, obtener por

manipulación de aquellas las relaciones inversas.

Sin embargo, en la practica esta tarea no es trivial siendo en muchas ocasiones tan compleja que obliga a

desecharla. Además, puesto que el problema cinematico directo, resuelto a través de Tij contiene en el

caso de un robot de 6 grados de libertad 12 ecuaciones, y se busca solo 6 relaciones (una por cada grado

de libertad), existirá, necesariamente ciertas dependencias entre las 12 expresiones de partida con lo

cual la elección de las ecuaciones debe hacerse con sumo cuidado.

Se va a aplicar este procedimiento al robot de 3 grados de libertad de configuración esférica (2 giros y

un desplazamiento) mostrado en la figura. El robot queda siempre contenido en un plano determinado por

el ángulo q1.

Page 10: Metodos Para Resolver Cinematica Inversa

El primer paso a dar para resolver el problema cinematico inverso es obtener Tij correspondiente a este

robot. Es decir, obtener la matriz T que relaciona el sistema de referencia (S0) asociado a la base con el

sistema de referencia (S3) asociado a su extremo.

La siguiente figura muestra la asignación de sistemas de referencia según los criterios de DH con el

robot situado en su posición de partida (q1 = q2 = 0), y la tabla muestra los valores de los parámetros de

DH.

A partir de estos es inmediato obtener las matrices A y la matriz T.

Obtenida la expresión de T en función de las coordenadas articulares (q1, q2, q3), y supuesta una

localización de destino para el extremo del robot definida por los vectores n, o, a y p se podría intentar

manipular directamente las 12 ecuaciones resultantes de T a fin de despejar q1, q2, y q3 en función de n,

o, a y p.

Parámetros DH del robot polar de 3 GDL.

Articulación d a

1 q1 I1 0 90°

2 q2 0 0 -90°

3 0 q3 0 0

Page 11: Metodos Para Resolver Cinematica Inversa

Sin embargo, este procedimiento directo es complicado, apareciendo ecuaciones trascendentes. En lugar

de ello, suele ser más adecuado aplicar el siguiente procedimiento:

Puesto que T = 0A1 ( 1A2 )( 2A3 ), se tendrá que:

( 1 / 0A1 ) T = 1A2( 2A3 )

( 1 / 1A2 ) ( 1 / 0A1 ) T = 2A3

Puesto que:

T =

n o a p

0 0 0 1

Es conocida, los miembros a la izquierda en las expresiones anteriores, son función de las variables

articulares (qk+1,...,qn).

De modo, que la primera de las expresiones se tendrá q1 aislado del resto de las variables articulares y

tal vez será posible obtener su valor sin la complejidad que se tendría abordando directamente la

manipulación de la expresión T. A su vez, una vez obtenida q1, la segunda expresión anterior (2A3),

permitirá tener el valor de q2 aislado respecto de q3. Por ultimo, conocidos q1 y q2 se podrá obtener q3

de la expresión T sin excesiva dificultad.

Para poder aplicar este procedimiento, es necesario en primer lugar obtener las inversas de las matrices,

i-1Ai. Esto es sencillo si se considera que la inversa de una matriz viene dada por:

inversa

Page 12: Metodos Para Resolver Cinematica Inversa

nx ox ax Px

ny oy ay Py

nz oz az Pz

0 0 0 1

=

nx ox ax -n(exp)T(P)

ny oy ay -o(exp)T(P)

nz oz az -a(exp)T(P)

0 0 0 1

1 / ( 0A1 )

inversa

C1 0 S1 0

S1 0 -C1 0

0 1 0 I1

0 0 0 1

=

C1 S1 0 0

0 0 1 -I1

S1 -C1 0 0

0 0 0 1

1 / ( 1A2 )

inversa

C2 0 -S2 0

S2 0 C2 0

0 -1 0 0

0 0 0 1

=

C2 S2 0 0

0 0 -1 0

-S2 C2 0 0

0 0 0 1

1 / ( 2A3 )

inversa

1 0 0 0

0 1 0 0

0 0 1 q3

0 0 0 1

=

1 0 0 0

0 1 0 0

0 0 1 -q3

0 0 0 1

Por lo tanto, utilizando la primera de las ecuaciones definidas al principio del tema, se tiene que:

( 1 / 0A1 ) 0T3 = 1A3 (

2A3 ) =

C2 0 -S2 -S2q3

S2 0 C2 C2q3

0 -1 0 0

0 0 0 1

De las 12 relaciones establecidas en la ecuación anterior, interesan aquellas que expresan q1 en función

de constantes. Así por ejemplo se tiene:

S1 ( Px ) - C1 ( Py ) = 0

tan( q1 ) = ( Py / Px )

Page 13: Metodos Para Resolver Cinematica Inversa

q1 =arctg ( Py / Px )

Se tiene finalmente:

q2 = arctg( ( ( Px )² + ( Py )² )½ / ( I1 – Pz ))

q3 = C2 ( Pz - I1 ) - S2 ( ( Px )² + ( Py )² )½

Las expresiones anteriores corresponden a la solución del problema cinematico inverso del robot

considerado.

A los mismos resultados se podría haber llegado mediante consideraciones geométricas.

Teoría de Tornillos

Un tornillo infinitesimal, $, es un vector de seis dimensiones que consta de una

componente primaria, una componente dual, D($) = sO , dado por

P($) = s , y

⎡ s ⎤

$ = ⎢ ⎥ ,

⎣sO ⎦

donde s es un vector unitario a lo largo del eje instantáneo del tornillo mientras que sO es el momento

producido por

el vector

s

de acuerdo a un vector rO / P , el cual inicia en un punto P del eje instantáneo de tornillo y

termina en el

punto de referencia O . El par momento se determina como

donde

sO = hs + s × rO / P ,

h es el paso del tornillo. El álgebra de Lie, e(3), puede considerarse como el álgebra de

los elementos

infinitesimales del grupo Euclídeo, E(3), y es isomórfica al álgebra de tornillos, frecuentemente

denominada álgebra de motores, en la que se satisfacen las siguientes operaciones.

Sean

$1 = (s1 , sO1 )

,

$1 = (s2 , sO

2 )

y $1 = (s3 , sO3

)

elementos del álgebra de Lie e(3) y sea

además

λ ∈ R .

Entonces

Adición,

$1 + $2 = (s1 + s2 , sO1 + sO 2 ) .

Multiplicación por un escalar,

λ$1 = (λs1 , λsO1 ) .

Page 14: Metodos Para Resolver Cinematica Inversa

1 2

Producto de Lie,

s × s ⎤

[$1 $2 ] = ⎢ ⎢ .

⎣s1 × sO 2 − s2 × sO1 ⎦

De esta manera, el álgebra de Lie, e(3), es un álgebra no conmutativa, no asociativa que satisface la

identidad de Jacobi. Más aún, es posible definir dos formas simétricas bilineales o productos internos.

La forma de Killing,

La forma de Klein,

Ki : e(3) × e(3) → Ki($1 ,$2 ) = s1 • s2

KL : e(3) × e(3) → KL($1 ,$2 ) = s1 • sO 2 + s2 • sO1

donde × y •

denotan, respectivamente, al producto cruz y al producto interno del álgebra vectorial

convencional de

tres dimensiones.

Suponga que un cuerpo rígido posee una velocidad angular ω y que un punto O , fijo al mismo, posee una

velocidad

vO ambos vectores referidos con respecto a otro cuerpo o sistema de referencia. Puesto que con

ambos vectores es

posible determinar la velocidad de cualquier punto del cuerpo rígido, entonces es totalmente razonable

definir al estado de velocidad, V , del cuerpo rígido como un vector de seis dimensiones de la siguiente

manera

⎡ ⎤

V = ⎢ ω ⎢ . (1)

⎢⎣vO

⎢⎦

La velocidad angular ω se conoce como la componente primaria mientras que la

velocidad vO

se conoce como la

componente dual. Más aún, a principios del siglo

XX Ball (1900) definió al estado de velocidad

como el giro sobre un tornillo, esto es

V = ω $ . (2)

Suponga ahora que el cuerpo rígido posee una

aceleración angular α y que el punto O posee

una aceleración aO .

Brand (1947) definió el estado de aceleración

reducida o simplemente, por brevedad,

acelerador de un cuerpo rígido,

AR , como un vector de seis dimensiones dado por

⎡ α

AR = ⎢ ⎢

Page 15: Metodos Para Resolver Cinematica Inversa

$

0 A = ∑

⎢ , (3)

⎢⎣aO − ω × vO ⎢⎦

donde, α es la componente primaria mientras que la composición aO − ω

× vO

es la componente dual.. Nótese

que

en las expresiones (1) y (3) las componentes primarias no dependen de ningún punto en particular y por lo

tanto pueden

considerarse propiedades de los cuerpos rígidos. Al contrario, las componentes duales dependen del

punto O de

referencia. Más aún, la componente primaria del acelerador se obtiene de manera directa a partir de la

componente primaria del estado de velocidad, esto es

α = d

ω .

dt Por su parte la deducción de la componente dual del acelerador, a partir del estado de velocidad, es más

elusiva. Este

procedimiento se aclara si se toma en cuenta que tanto el estado de velocidad como el de aceleración

reducida son vectores de seis dimensiones que satisfacen las condiciones de un campo vectorial

helicoidal, para detalles consulte Gallardo y Rico (1998).

En un manipulador serie el estado de velocidad del órgano terminal, cuerpo m , con respecto al eslabón

base, cuerpo 0 , puede establecerse en términos de los tornillos infinitesimales asociados a los pares

cinemáticos y las velocidades

relativas, ω , como

0V m

m−1

= ∑

i=0

i ω i+1 i $

i+1 . (4)

Por su parte el estado de aceleración reducida del órgano terminal, en términos de tornillos infinitesimales,

vendrá dado

por

m−1 m

R

i=

i α i+1 i

$i+1 + $ L , (5)

0

donde, el tornillo de Lie, $L , se determina a partir de los resultados del análisis de velocidad como

m−2

$L = ∑

i=0

⎢ i ωi+1

i

$i+1

m−1

j =i+1

j ω j +1

j

j +1 ⎤

. (6)

Las expresiones (4) y (5) son las ecuaciones fundamentales que permiten resolver el análisis cinemático

de manipuladores serie y pueden extenderse sin esfuerzo considerable a los análisis de velocidad y de

aceleración de cadenas cinemáticas cerradas y por supuesto a los manipuladores paralelos. Para

información más detallada de dichas expresiones se sugiere consulte Rico y Duffy (1996).

Page 16: Metodos Para Resolver Cinematica Inversa

Referencias

Innocenti, C., “Forward kinematics in polynomial form of the general Stewart platform", Proc. 1998 ASME Design

Engineering Technical Conference, CD-ROM, Paper DETC98/MECH-5894.

Ku, D.-M., “Forward kinematic analysis of a 6-3 type Stewart platform mechanism", IMechE Part K Journal of Multibody

Dynamics, Vol. 214, No. K4, pp. 233-241.

. Merlet, J.-P., Parallel Robots, Kluwer Academic Publishers, 1999.

Merlet, J.-P., “Direct kinematics of parallel manipulators", IEEE transactions on Robotics and Automation, Vol. 9, No. 6,

1993, pp. 842-846.

Raghavan, M., “The Stewart platform of general geometry has 40 configurations", ASME Journal of Mechanical Design,

Vol. 115, No. 2, 1993, pp. 277-282.

Rico, J.M. y Duffy, J., “An application of screw algebra to the acceleration analysis of aerial chains", Mechanism and

Machine Theory, Vol. 31, No. 4, 1996, pp. 445-457.

Rico, J.M. y Duffy, J., “Forward and inverse acceleration analyses of in-parallel manipulators", ASME Journal of

Mechanical Design, Vol. 122, 2000, pp. 299-303.

. St-Onge, B.M. y Gosselin, C., “Singularity analysis and representation of the general Gough-Stewart platform", Int. J.

Robotics Research, Vol. 19, No. 3, 2000, pp. 271-288.

16. Tsai, L.W., Enumeration of Kinematic Structures According to Function, CRC Press, 2001.