Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
1.1 ESTRUCTURA DEL PROYECTO
i
Simulación y Control
de un Exoesqueleto
Robótico
Grado en Ingeniería Robótica
Trabajo Fin de Grado
Autora:
Sheila Sánchez Rodríguez
Tutor/es:
Jorge Pomares Baeza
Junio 2021
Simulación y Control de un Exoesqueleto
Robótico
Autora
Sheila Sánchez Rodríguez
Tutor
Jorge Pomares Baeza
Grado en Ingeniería Robótica
ALICANTE, Junio 2021
i
Resumen
En este proyecto, se ha partido del exoesqueleto de Project MARCH para realizar una
serie de mejoras en lo que se refiere al diseño y el control, de forma que sus capacidades de
movimiento sean lo más semejantes posible a la marcha humana.
En el primer lugar se ha llevado a cabo un estudio de los diferentes marcos teóricos que
impulsan este proyecto. Se hacen notable las ventajas de utilizar la robótica de rehabilitación,
se citan los distintos dispositivos de rehabilitación existentes y se realiza un estudio sobre
distintos exoesqueletos vestibles de miembro inferior, mostrando sus características físicas
y técnicas.
Después, se explica en qué consiste la marcha humana, destacando las alteraciones a las
que se puede enfrentar tras sufrir un accidente. Para finalizar este apartado, se mostrará el
marco teórico del control de robots, explicando qué son la cinemática y la dinámica de un
robot, se diferencia el análisis cinemático del análisis dinámico y se hace una distinción entre
los distintos tipos de control dinámico.
Una vez terminado el marco teórico, se formulará toda la metodología sobre sistemas de
control que supone la base de este proyecto, realizando una introducción ROS_Control,
detallando los componentes de un controlador creado en ROS, así como la interconexión de
los mismos y el mecanismo que sigue para su ejecución, ya que supone la base para el
desarrollo del proyecto.
ii
A continuación, tiene lugar el modelado del exoesqueleto, desde su diseño hasta su
análisis cinemático, su simulación, un análisis del patrón de marcha y una mejora del mismo.
De igual forma, se examina su comportamiento ante distintos obstáculos y terrenos varios,
procediendo a adaptar los patrones de marcha para hacerles frente.
Finalmente, identifica el tipo de control que realiza, se llevan a cabo una serie de mejoras
en el controlador con el objetivo de reducir el error obtenido en la ejecución de la marcha y
se expondrá de forma analítica los pasos seguidos para obtener valores que reduzcan el error.
iii
Preámbulo: Motivación, justificación y objetivo
general
Siempre he considerado que la robótica es una ciencia que debe orientarse a la mejora de
la calidad de vida de los seres vivos. La robótica médica de rehabilitación, ha sido desde un
principio mi principal campo de interés, ya que siempre lo he considerado una forma directa
de prestar servicio a personas que, por diversas circunstancias, no pueden realizar tareas tan
simples para el ser humano como coger un objeto o caminar. Mediante la robótica de
rehabilitación, es posible brindarles la oportunidad de adquirir las capacidades motoras
necesarias para poder vivir en las mejores condiciones posibles.
Por otro lado, a lo largo de la carrera diversas asignaturas han creado un gran nivel de
interés en mí, como pueden ser el modelado de robots, la ingeniería de control o el control
de robots. Fue cuando cursé esta última, que me puse en contacto con el tutor para establecer
un proyecto en el cual podría unificar mis principales puntos de interés realizando un
modelado, simulación y control de un exoesqueleto robótico.
Tras una investigación inicial, se dio con el grupo Project MARCH, el cual se encarga
cada año de añadir mejoras a su exoesqueleto robótico de miembro inferior. Pude ponerme
en contacto directo con su equipo, el cual me proporcionó una serie de herramientas iniciales
para poder trabajar con su exoesqueleto.
Desgraciadamente, no fue posible probar las mejoras realizadas en el exoesqueleto real,
pero sí se compartió el trabajo realizado con Project MARCH, quienes estuvieron
enormemente agradecidos.
v
Agradecimientos
En primer lugar, quisiera agradecer a los profesores que forman parte del grupo de
investigación Human Robotics, haciendo especial mención a Jorge, Carlos y Andrés, por
permitirme adentrarme en el campo de la robótica que tanto me apasiona, por depositar su
confianza en mí y por proporcionarme sus conocimientos en el sector. Quisiera agradecerles
por brindarme tantas oportunidades, acogerme en el grupo y ser profesionales tan humildes.
En segundo lugar, agradecer enormemente a mi pareja y amigos, quienes han sido un
apoyo fundamental durante estos cuatro años, han estado ahí para levantarme, animarme y
hacerme más fuerte frente a todas las adversidades que he ido encontrando por el camino.
Quisiera hacer una mención especial a mis amigos de la carrera, Carmen, Carlos, Adrián,
Ramón y Víctor, quienes me han ayudado en todo momento de dificultad y han logrado que
este tiempo haya sido una de las mejores experiencias de mi vida que nunca olvidaré. El
mayor regalo que me llevo de la universidad, sois vosotros.
En último lugar, y más importante, quisiera agradecer a mi familia su apoyo incondicional
y su confianza depositada en mí. Porque siempre habéis apostado por mí, porque sin vosotros
no habría llegado a donde estoy hoy, porque me habéis hecho fuerte. Siempre estaré ahí para
vosotros, al igual que lo habéis estado siempre para mí, cada vez que el mundo se me venía
encima. Gracias papá, por enseñarme a tener fe y no perder nunca la esperanza. Gracias
mamá, por convertirme en la mujer luchadora que soy. Gracias a ti también Nerea, por
quererme por encima de todo, espero haber sido un buen referente para ti y espero que
llegues muy lejos.
vii
A mis padres y mi hermana, quienes
me han convertido en todo lo que soy.
Sin su apoyo, amor y comprensión nada
de esto hubiera sido posible.
ix
No te conformes con el mundo que has heredado.
Nunca se ha resuelto un desafío
sin personas que pensasen diferente.
Tim Cook.
Índice general
1. Introducción .......................................................................................................... 1
1.1 Estructura del proyecto ............................................................................................... 3
2. Estado del arte ....................................................................................................... 7
2.1 ¿Por qué usar robots en rehabilitación? ...................................................................... 7
2.2 Dispositivos robóticos de rehabilitación ..................................................................... 9
2.3 Exoesqueletos vestibles de miembro inferior ........................................................... 13
2.4 La marcha humana .................................................................................................... 18
2.4.1 Alteraciones de la marcha humana tras sufrir un accidente ....................................... 20
2.5 Control de robots ...................................................................................................... 21
2.5.1 Cinemática y control cinemático ................................................................................ 21
2.6.2 Dinámica y control dinámico ..................................................................................... 24
3. Objetivos .............................................................................................................. 27
4. Metodología ......................................................................................................... 29
4.1 Control dinámico multiarticular ................................................................................ 29
4.2 Controladores de posición multiarticulares .............................................................. 30
4.2.1 Control PD .................................................................................................................. 31
4.2.2 Control PID ................................................................................................................ 35
4.3 ROS_Control ............................................................................................................ 37
4.3.1 Funcionamiento de los controladores en ROS............................................................ 40
5. Desarrollo ............................................................................................................ 43
5.1 Modelado del exoesqueleto ...................................................................................... 44
5.2 Análisis cinemático .................................................................................................. 52
5.3 Modificación del patrón de marcha .......................................................................... 59
5.4 Introducción de obstáculos ....................................................................................... 66
5.5 Análisis del controlador ............................................................................................ 71
5.6 Modificaciones del controlador ................................................................................ 73
6. Pruebas y experimentación ...................................................................................... 81
6.1 Patrones de marcha ................................................................................................... 81
6.2 Modificación del controlador ................................................................................... 92
7. Conclusiones ............................................................................................................ 103
7.1 Trabajos futuros ...................................................................................................... 104
Bibliografía .................................................................................................................. 107
Lista de Acrónimos y Abreviaturas .......................................................................... 111
A. Anexo I: Código URDF del exoesqueleto creado ................................................ 113
B. Anexo II: Código de configuración de parámetros ............................................. 133
C. Anexo III: Código para establecer el patrón de marcha ................................... 135
Índice de figuras
Fig. 2.1: exoesqueleto anclado ........................................................................................ 11
Fig. 2.2: robot industrial de rehabilitación ...................................................................... 11
Fig. 2.3: dispositivo anclado de efector final .................................................................. 12
Fig. 2.4: exoesqueleto vestible ........................................................................................ 12
Fig. 2.5: exoesqueleto ReWalk ....................................................................................... 13
Fig. 2.6: exoesqueleto Rex .............................................................................................. 14
Fig. 2.7: exoesqueleto HAL ............................................................................................ 15
Fig. 2.8: exoesqueleto H3 ............................................................................................... 16
Fig. 2.9: exoesqueleto HANK ......................................................................................... 17
Fig. 2.10: exoesqueleto MARCH ................................................................................... 18
Fig. 2.11: fases de la marcha ........................................................................................... 19
Fig. 4.1: esquema básico de un controlador multiarticular ............................................. 31
Fig. 4.2: controlador PD de posición multiarticular ....................................................... 32
Fig. 4.3: controlador PID ................................................................................................ 36
Fig. 4.4: estructura de paquetes de ROS. http://wiki.ros.org/Books ............................... 38
Fig. 4.5: esquema interno de ROS_Control. http://wiki.ros.org/ros_control .................. 39
Fig. 5.1: exoesqueleto MARCH en Gazebo ................................................................... 44
Fig. 5.2: agarre del eslabón inferior del exoesqueleto a la pierna del paciente. ............. 47
Fig. 5.3: eslabones de la parte inferior de la pierna del exoesqueleto. ........................... 47
Fig. 5.4: relación padre-hijo de un fichero URDF .......................................................... 48
Fig. 5.5: exoesqueleto creado para la simulación en Gazebo. ........................................ 51
Fig. 5.6: nuevo exoesqueleto con diferentes longitudes de tibias .................................. 52
Fig. 5.7: modelado de una pierna ................................................................................... 53
Fig. 5.8: pasos 1 y 2 del algoritmo DH ........................................................................... 54
Fig. 5.9: pasos 3 y 4 algoritmo DH ................................................................................ 55
Fig. 5.10: pasos 5-7 algoritmo DH ................................................................................. 55
Fig. 5.11: pasos 8 y 9 algoritmo DH .............................................................................. 56
Fig. 5.12: interfaz rqt para mover el exoesqueleto. ........................................................ 61
Fig. 5.13: pie colisionando con el suelo ......................................................................... 61
Fig. 5.14: gráficas de variables articulares en el tiempo para Right_swing ................... 65
Fig. 5.15: simulación de escaleras .................................................................................. 66
Fig. 5.16: patrón subida de escalera con la pierna derecha ............................................ 67
Fig. 5.17: simulación de la rampa................................................................................... 68
Fig. 5.18: patrón subida de rampa con la pierna derecha ............................................... 68
Fig. 5.19: simulación en plano inclinado ........................................................................ 69
Fig. 5.20: patrón balanceo pierna izquierda en un plano inclinado ................................ 70
Fig. 5.21: exoesqueleto sentado en el banco .................................................................. 70
Fig. 5.22: patrón para sentarse ....................................................................................... 71
Fig. 5.23: diagrama de bloques de un control con realimentación. ................................ 73
Fig. 5.24: diagrama de bloques de un control PD de posición. ...................................... 75
Fig. 6.1: articulaciones hip_aa ejecutando el patrón walk. ............................................. 81
Fig. 6.2: articulaciones hip_fe para el patrón walk. ........................................................ 82
Fig. 6.3: articulaciones knee para el patrón walk. .......................................................... 82
Fig. 6.4: articulaciones ankle del patrón walk ................................................................ 83
Fig. 6.5: articulaciones hip_aa para el patrón stairs. ....................................................... 84
Fig. 6.6: articulaciones hip_fee durante el patrón stairs. ................................................ 84
Fig. 6.7: articulación knee para el patrón stairs .............................................................. 85
Fig. 6.8: articulación ankle para el patrón stairs. ............................................................ 85
Fig. 6.9: articulación hip_aa para el patrón ramp. .......................................................... 86
Fig. 6.10: articulación hip_fee para el patrón ramp. ....................................................... 86
Fig. 6.11: articulación knee para el patrón ramp. ........................................................... 87
Fig. 6.12: articulación ankle para el patrón ramp. .......................................................... 87
Fig. 6.13: articulación hip_aa para el patrón tilted_path ................................................ 88
Fig. 6.14: articulación hip_fe del patrón tilted_path. ...................................................... 89
Fig. 6.15: articulación knee para el patrón tilted_path ................................................... 89
Fig. 6.16: articulación ankle para el patrón tilted_path .................................................. 90
Fig. 6.17: articulación hip_aa para el patrón sit. ............................................................. 90
Fig. 6.18: articulación hip_fe para el patrón sit .............................................................. 91
Fig. 6.19: articulación knee para el patrón sit................................................................. 91
Fig. 6.20: articulación ankle del patrón sit ..................................................................... 92
Fig. 6.21: errores primera articulación de la cadera en el patrón walk. .......................... 94
Fig 6.22: errores segunda articulación de la cadera en el patrón walk ........................... 94
Fig. 6.23: errores articulación de la rodilla para el patrón walk. .................................... 95
Fig. 6.24: error articulación del tobillo para el patrón walk. .......................................... 95
Fig. 6.25: errores primera articulación de la cadera para el patrón stairs. ...................... 96
Fig. 6.26: error segunda articulación de la cadera para el patrón stairs. ........................ 97
Fig. 6.27: error articulación de la rodilla para el patrón stairs........................................ 97
Fig. 6.28: error articulación del tobillo para el patrón stairs. ......................................... 98
Fig. 6.29: error primera articulación de la cadera para el patrón sit. .............................. 99
Fig. 6.30: error segunda articulación de la cadera para el patrón sit. ............................. 99
Fig. 6.31: error articulación de la rodilla para el patrón sit. ......................................... 100
Fig. 6.32: error articulaciones del tobillo para el patrón sit .......................................... 100
Índice de tablas
Tabla 5.1. Parámetros Denavit Hartenberg ..................................................................... 57
Tabla 6.1: gancias para la articulación hip_aa ................................................................ 93
Tabla 6.2: gancias para la articulación hip_fe ................................................................ 93
Tabla 6.3: gancias para la articulación knee ................................................................... 93
Tabla 6.4: gancias para la articulación ankle .................................................................. 93
xiv
Índice de códigos
Código 5.1 March_simulation.launch ............................................................................. 45
Código 5.2. March.launch ............................................................................................... 46
Código 5.3 March_world.launch .................................................................................... 46
Código 5.4 Lower_leg link ............................................................................................. 49
Código 5.5 Support link .................................................................................................. 49
Código 5.6 Fixed joint .................................................................................................... 49
Código 5.7 Support inertia .............................................................................................. 50
Código 5.8 Lower_leg inertia ......................................................................................... 50
Código 5.9 Gazebo colours ............................................................................................. 51
Código 5.10 Ejemplo subgait .......................................................................................... 63
Código 5.11 Walk.gait .................................................................................................... 63
Código 5.12 Default.yaml ............................................................................................... 64
1
1. Introducción
La robótica es una ciencia o rama de la tecnología, que estudia el análisis, diseño,
construcción y aplicación de robots, los cuales, son capaces de desempeñar tareas realizadas
por el ser humano, principalmente laboriosas, repetitivas o peligrosas. Se apoya en diversas
ramas como son la mecánica, la electrónica, el control automático y los sistemas
computacionales. Entre 1960 y 1990 la robótica se centra en aplicaciones industriales,
buscando eficiencia, productividad, seguridad y costes. A partir de 1990, los robots se
extienden a todos los sectores, adquiriendo capacidades muy variadas y convirtiéndose en
sistemas más robustos.
La robótica de servicios surge de la aparición de nuevas necesidades tanto en el ámbito
personal, donde se encuentra la asistencia sanitaria, doméstica o en lugares públicos; como
en el ámbito profesional, en tareas de limpieza, mantenimiento, construcción o medicina. Un
robot de servicios es aquel que opera de forma semi o totalmente autónoma para
proporcionar servicios o tareas útiles para los seres humanos, excluyendo las operaciones de
automatización industrial.
En función de su tarea realizada, un robot de servicio se puede clasificar en robots de
servicio personal o de servicio profesional. Los primeros tienen un uso no comercial, están
orientados a la asistencia de personas y se diferencian en robots médicos, que se usan para
diagnosticar, tratar o rehabilitar pacientes y robots no médicos. Los segundos, son usados en
actividades comerciales y operados normalmente por una persona cualificada.
1. INTRODUCCIÓN
2
En función de su relación con el ser humano, un robot de servicio se puede clasificar en
robots de clase 1, que reemplazan a humanos en entornos sucios, peligrosos o en operaciones
tediosas; de clase 2, que operan cerca de los humanos para aliviar su incomodidad o
incrementar su confort; y robots de clase 3, que operan directamente con humanos.
Los robots de servicio se encuentran en continúa interacción con los seres humanos, por
lo que es importante modelar dicha interacción. Puede ser de tres tipos: física, remota o
social. La interacción remota es el tipo de interacción utilizada en robots de servicio de clase
1, puesto que trabajan en entornos donde el ser humano no puede o no quiere acceder, y su
campo principal de estudio es la teleoperación o telerobótica. En la interacción física, la
seguridad es uno de los factores más importantes, ya que implica un contacto directo de la
persona con el robot. Es el tipo de interacción utilizada en robots de servicio de clase 2 y
más comúnmente en robots de servicio de clase 3. Por último, la interacción social, es la
forma de interacción presente en la robótica humanoide, donde el usuario se relaciona de
forma afectiva, cognitiva y social con un robot. La disciplina principal que estudia el
comportamiento de los robots en relación a su interacción social con el humano se llama
robótica cognitiva, y es utilizada en robots de servicio de clase 2.
La robótica de rehabilitación es uno de los campos de mayor interés en la actualidad,
dentro de la robótica de servicios. Sirve de asistencia al trabajo de los fisioterapeutas
permitiéndoles desarrollar ejercicios de rehabilitación de mayor calidad. Por otro lado, les
otorga la capacidad de obtener un diagnóstico de lesiones con más precisión y controlar con
mayor exactitud la evolución de los pacientes. La rehabilitación y diagnosis de las
extremidades inferiores es muy frecuente y necesaria debido a la gran cantidad de accidentes
a los que están expuestas estas extremidades.
La pérdida de la función muscular puede ser causada por una enfermedad del músculo en
sí (miopatía), una enfermedad del área en la que se encuentran el músculo y el nervio (unión
neuromuscular) o una enfermedad del sistema nervioso. Este último caso puede darse por
daño a nervios (neuropatía), lesión de la médula espinal (mielopatía) o daño cerebral
(accidente cerebrovascular u otra lesión cerebral). Hoy en día, los accidentes
1 INTRODUCCIÓN
3
cerebrovasculares (ACV) representan la primera causa de discapacidad en los países
desarrollados y la tercera causa de muerte en el mundo. La hemiplejia es un trastorno en el
cual el paciente posee la mitad del cuerpo paralizada, y por lo general, es causada por un
ACV. Dada la gran cantidad de enfermedades que pueden causar trastornos en el sistema
neuromuscular, es de vital importancia encontrar soluciones efectivas que disminuyan o
eliminen las limitaciones de movilidad o discapacidad que ocasionan.
Las terapias de rehabilitación, aplicadas principalmente por un fisioterapeuta, son
procedimientos clave para que los pacientes puedan reanudar las actividades de la vida
cotidiana. Existen dos tipos de rehabilitación: pasiva y activa. En la primera, el terapeuta es
el que moviliza las extremidades sin ningún esfuerzo por parte del paciente, es decir, la
persona no tiene fuerza muscular; como, por ejemplo, las personas con hemiplejia. En la
segunda, el individuo puede realizar los ejercicios por sí mismo de forma voluntaria, y en
cuanto a su clasificación se divide en: asistida, libre y resistida.
1.1 Estructura del proyecto
El presente proyecto se divide en varios apartados, en los cuales se realizará un recorrido
a lo largo de todos los temas tratados, con el fin de separarlos de forma clara, lo que facilitará
su estudio, lectura y comprensión.
En el primer capítulo se ha realizado una introducción a la ciencia de la robótica, haciendo
especial hincapié en el área de la robótica de servicios, exponiendo su definición, y sus
diferentes clasificaciones en función de su tarea realizada, la relación con el ser humano y el
tipo de interacción. Posteriormente, esta área se ha centrado en la robótica de rehabilitación,
haciendo presente sus objetivos y sus casos de uso.
En el segundo apartado se llevará a cabo un estudio de los diferentes marcos teóricos que
impulsan este proyecto. Se comenzará haciendo notable las ventajas de utilizar la robótica
de rehabilitación y se continuará citando los distintos dispositivos de rehabilitación
existentes. A continuación, se realizará un estudio sobre distintos exoesqueletos vestibles de
1.1 ESTRUCTURA DEL PROYECTO
4
miembro inferior existentes en la actualidad, mostrando sus características físicas y
técnicas. Después, se explicará en qué consiste la marcha humana, destacando las
alteraciones a las que se puede enfrentar tras sufrir un accidente. Para finalizar este apartado,
se mostrará el marco teórico del control de robots. Se comienza explicando qué son la
cinemática y la dinámica de un robot, resaltando cuáles son las funciones de cada una. A
continuación, se diferencia el análisis cinemático del análisis dinámico y se hace una
distinción entre los controladores dinámicos monoarticulares y los controladores dinámicos
multiarticulares.
En el tercer punto se enumeran los distintos objetivos que pretende lograr este
proyecto, teniendo en cuenta desde el nivel más inferior de entender cómo funciona el
entorno de programación, hasta el nivel más alto del diseño propio, la creación de patrones
propios y la modificación de controladores.
En el cuarto capítulo, se formulará toda la metodología sobre sistemas de control que
supone la base de este proyecto. En primer lugar, se hace una pequeña introducción a ROS
y ROS_Control, explicando su estructura y funcionamiento. Posteriormente, se detallan los
componentes de un controlador creado en ROS, así como la interconexión de los mismos y
el mecanismo que sigue para su ejecución.
En el siguiente punto es donde se explicará todo el desarrollo que ha supuesto este
proyecto, en el que se harán presentes todos los objetivos expuestos con anterioridad. Se
comenzará con el modelado del exoesqueleto, desde su diseño hasta su análisis cinemático.
Seguidamente, tendrá lugar su simulación, un análisis del patrón de marcha y una mejora del
mismo. De igual forma, se examinará su comportamiento ante distintos obstáculos y terrenos
varios, procediendo a adaptar los patrones de marcha para hacerles frente. Finalmente, se
explicará cómo es el funcionamiento del controlador. Se desglosarán las partes del mismo,
según el esquema expuesto en el punto anterior y se identificará el tipo de control que realiza.
Además, se realizarán una serie de mejoras en el controlador con el objetivo de reducir el
error obtenido en la ejecución de la marcha. Se expondrá de forma analítica los pasos
seguidos para obtener valores que minimicen el error articular
1.1 ESTRUCTURA DEL PROYECTO
5
En el apartado sexto, se mostrarán los resultados obtenidos. Primero, se hará una breve
demostración de que efectivamente el exoesqueleto está siguiendo los nuevos patrones de
marcha diseñados anteriormente para enfrentarse a distintas situaciones. Posteriormente, se
detallarán los resultados obtenidos con el cálculo de nuevos valores de ganancias, mostrando
tanto las especificaciones utilizadas para el cálculo como los resultados gráficos.
En el último capítulo, se realizará una conclusión, en la cual se analizarán los resultados
obtenidos, detallando los objetivos que se han logrado cumplir y las dificultades encontradas
en el desarrollo del presente proyecto. Además, se expondrán una serie de mejoras que se
consideran posibles partiendo de lo que se ha logrado en este proyecto.
7
2. Estado del arte
En este segundo capítulo se ponen en manifiesto los conocimientos, investigaciones y
proyectos más recientes, que sirven como base intelectual para el desarrollo del presente
proyecto. Se expondrán las razones por las que utilizar robots en rehabilitación resulta
beneficioso para la recuperación del paciente, así como los distintos tipos de dispositivos
robóticos de rehabilitación que se pueden encontrar. Además, se realizará un análisis de
diversos exoesqueletos vestibles de miembro inferior detallando sus características técnicas
y físicas, de forma que sirvan como base para un futuro diseño.
Por otra parte, se explicará en qué consiste la marcha humana, realizando un recorrido
por cada una de las fases, en las cuales se explicará el posicionamiento de la pierna.
Posteriormente, se hará un estudio de las alteraciones a las que se puede enfrentar la marcha
humana tras sufrir un accidente. Para finalizar este apartado, se mostrará el marco teórico
del control de robots. Se explicará en detalle en qué consiste el control dinámico
multiarticular, sus ventajas frente al monoarticular y los dos tipos que existen de este control.
Además, se explicará de forma analítica el funcionamiento de algunos controladores
específicos y se analizará su estabilidad.
2.1 ¿Por qué usar robots en rehabilitación?
Una persona que padece alguna discapacidad motriz en los miembros inferiores debe estar
sometida a constantes terapias de rehabilitación por un largo periodo de tiempo para poder
recuperar movilidad. Las terapias de rehabilitación son rutinas de ejercicios repetitivos que
tienen lugar bajo la supervisión de un fisioterapeuta.
2.1 POR QÚE USAR ROBOTS EN REHABILITACIÓN
8
En ocasiones, dichas terapias son realizadas de manera errónea debido a una escasez de
personal para atender a todos los pacientes o por fatiga del propio terapeuta. Una forma de
poner fin a este problema es mediante el desarrollo de dispositivos robóticos. Son muchos
los investigadores que han demostrado importantes beneficios en el uso de robots durante
las terapias de rehabilitación.
Una de las principales ventajas reside en el hecho de reemplazar el esfuerzo físico del
terapeuta. Utilizando un sistema robótico, la intensidad de los ejercicios permanece
constante ya que la fatiga humana es un factor que desaparece completamente. Además,
reducen de manera considerable el tiempo necesario para la recuperación motriz del paciente
al realizar ejercicios de manera sistemática.
Por otro lado, ofrecen ventajas importantes respecto a la fuerza muscular, el aumento de
las puntuaciones clínicas y un grado mayor de recuperación de la independencia funcional.
Tal y como ha expuesto el doctor Enrique Sainz de Murrieta, especialista en Medicina Física
y Rehabilitación: <<las personas que reciben entrenamiento de la marcha asistida de forma
electromecánica combinada con fisioterapia tras sufrir un ictus, tienen mayores
probabilidades de caminar de forma independiente>>.
También cabe mencionar que el uso de robots facilita el aprendizaje motor. La amplia
variedad de dispositivos y sistemas robóticos existentes han sido creados para facilitar la
adquisición o mejora de habilidades motoras. Están diseñados por expertos y su uso está
respaldado por la evidencia científica; es decir, hay estudios que demuestran su efectividad,
especialmente en participantes con daños neurológicos como personas que han sufrido un
accidente cerebrovascular, con parálisis cerebral infantil, daño cerebral adquirido…
Los dispositivos robóticos están diseñados para obtener métricas más exactas y objetivas
tanto de los procesos como de la síntesis de resultados. Estos datos los utiliza un equipo de
especialistas para diseñar el método más efectivo de abordar el problema e ir reevaluando y
modificándolo de forma permanente y personalizada. Del mismo modo, facilita que los
2.1 POR QÚE USAR ROBOTS EN REHABILITACIÓN
9
médicos rehabilitadores y el resto de profesionales involucrados compartan el conocimiento
de los avances mediante el registro de las métricas en bases de datos en caso de necesidad.
En último lugar, es importante destacar que muchos pacientes consideran que los
exoesqueletos son motivadores y emocionantes. Algunos pacientes describen beneficios
psicológicos en el hecho de estar de pie con los compañeros y participar más activamente en
la recuperación de la capacidad de caminar.
Sin embargo, el uso de dispositivos robóticos no sustituye a la terapia tradicional sino que
los robots son complementarios y sirven para potenciar y ampliar las posibilidades
funcionales de los participantes. No se trata de sustituir a los terapeutas humanos sino de
permitir más y mejor terapia complementando la terapia habitual personalizada y única con
terapeuta y paciente, con terapia asistida con robot, donde los profesionales siguen
manejando la máquina, cambiando sus parámetros y adaptándola a las respuestas del
paciente.
Son muchos los fisioterapeutas que apoyan el uso de exoesqueletos en rehabilitación,
aunque sugiriendo ciertas mejoras en el diseño para que sean más seguros y fáciles de
utilizar. Entre estas sugerencias se encuentran reducir el peso y el volumen de los
exoesqueletos, agregar una mayor capacidad de ajuste, mejorar la durabilidad, agregar
controles de una sola mano, optimizar los exoesqueletos para su uso en las escaleras o
terrenos irregulares, y permitir al usuario mantener el equilibrio sin el apoyo del brazo.
2.2 Dispositivos robóticos de rehabilitación
Los robots de rehabilitación cumplen una serie de restricciones biomecánicas que vienen
impuestas por la propia naturaleza dinámica del ser humano. Los dispositivos de
rehabilitación se subdividen en robots vestibles, que permiten realizar un control y una
asistencia directa a las funciones motoras; y robots de efector final, que únicamente controlar
la trayectoria del efector final del paciente, como puede ser la mano, la muñeca, el pie, el
tobillo, etc.
2.2 DISPOSITIVOS ROBÓTICOS DE REHABILITAICIÓN
10
Una vez establecido el tipo de control que se desea llevar a cabo, surgen dos alternativas
para el diseño del robot: antropomórfica y no antropomórfica. En la primera la estructura del
robot se adapta al cuerpo humano mientras que la segunda no está sujeta a restricciones
morfológicas, lo que implica un diseño más complejo.
Dependiendo del área del cuerpo que pretendan rehabilitar se pueden diferenciar los
robots de rehabilitación de miembro superior o de miembro inferior. La rehabilitación de un
miembro superior consiste en recuperar la movilidad de brazos y manos, los cuales son muy
complejos y versátiles. Incluyen movimientos de alcance, manipulación, agarre, movimiento
de los dedos o control bimanual, que están asociados a un control cortico-muscular; es decir,
son proyecciones directas del córtex en las motoneuronas. La rehabilitación de un miembro
inferior, se basa en la locomoción, centrándose en el inicio y fin de la marcha y en la
corrección de la misma. Suele ser más sencilla que la de miembro superior y su objetivo
principal es que el paciente pueda deambular sin ayuda externa de muletas, andadores o sillas
de ruedas.
Para ambos miembros, los robots de rehabilitación se pueden clasificar de forma general
en cuatro grandes grupos:
Los exoesqueletos anclados son órtesis complejas cuya base está anclada al techo, pared
o suelo. Permiten una mayor dinámica de movimiento, pero requieren mucho más espacio
para situar el robot. Algunos ejemplos son ARMin III, L-exos, ARMEO POWER (14) para
miembro superior y Lokomat (15), LOPES o KineAssit (16) para miembro inferior.
2.2 DISPOSITIVOS ROBÓTICOS DE REHABILITACIÓN
11
(A) miembro superior (B) miembro inferior
Fig. 2.1: exoesqueleto anclado
Los robots industriales para rehabilitación de efector final, fueron de las primeras técnicas
utilizadas y las que menos habilidades funcionales del paciente permiten. Consisten en un
robot de tipo industrial, como puede ser un manipulador, cuyo efector final sostiene al del
paciente y controla su trayectoria. Un ejemplo de este tipo de robots es el UR5 de Universal
Robots (17).
(A) miembro superior (B) miembro inferior
Fig. 2.2: robot industrial de rehabilitación
Los dispositivos anclados de efector final son aquellos cuyo efector final es manejado por
el paciente para realizar las distintas actividades. Son una mejora de los anteriores y han sido
diseñados específicamente para tareas de rehabilitación. Algunos ejemplos de este tipo de
2.2 DISPOSITIVOS ROBÓTICOS DE REHABILITACIÓN
12
robots de rehabilitación son Amadeo (18) o MIT Manus para miembro superior y TobiBot
para miembro inferior.
(A) miembro superior (B) miembro inferior
Fig. 2.3: dispositivo anclado de efector final
Los exoesqueletos vestibles son órtesis complejas sin anclajes que tienen un diseño
antropomórfico que se adapta completamente al cuerpo del paciente. Su gran ventaja es que
permiten el movimiento ambulatorio totalmente libre por todo el espacio y una mayor
participación por parte del paciente, de forma que la rehabilitación sea más natural. Algunos
ejemplos son MyoPro (19), de miembro superior y EksoGT, Hank (24), ReWalk (20) , entre
otros, de miembro inferior. En este tipo de dispositivos robóticos entraremos más en detalle
en el siguiente apartado.
(A) miembro superior (B) miembro inferior
Fig. 2.4: exoesqueleto vestible
13
2.3 Exoesqueletos vestibles de miembro inferior
En este capítulo se analizarán distintos ejemplos de exoesqueletos de miembro inferior,
se evaluarán sus características y finalmente se escogerá uno de ellos para posteriormente
llevar a cabo su simulación y control.
ReWalk (20): se ha desarrollado para su uso en clínicas, donde se puede utilizar para
ejercicios y terapias para sus pacientes. El sistema alimentado por batería está diseñado para
uso durante todo el día e incluye un exoesqueleto ligero y portátil con motores en las
articulaciones de la cadera y la rodilla.
El ReWalker controla los movimientos con ligeros cambios del centro de gravedad del
cuerpo del paciente. El sistema percibe una ligera curva hacia adelante de la parte superior
del cuerpo, lo que inicia el primer paso. El cambio repetido del peso corporal desencadena
una serie de pasos que imitan el movimiento normal de las piernas.
Se puede configurar de forma precisa y específica para el cliente. La interfaz gráfica de
usuario permite al terapeuta ingresar una gran cantidad de parámetros para cada individuo y
adaptarlos continuamente al progreso del entrenamiento.
Fig. 2.5: exoesqueleto ReWalk
2.3 EXOESQUELETOS VESTIBLES DE MIEMBRO INFERIOR
14
REX (21) es un dispositivo robótico de rehabilitación diseñado para personas con
problemas de movilidad, incluidos aquellos con discapacidades más graves, ofreciendo una
mejora de la movilidad para una amplia gama de personas.
El movimiento es generado por 10 actuadores lineales de diseño personalizado que
proporcionan la potencia para mover a un usuario de hasta 100 kg. La pelvis de fibra de
carbono proporciona la fuerza y rigidez necesarias para sostener al usuario mientras
minimiza el peso del sistema. La longitud de la pierna del dispositivo se puede ajustar
fácilmente, lo que permite una alineación precisa y exacta con las articulaciones del usuario.
El sistema de control de movimiento personalizado se ha desarrollado para garantizar la
estabilidad en todas las fases del ciclo de movimiento. Tiene una carga suficiente para
aproximadamente dos horas de uso normal.
Fig. 2.6: exoesqueleto Rex
HAL (22): es un dispositivo médico aplicable a pacientes con síntomas de discapacidad
musculoesquelética, que sufren de lesiones de la médula espinal, lesiones cerebrales
traumáticas, enfermedades cerebrovasculares, enfermedades del cerebro y del sistema
neuromuscular, etc. Tiene elementos ajustables al usuario, puede adaptarse a la longitud de
las piernas, el ancho de las caderas y el tamaño de los pies en amplios rangos.
2.3 EXOESQUELETOS VESTIBLES DE MIEMBRO INFERIOR
15
Cuando una persona mueve el cuerpo, se envían varias señales desde el cerebro a los
músculos a través de los nervios. Esas señales se filtran en la superficie de la piel como
señales bioeléctricas. HAL lee estas señales del usuario y en consecuencia compensa la
fuerza muscular de las extremidades inferiores y lo ayuda a caminar, ponerse de pie y
sentarse con sus propias piernas.
Con el controlador de HAL, el operador puede manipular todas las operaciones, como el
inicio / parada de la asistencia, la modificación de la configuración y la confirmación de los
estados de movimiento, observando de cerca el movimiento del usuario. La asistencia
personalizada para usuarios individuales hace que el entrenamiento con HAL sea efectivo.
Fig. 2.7: exoesqueleto HAL
H3 (23): emula el proceso de caminar replicando un patrón de marcha predefinido a
través de seis articulaciones accionadas para cadera, rodilla y tobillo en ambas piernas
derecha e izquierda. Por lo tanto, puede ayudar a las personas que han perdido parcialmente
la capacidad de caminar después de sufrir un accidente cerebrovascular, contribuyendo a la
investigación actual sobre neurorrehabilitación. Su estructura principal está compuesta de
acero Inoxidable y aluminio de alta resistencia y tiene un peso aproximado de 14 kg.
2.3 EXOESQUELETOS VESTIBLES DE MIEMBRO INFERIOR
16
Por haber sido diseñado específicamente para la investigación, permite la implementación
de algoritmos propios, así como la aplicación de diferentes estrategias de control robótico.
Esto, unido a su capacidad de adaptación a diferentes tamaños, proporciona un amplio
abanico de posibilidades a la hora de realizar una investigación. También tiene una
aplicación de Android como interfaz para operar las funciones básicas del exoesqueleto,
como la velocidad de la marcha, la asistencia del motor o los comandos para levantarse y
sentarse.
Fig. 2.8: exoesqueleto H3
HANK (24) es un exoesqueleto de miembros inferiores destinado a la rehabilitación de
pacientes con lesiones medulares, enfermedades neurodegenerativas o que hayan sufrido
accidentes cerebrovasculares (ictus). Esta solución está compuesta por 6 articulaciones
motorizadas que permiten la recuperación funcional de la marcha y la autonomía personal.
Este dispositivo médico se ajusta a pacientes desde 1.50 - 1.95 metros de altura y hasta
100 kilos de peso, puesto que se adapta a diferentes medidas antropométricas sin la necesidad
de sustituir piezas mecánicas. La autonomía de la batería permite su uso en entornos clínicos
controlados durante 4 horas de marcha continua.
2.3 EXOESQUELETOS VESTIBLES DE MIEMBRO INFERIOR
17
Una de las características a mencionar de este producto es el tobillo motorizado, ya que
es necesario para el impulso al comienzo de la fase de balanceo y clave para mantener el
equilibrio.
Fig. 2.9: exoesqueleto HANK
Project MARCH (25) : es un equipo de estudiantes investigadores que cada año elabora
un modelo de exoesqueleto con el fin de mejorar la calidad de vida de las personas con
lesiones de la médula espinal. El exoesqueleto MARCH tiene una altura aproximada de 1.2
m y un peso de aproximadamente 20kg. La batería tiene una capacidad de 160Wh con 48V
y 6Ah, aunque están trabajando para aumentarla hasta 280 Wh. Su estructura junto con sus
articulaciones está compuesta de aluminio recubierto con un material protector de plástico,
y la base que sostiene el pie está hecha de titanio.
Está compuesta de 8 articulaciones controlables, dos para cada lado de la cadera, una para
cada una de las rodillas y para cada uno de los tobillos. La alta velocidad que pueden alcanzar
las articulaciones permite que el exoesqueleto responda rápidamente a la entrada de los
sensores, por lo tanto, caminar se vuelve menos estresante para el paciente. Es posible
monitorear los movimientos del exoesqueleto a través del dispositivo de entrada. Para saber
en qué pie descansa el peso del piloto, utiliza almohadillas de presión que miden la presión
2.3 EXOESQUELETOS VESTIBLES DE MIEMBRO INFERIOR
18
ejercida en ocho ubicaciones diferentes del pie, lo que permite una estimación muy precisa
del equilibrio del piloto.
Este exoesqueleto fue el elegido finalmente para realizar la simulación y el control en el
presente trabajo.
Fig. 2.10: exoesqueleto MARCH
2.4 La marcha humana
La marcha humana es un proceso de locomoción en el cual el cuerpo humano se mueve
hacia delante, soportando su peso por ambos miembros inferiores alternativamente. Se
caracteriza por el contacto permanente del individuo con el suelo a través de al menos uno
de sus pies, a diferencia de la carrera. Puede definirse como una sucesión de pasos,
entendiéndose por pasos aquellas acciones y movimientos que se producen entre el apoyo
de talón de un pie y el apoyo de talón del otro pie.
2.4 LA MARCHA HUMANA
19
Fig. 2.11: fases de la marcha
En el estudio de la marcha se distinguen cuatro fases, tiempos o momentos, aunque éstos
podrían ser subdivididos. La primera fase, tiempo o momento de la marcha humana, también
denominada «primer apoyo doble», «fase de despegue» o «fase de empuje hacia arriba o de
impulso»; se caracteriza porque la pierna atrasada se inclina hacia delante debido a una
extensión de la cadera. Hacia el final de esta fase el músculo cuádriceps se contrae,
extendiendo prácticamente la rodilla.
La segunda fase, tiempo o momento de la marcha, es también conocida como «fase de
oscilación», «primer apoyo simple», o «fase de aceleración del balanceo». Se caracteriza
porque el miembro inferior atrasado se inclina hacia delante por una extensión de cadera, la
rodilla se flexiona mientras que la articulación tibiotarsiana se flexiona plantarmente. En
ella, el pie que en la fase anterior sólo apoyaba con la punta de los dedos, se despega del
suelo, la rodilla y la cadera se flexionan y todo el miembro inferior se desplaza adelantándose
al resto del cuerpo, siendo ahora la otra pierna la que sostiene todo el peso del cuerpo. En
esta fase es cuando la pierna que está en balanceo alcanza su mínima longitud al producirse
la flexión simultánea de cadera, rodilla y tobillo, que serán mayores cuanto más irregular sea
el terreno para evitar el choque del pie contra el suelo.
La tercera fase, tiempo o momento de la marcha humana también la podemos encontrar
citada como «doble apoyo de recepción o de frenado», «segundo apoyo doble», «fase de
2.4 LA MARCHA HUMANA
20
recepción de la carga» o «fase de impacto del talón». Durante esta fase el miembro inferior
ha de medir y regular la progresión hacia delante.
La cuarta fase, tiempo o momento de la marcha también es designada como «apoyo
unilateral», «segundo apoyo simple», «fase media de apoyo» o «fase de postura intermedia».
Durante esta fase el miembro inferior apoyado soporta todo el peso del cuerpo a la vez que
mantiene el equilibrio y permite la traslación del cuerpo hacia delante.
2.4.1 Alteraciones de la marcha humana tras sufrir un accidente
Existen diversos factores que afectan a la marcha humana y su análisis es clave para
determinar su naturaleza y diseñar sistemas para lograr que vuelva a la normalidad (28).
Entre estos factores cabe destacar:
1. Dolor: provoca debilidad muscular, disminución de la velocidad, disminución de la
cadencia, disminución de la longitud de zancada y disminución del tiempo de apoyo.
2. Limitación del movimiento: los tejidos no permiten una movilidad suficiente para
adoptar posturas normales ni los rangos de movimiento necesarios durante la marcha. La
contractura suele ser el motivo más habitual, como consecuencia de una inmovilidad
prolongada o como secuela de una lesión.
3. Debilidad muscular: puede ser debida a una atrofia muscular por desuso o a lesiones
neurológicas.
4. Control neurológico deficitario: se puede presentar en patologías del sistema nervioso
central o periférico, manifestándose en diferentes alteraciones básicas como:
• Espasticidad: por parálisis cerebral, accidente cerebrovascular, traumatismo
craneoencefálico, lesión medular incompleta y esclerosis múltiple.
• Alteraciones de la coordinación: impiden controlar el tiempo y la intensidad de la
acción muscular, produciendo alteraciones de la secuencia de la marcha.
2.4.1 ALTERACIONES DE LA MARCHA HUMANA TRAS SUFRIR UN ACCIDENTE
21
• Patrones reflejos primitivos: suponen una alternativa al control voluntario en la
rehabilitación de la marcha, ya que permiten dar pasos mediante la combinación
de un patrón de flexión y extensión.
• Alteración de la propiocepción: impide que el paciente tenga información sobre
la posición articular, así como de la sensación de contacto con el suelo.
Existen varias formas de clasificar las alteraciones de la marcha debidas a patologías. Se
pueden dividir según su etiología, diagnóstico, fase de la marcha alterada o zona anatómica
afectada. Esta última es la más común y recoge cuatro grupos: alteraciones de tobillo,
alteraciones en rodilla, alteraciones en cadera y alteraciones en el plano transverso.
Las alteraciones de tobillo: se manifiestan por una flexión plantar exagerada que afecta
tanto a la fase de apoyo doble como a la fase de apoyo simple; y una flexión dorsal exagerada
que afecta a la oscilación. Las alteraciones en rodilla producen flexión y extensión
exageradas o inadecuadas y las causas son principalmente la debilidad en el cuádriceps, en
los flexores de cadera y en el pie, dolor, contracturas y deformaciones estáticas o dinámicas.
Las alteraciones en cadera afectan a la marcha principalmente por una inadecuada extensión
o una exagerada flexión. Por último, las alteraciones en plano transverso son provocadas por
el desplazamiento hacia delante del cuello del fémur.
2.5 Control de robots
En este apartado se expondrán los conocimientos básicos necesarios para comprender el
funcionamiento del control de robots, comenzando por los términos de análisis cinemático,
cinemática directa e inversa, dinámica, control cinemático y control dinámico.
2.5.1 Cinemática y control cinemático
La cinemática describe el movimiento de los objetos y estudia su trayectoria en función
del tiempo, sin tener en cuenta el origen de las fuerzas y pares que lo motivan o las causas
que lo producen. En un análisis cinemático la posición, velocidad y aceleración de cada uno
2.5.1 CONTROL CINEMÁTICO
22
de los elementos del robot son calculados sin considerar las fuerzas que causan el
movimiento (29).
Por tanto, el modelo cinemático de un robot describe la relación entre las posiciones de
las articulaciones que lo conforman y la posición y orientación de su efector final.
El modelo cinemático de un robot es útil para la simulación del movimiento de sistemas
robóticos, la planificación de trayectorias y el diseño de robots, ya que permite el cálculo de
las dimensiones óptimas de los eslabones.
El modelo cinemático se clasifica en modelo cinemático directo y modelo cinemático
inverso. El primero permite obtener la localización del extremo del robot basándose en el
valor de las variables articulares y puede obtenerse mediante relaciones trigonométricas o
mediante el algoritmo de Denavit Hartenberg. Tiene solución única, ya que dado un vector
de variables articulares de un sistema robótico, sólo existe una posición y orientación del
extremo final. El segundo, permite determinar la posición de las articulaciones del robot si
lo que se conoce es la localización del extremo y puede resolverse mediante métodos
algebraicos, geométricos o el desacoplo cinemático de Pieper. Puede presentar diferentes
soluciones, ya que existen diferentes configuraciones del robot para un mismo punto en el
espacio cartesiano o puede que no proporcione ninguna solución ya que estas pueden
encontrarse fuera del espacio de trabajo o causar singularidades.
El control cinemático, alimenta los valores de referencia a las articulaciones encargadas
de llevar a cabo la trayectoria del efector final asignada; es decir, establece cuál es la
trayectoria que debe seguir cada una de las articulaciones a lo largo del tiempo, para lograr
un objetivo establecido (30). La obtención de estas trayectorias está condicionada por las
restricciones físicas de los accionamientos y de algunos de los parámetros de la trayectoria,
como pueden ser la suavidad o la precisión.
El control cinemático se encarga de:
2.5.1 CONTROL CINEMÁTICO
23
• Convertir la especificación del movimiento dada en el programa en una
trayectoria analítica en espacio cartesiano,
• Muestrear la trayectoria cartesiana obteniendo un número finito de puntos de
dicha trayectoria (x, y, z, α, β, γ), convertir cada uno de estos puntos en sus
correspondientes coordenadas articulares (q1, q2, q3, q4, q5, q6) utilizando la
transformación inversa.
• Interpolar de los puntos articulares obtenidos, generando para cada variable
articular una expresión qi(t) que pase o se aproxime a ellos, siendo una trayectoria
realizable, cartesiana lo más próxima a la especificada por el usuario
• Muestrear la trayectoria articular para generar referencias al control dinámico
Las trayectorias, pueden dividirse en trayectorias punto a punto, que a su vez pueden ser
eje a eje o de movimiento simultáneo de los ejes; trayectorias coordinadas, en las cuales
todos los ejes finalizan su movimiento a la vez, o trayectorias asíncronas, que permite
conocer la trayectoria del extremo.
La interpolación de trayectorias consiste en la unión de una sucesión de puntos en el
espacio articular por los que han de pasar las articulaciones del robot en un instante
determinado. Es posible utilizar:
• Interpolador lineal, que mantiene misma velocidad durante todo el movimiento
• Ineterpolador polinómico la trayectoria seguida por cada articulación está descrita
por una ecuación que puede ser cúbica, quíntica, etc.
• Interpolador lineal con ajuste parabólico: la trayectoria es simétrica de la forma
parabólica - lineal - parabólica.
2.5.1 CONTROL CINEMÁTICO
24
• Interpolación polinómica 4-3-4, la cual divide la trayectoria en tres segmentos
• mediante polinomios de cuarto, tercero y cuarto grado respectivamente.
• Interpolación usando splines, aseguran la continuidad en velocidad para el caso
del splines cúbicos y de aceleración para splines quínticos permitiendo así generar
una trayectoria suave y realista.
2.6.2 Dinámica y control dinámico
En este apartado de definirá el concepto de dinámica, modelo dinámico y control
dinámico, exponiendo su representación analítica y los distintos tipos que se pueden
encontrar, mostrando sus características.
La dinámica establece la relación entre las fuerzas que actúan sobre un cuerpo y el
movimiento que en él se origina. Establece una relación entre la posición, velocidad y
aceleración del robot, las fuerzas y pares aplicados en las articulaciones o en el extremo y
parámetros dimensionales y dinámicos de los eslabones como su longitud, masas e inercias.
Permite la simulación del movimiento del robot, el diseño del mecanismo y selección de los
accionamientos y el desarrollo del control dinámico del robot. Existen diversas formas de
establecer el modelo dinámico de un robot como son el algoritmo de Lagrange o el algoritmo
Newton-Euler (32).
La ecuación del modelo dinámico se representa de forma genérica por:
𝜏 = 𝑀(𝑞)𝑞 ̈ + 𝐶 (𝑞, 𝑞’) 𝑞’ + 𝐺(𝑞) (2.1)
Donde τ es el vector de pares articulares ejercidos en cada articulación del robot, M(q) es
la matriz de inercia del robot, C(q, q) es la matriz de Coriolis que depende tanto de la posición
como de la velocidad actuales del robot, y G(q) es la matriz de gravedad, que indica el efecto
de esta fuerza sobre el robot en una posición determinada q.
2.5.2 CONTROL DINÁMICO
25
Al igual que la cinemática, el modelo dinámico se puede dividir en directo e inverso. El
modelo dinámico directo obtiene la evolución temporal de las coordenadas articulares del
robot, dado un vector de par/fuerza determinada. Por otro lado, el modelo dinámico inverso
obtiene las fuerzas y pares que intervienen, dada la evolución temporal del robot.
El control dinámico consiste en la reducción del error de posicionamiento, logrando que
las trayectorias seguidas por el robot sean lo más semejantes posible a las calculadas por el
control cinemático. Por tanto, necesita tener conocimiento sobre el modelado cinemático y
dinámico del robot, ciertos algoritmos de control y análisis de la estabilidad.
Los controladores dinámicos pueden dividirse en controladores dinámicos
monoarticulares o controladores dinámicos multiarticulares. Los primeros, consideran cada
articulación como un sistema de control independiente que trata de seguir una determinada
trayectoria articular. A menudo se emplean dos bucles de control anidados: un bucle externo
que mantiene la posición y determina la velocidad articular necesaria para minimizar el error
de posición, y un bucle interno que se encarga de mantener la velocidad articular establecida
por el bucle externo. En cuanto a los segundos, surgen con el objetivo de mejorar el
desempeño de los primeros cuando el robot describe trayectorias rápidas o con gran
precisión. En estos casos, los efectos de acoplamiento entre las articulaciones de un robot
son más notables y se hace necesario definir un controlador multivariable que genere
directamente los pares para todas las articulaciones teniendo en cuenta los posibles pares de
acoplamiento entre las articulaciones. Pueden dividirse en controladores de posición puros,
que buscan alcanzar una configuración articular deseada y controladores de seguimiento, los
cuales se emplean cuando se quiere seguir una trayectoria articular deseada.
En este proyecto, se ha empleado un controlador dinámico multiarticular, dada la
necesidad de una gran precisión en la ejecución de cada una de las trayectorias impuestas
para cada articulación que conforma el exoesqueleto.
27
3. Objetivos
El objetivo principal de este TFG es la simulación y el control de un exoesqueleto de
piernas orientado a la rehabilitación. La rehabilitación es un tema actual de investigación y
requiere tanto un buen diseño del dispositivo robótico, como un control eficiente que
garantice un tratamiento correcto y la seguridad del paciente.
El primer objetivo que plantea este proyecto es el diseño de un exoesqueleto robótico de
piernas, para lo cual en primer lugar se realiza un análisis de los exoesqueletos existentes en
la actualidad para observar qué características son susceptibles de mejora. Se ha
seleccionado como base el exoesqueleto MARCH, que está en constante mejora por un
equipo de investigación por parte de los estudiantes, debido a que su modelo está
implementado en ROS, y es posible utilizarlo como base para un nuevo diseño.
El segundo objetivo planteado es la mejora del patrón de marcha del exoesqueleto con el
fin de lograr una marcha más semejante a la marcha humana, mejorar la estabilidad y la
capacidad de movimiento. Para ponerlo a prueba, se incluyen distintos obstáculos en el
entorno simulado, evaluando los patrones de marcha necesarios para hacerles frente.
El tercer y último objetivo consiste en el análisis del controlador PID actual, y la
utilización distintas técnicas para obtener el valor dichas ganancias, de forma que se logre
un mejor comportamiento del controlador. Para ello se utiliza ROS Control, un conjunto de
paquetes destinados a la implementación de controladores.
Estos tres objetivos, implican subobjetivos:
• Evaluar las características deseables en un exoesqueleto.
3. OBJETIVOS
28
• Comprender la estructura de los paquetes de MARCH, modelado, simulación,
patrones de marcha, controladores, etc.
• Diseñar un exoesqueleto.
• Realizar un análisis cinemático.
• Crear patrones de marcha.
• Poner a prueba el comportamiento en distintos entornos.
• Aprender la estructura y funcionamiento de ROS Control.
• Analizar el controlador por defecto del exoesqueleto.
• Ajustar valores del controlador.
• Realizar una comparativa de los valores de control.
29
4. Metodología
En este apartado se explicará de manera analítica las bases matemáticas del controlador
utilizado en el presente proyecto, exponiendo las ecuaciones de control y analizando su
estabilidad en bucle cerrado.
Se explicará en primer lugar el tipo de control dinámico en el que se basan, situándolos
dentro de una clasificación, y se indicará en detalle el desarrollo matemático hasta la
obtención de una expresión analítica general.
4.1 Control dinámico multiarticular
Este tipo de controlador se diferencia principalmente del controlador monoarticular, por
el hecho de que no precisa un doble bucle para la acción de control. La referencia del
controlador es la posición o trayectoria deseada. La acción de control genera directamente
los pares articulares a aplicar a todos y cada uno de los actuadores del robot.
Los controladores multiarticulares surgen con el objetivo de mejorar el desempeño de los
controladores monoarticulares cuando el robot describe trayectorias rápidas o con gran
precisión. En estos casos, los efectos de acoplamiento entre las articulaciones de un robot
son más notables y se hace necesario definir un controlador multivariable que genere
directamente los pares para todas las articulaciones teniendo en cuenta los posibles pares de
acoplamiento entre las articulaciones. Pueden clasificarse en:
4.1 CONTROL DINÁMICO MULTIARTICULAR
30
Controladores de posición puros o de regulación: 𝑞𝑑(𝑡) = 𝑞𝑑, es un vector constante. Por
lo tanto, estos controladores se emplean cuando se quiere alcanzar una configuración
articular deseada que no varía en el tiempo.
Controladores de seguimiento: 𝑞𝑑(𝑡) es un vector variable con el tiempo. Por lo tanto,
estos controladores se emplean cuando se quiere seguir una trayectoria articular deseada; es
decir, la configuración articular varía con el tiempo.
En este proyecto, se emplea un controlador de posición puro, al cual se le indican una
serie de posiciones articulares que deben alcanzarse en un tiempo determinado.
4.2 Controladores de posición multiarticulares
Si se considera un robot de n grados de libertad con eslabones rígidos, sin fricción en sus
uniones su modelo dinámico puede expresarse de la siguiente manera:
𝑀(𝑞)𝑞̈ + 𝐶(𝑞, 𝑞 )𝑞 + 𝑔(𝑞) = 𝜏 (4.1)
En esta expresión �̈� ∈ ℜ𝑛×1 son las aceleraciones articulares, 𝑀(𝑞) ∈ ℜ𝑛×𝑛 es la matriz
de inercia simétrica y definida positiva, 𝐶(𝑞, 𝑞 )∈ ℜ𝑛×1 representa el vector de fuerzas
centrípetas y de Coriolis, y 𝑔(𝑞) es el vector de fuerzas gravitacionales. Finalmente, 𝜏 ∈
ℜ𝑛×1 es el vector de pares articulares.
El modelo dinámico de un manipulador puede expresarse en términos de variables de
estado tomando como vector de estados la posición y velocidad articular [𝑞𝑇𝑞 𝑇]𝑇. En este
caso, el modelo dinámico de un robot de n grados de libertad puede expresarse de la siguiente
manera:
𝑑
𝑑𝑡 (
𝑞 𝑞 ) = [
𝑞
𝑀(𝑞)−1[𝜏(𝑡) − 𝐶𝑞 (𝑞, 𝑞 )𝑞 − 𝑔(𝑞) ] (4.2)
4.2 CONTROLADORES DE POSICIÓN
31
El objetivo del control de posición puro es determinar los pares articulares 𝝉 necesarios
para 𝑙𝑖𝑚 𝑡 → ∞ 𝑞(𝑡) = 𝑞𝑑 , donde 𝑞𝑑es un vector constante que representa la posición
deseada a alcanzar. Es decir, el controlador definido debe asegurar que la posición articular
del robot alcance la configuración deseada (que no depende del tiempo en los controladores
puros de posición).
El objetivo del control de posición, siendo el nuevo vector de estado [�̃�𝑇 𝑞 𝑇]𝑇, puede
reformularse como 𝑙𝑖𝑚 𝑡 → ∞ 𝑞 (𝑡) = 0, donde 𝑞 = 𝑞𝑑 − 𝑞 ∈ ℝ𝒏 son los errores de
posición articular. Por lo tanto, si se considera como vector de estado el error articular y la
velocidad articular, el objetivo se planteará como la reducción progresiva del error articular
hasta su anulación.
Sea cual sea el vector de estados escogido, la ley de control generará los pares articulares
a partir de información interna del robot, 𝑞, 𝑞 , 𝑞̈, el modelo dinámico del mismo
𝑀(𝑞), 𝐶(𝑞, 𝑞 ), 𝑔(𝑞) y la configuración articular deseada a alcanzar, 𝑞𝑑 (ver Figura 1). Por
lo tanto:
𝜏 = 𝜏(𝑞, 𝑞 , 𝑞 ̈, 𝑞𝑑 , 𝑀(𝑞), 𝐶(𝑞, 𝑞 ), 𝑔(𝑞)) (4.3)
Fig. 4.1: esquema básico de un controlador multiarticular
4.2.1 Control PD
La acción de control de un regulador PD se corresponde con la siguiente expresión:
4.2.1 CONTROLADOR PD
32
𝜏 = 𝐾𝑝𝑞 + 𝐾𝑣𝑞 (4.4)
donde 𝜏 son los pares a aplicar a cada una de las n articulaciones, 𝑞 es la derivada respecto
al tiempo del error articular, 𝐾𝑝,𝐾𝑣 ∈ ℝ𝑛𝑥𝑛 son matrices ambas definidas positivas.
En la siguiente figura se representan de forma gráfica los distintos componentes del
controlador PD:
Fig. 4.2: controlador PD de posición multiarticular
El comportamiento en bucle cerrado puede obtenerse al igualar el modelo dinámico del
robot a la acción de control del regulador, obteniendo la siguiente expresión:
𝑀(𝑞)𝑞̈ + 𝐶(𝑞, 𝑞 )𝑞 + 𝑔(𝑞) = 𝐾𝑝𝑞 + 𝐾𝑣𝑞 (4.5)
A continuación, se va a obtener el modelo dinámico en bucle cerrado en representación
de estados considerando como vector de estados [�̃�𝑇 𝑞 𝑇]𝑇. Asumiendo 𝑞𝑑 , constante, se
obtiene 𝑞 = −𝑞 .
4.2.1 CONTROLADOR PD
33
Además, la aceleración articular puede obtenerse de la expresión del comportamiento en
bucle cerrado, de forma que:
�̈� = 𝑀(𝑞) − [𝐾𝑝𝑞 − 𝐾𝑣𝑞 − 𝐶(𝑞, 𝑞 )𝑞 − 𝑔(𝑞)] (4.6)
Por lo tanto, el comportamiento en bucle cerrado en representación de estados se puede
representar de la siguiente manera:
𝑑
𝑑𝑡 ( 𝑞
𝑞 ) = (
𝑞
𝑀(𝑞𝑑 − �̃�)−1[𝐾𝑝𝑞 − 𝐾𝑣𝑞 − 𝐶𝑞 (𝑞𝑑 − 𝑞 , 𝑞 )𝑞 − 𝑔(𝑞𝑑 − 𝑞 )) (4.7)
La estabilidad del robot, dependerá de si se tiene en cuenta el efecto de la gravedad o si por
el contrario se considera despreciable.
4.2.1.1 Control PD sin términos de gravedad
La ausencia de gravedad puede producirse en determinados robots en los que la gravedad
actúe sobre los apoyos del robot, y, por lo tanto, el término de gravedad del robot puede
considerarse como despreciable. En este caso, el modelo dinámico del robot viene dado por:
𝑀(𝑞)𝑞 ̈ + 𝐶(𝑞, 𝑞 )𝑞 = 𝜏 (4.8)
Siguiendo un procedimiento similar al indicado en el apartado anterior, es posible obtener
la siguiente expresión para el comportamiento en bucle cerrado en representación de estados:
𝑑
𝑑𝑡 ( 𝑞 𝑞 )=(
𝑞 𝑀(𝑞𝑑 − 𝑞 ) − 1[𝐾𝑝𝑞 − −𝐾𝑞𝑣 𝑞 − 𝐶(𝑞𝑑 − 𝑞 , 𝑞 )𝑞
) (4.9)
A continuación, se van a extraer los puntos de equilibrio que se pueden obtener de la
expresión en bucle cerrado anterior. Para ello, y, de la propia definición del equilibrio, se
anulan las derivadas de la expresión anterior, obteniendo:
4.2.1 CONTROLADOR PD
34
[0] = 𝑀(𝑞𝑑 − 𝑞 ) − 1[𝐾𝑝𝑞 ] → 𝑞 = [0] (4.10)
Por lo tanto, el origen [�̃�𝑇 𝑞 𝑇]𝑇= [0𝑇 0𝑇]𝑇es el único equilibro de la ecuación.
Se puede demostrar que, si las matrices de ganancia proporcional y derivativa del
controlador PD son definidas positivas, el sistema en bucle cerrado es asintóticamente
estable y se cumple el objetivo de control de posición pura 𝑙𝑖𝑚 𝑡 → ∞ 𝑞 (𝑡) = 0. En
definitiva, este análisis permite concluir que el controlador garantiza alcanzar la posición
final deseada simplemente seleccionando las matrices proporcional y derivativa definidas
positivas, siempre que no afecte la gravedad.
4.2.1.2 Control PD con términos de gravedad
A continuación, se repetirá el mismo proceso, pero aplicado a robots en los que sí tiene
efecto la componente de gravedad del modelo dinámico. En este caso, tal y como se indicó
anteriormente, el comportamiento en bucle cerrado en representación de estados es el
siguiente:
𝑑
𝑑𝑡( 𝑞
𝑞 )=[
𝑞 𝑀(𝑞𝑑 − 𝑞 ) − 1[𝐾𝑝𝑞 − 𝐾𝑣𝑞 − 𝐶𝑞 (𝑞𝑑 − 𝑞 , 𝑞 )𝑞 − 𝑔(𝑞𝑑 − 𝑞 )
] (4.11)
Para determinar los puntos de equilibrio se anularán las derivadas obteniendo la siguiente
expresión:
[0] = 𝑀(𝑞𝑑 − q ) − 1[𝐾𝑝 · q − g(𝑞𝑑 − q )] → [0] = 𝐾𝑝 · q − g(𝑞𝑑 − q ) (4.12)
Además de𝑞 = [0], a partir de la última expresión, puede concluirse que puede haber
múltiples puntos de equilibrio dados por [�̃�𝑇 𝑞 𝑇]𝑇= [𝑠𝑇 0𝑇]𝑇, donde s ∈ ℝ𝒏 es solución de
𝐾𝑝𝑠 − 𝑔(𝑞𝑑 − 𝑠) = 0.
Por lo tanto, no se puede garantizar el objetivo del controlador; es decir, la anulación del
error en régimen permanente. Además, el origen de la ecuación en bucle cerrado expresado
4.2.1 CONTROLADOR PD
35
en términos de vector de estado no es un equilibrio. Se puede comprobar en la ecuación
anterior que 𝑠 = 0; es decir, error nulo, no es una posible solución.
Realizando un análisis de la estabilidad del sistema es posible concluir que, para un valor
suficientemente alto de 𝐾𝑝, el sistema tiene un único equilibrio y se garantiza un acotamiento
del error de posición.
En cualquier caso, en términos generarles, un controlador PD no es adecuado para el
posicionamiento de robots manipuladores ya que no es posible garantizar que se pueda
alcanzar la posición deseada del robot.
4.2.2 Control PID
La acción de control de un regulador PID se corresponde con la siguiente:
𝜏 = 𝐾𝑝𝑞 + 𝐾𝑣𝑞 + 𝐾𝑖 ∫ 0𝑡𝑞 (𝜎)𝑑𝜎 (4.13)
donde 𝝉 son los pares a aplicar a cada una de las n articulaciones, 𝑞 es la derivada respecto
al tiempo del error articular, 𝐾𝑝,𝐾𝑣, 𝐾𝑖 ∈ ℝ𝑛𝑥𝑛 son matrices ambas definidas positivas.
En este controlador se sustituye la compensación de gravedad por la parte integral, para
tratar de llevar a 0 el error de posición. Este es precisamente la principal ventaja del
controlador, ya que no requiere conocer ningún término del modelo dinámico del robot para
generar la acción de control. Sin embargo, la principal desventaja es el proceso de sintonía.
En los casos anteriores es trivial, sin embargo, en este caso es más laborioso.
En la siguiente imagen se representa de forma gráfica los distintos componentes del
controlador PID:
4.2.2 CONTROLADOR PID
36
Fig. 4.3: controlador PID
La ley de control puede ser expresada empleando las dos siguientes ecuaciones:
𝜏 = 𝐾 𝑝𝑞 + 𝐾𝑣𝑞 + 𝐾𝑖𝜉 (4.14)
𝜉 = 𝑞 (4.15)
El comportamiento en bucle cerrado puede obtenerse al igualar el modelo dinámico del robot
a la acción de control del regulador PID, obteniendo la siguiente expresión:
𝑀(𝑞)𝑞̈ + 𝐶(𝑞, 𝑞 )𝑞 + 𝑔(𝑞) = 𝐾𝑝𝑞 + 𝐾𝑣𝑞 + 𝐾𝑖𝜉 (4.16)
A continuación, se va a obtener el modelo dinámico en bucle cerrado en representación de
estados considerando como vector de estados [𝜉 �̃�𝑇 �̃� 𝑇]𝑇. La aceleración articular puede
obtenerse de la expresión del comportamiento en bucle cerrado, de forma que:
𝑞̈ = 𝑀(𝑞) − 1[𝐾𝑝𝑞 + 𝐾𝑣𝑞 + 𝐾𝑖𝜉 − 𝐶(𝑞, 𝑞 )𝑞 − 𝑔(𝑞)] (4.17)
4.2.2 CONTROLADOR PID
37
Por lo tanto, el comportamiento en bucle cerrado en representación de estados será el
siguiente:
𝑑
𝑑𝑡 (
ξ q q ) =
[
𝑞
𝑞
�̈�𝑑 − 𝑀(𝑞𝑑 − 𝑞 ) − 1[𝐾𝑝𝑞 + 𝐾𝑣𝑞 + 𝐾𝑖𝜉 − 𝐶𝑞 𝑞 (𝑞
𝑑 − 𝑞 , 𝑞
𝑑 − 𝑞 )( 𝑞
𝑑 − 𝑞 ) − 𝑔(𝑞
𝑑 − 𝑞 )]
]
= [
𝑞 𝑞
−𝑀(𝑞𝑑 − 𝑞 ) − 1[𝐾𝑝𝑞 + 𝐾𝑣𝑞 + 𝐾𝑖𝜉𝑞 𝑞 + 𝐶(𝑞𝑑 − 𝑞 , −𝑞 )𝑞 − 𝑔(𝑞𝑑 − 𝑞 )]] (4.18)
Se puede demostrar que el origen de la ecuación en bucle cerrado expresada en términos
del vector de estados, [𝜉𝑇 �̃�𝑇 �̃� 𝑇]𝑇, es un equilibrio asintóticamente si:
•𝜆𝑚𝑎𝑥{𝐾𝑖} ≥ 𝜆𝑚𝑖𝑛{𝐾𝑖} > 0.
• 𝜆𝑚𝑎𝑥{𝐾𝑝} ≥ 𝜆𝑚𝑖𝑛{𝐾𝑝} > 𝑘𝑔.
• 𝜆 𝑚𝑎𝑥{𝐾𝑣} ≥ 𝜆𝑚𝑖𝑛{𝐾𝑣} >𝜆𝑚𝑎𝑥{𝐾𝑖}
𝜆𝑚𝑖𝑛{𝐾𝑝}−𝑘𝑔 ·𝜆𝑚𝑎𝑥2{𝑀}
𝜆𝑚𝑖𝑛{𝑀}
Donde 𝜆𝑚𝑖𝑛{𝐴} y 𝜆𝑚𝑎𝑥{𝐴} representan el autovalor mínimo y máximo de la matriz 𝐴
respectivamente.
4.3 ROS_Control
ROS es un meta sistema operativo de código abierto para tu robot. Provee de servicios
que se esperarían de un sistema operativo, incluyendo abstracción de hardware, control de
dispositivos de bajo nivel, implementación de funcionalidades comunes, pasaje de mensaje
entre procesos y manejo de paquetes. También brinda herramientas y librerías para obtener,
construir, escribir y correr código a través y mediante varias computadoras. ROS es similar
a otras estructuras o armazones para robot
4.3 ROS_CONTROL
38
El objetivo primario de ROS es soportar la reutilización de código en la investigación y
desarrollo dentro de la robótica. ROS es una estructura distribuida de procesos llamados
“nodos” que permite el diseño individualizado, pero que son fácilmente acoplables a los
demás procesos. Estos procesos se pueden agrupar en “paquetes”, que fácilmente pueden ser
intercambiados, compartidos y distribuidos. Un conjunto de paquetes se agrupa en un
“workspace”, que contiene todo lo necesario para utilizar los nodos.
Fig. 4.4: estructura de paquetes de ROS. http://wiki.ros.org/Books
Por su parte, ROS_Control es un conjunto de paquetes que incluye interfaz de
controlador, administrador de controlador, transmisiones, interfaces de hardware y caja de
herramientas de control. Todos estos paquetes juntos le permitirán interactuar y controlar los
actuadores conjuntos del robot. Toma los datos del estado conjunto y un punto objetivo como
entrada y envía los comandos apropiados a los actuadores como salida. Para lograr el punto
de ajuste proporcionado, utiliza un mecanismo de retroalimentación de bucle de control
genérico, generalmente un controlador PID, para controlar la salida. Esta salida se pasa al
robot a través de la interfaz de hardware.
4.3 ROS_CONTROL
39
Fig. 4.5: esquema interno de ROS_Control. http://wiki.ros.org/ros_control
ROS_Control posee un conjunto de controladores implementados por defecto, entre los
cuales se pueden encontrar:
• Effort_controller: envía comandos de fuerza o torque a las articulaciones. Según
su entrada pueden clasificarse en control de fuerza, posición o velocidad.
• Possition_controller: recibe comandos de posición y los transmite a las
articulaciones.
• Velocity_controller: recibe comandos de velocidad y los transmite a las
articulaciones.
4.3 ROS_CONTROL
40
• State_controller: calcula el estado actual
Por otro lado, las interfaces de hardware son utilizadas por el control ROS junto con uno
de los controladores anteriores para enviar y recibir comandos al hardware. Existen dos
tipos:
• Joint Command Interface: que puede ser para controlar las articulaciones basadas
en el esfuerzo, para controlar las articulaciones basadas en la velocidad o para
controlar las articulaciones basadas en la posición.
• Joint State Interface: interfaz de hardware para admitir la lectura del estado de una
serie de articulaciones con nombre, cada una de las cuales tiene alguna posición,
velocidad y esfuerzo.
Por último, el plugin de Gazebo es un complemento a ros que nos permite utilizar
controladores en Gazebo, ya que traduce la información de las transmisiones a datos que este
pueda entender.
4.3.1 Funcionamiento de los controladores en ROS
Un controlador de ROS, está formado por un conjunto de archivos que permiten su
implementación y su ejecución. Está formado por:
• Fichero.launch: encargado de lanzar los nodos neceasarios para el control, como
son controller_spawner o robot_state_publisher. Además, lanza el nodo del
fichero.ymal explicado a continuación.
• Fichero.yaml: encargado de llamar a los tipos de controladores que se han
implementado. Contiene ciertas especificaciones como cuáles serán las
articulaciones a controlar, el valor de las ganancias si las hubiera, los límites de
4.3 ROS_CONTROL
41
movimiento de cada una de las articulaciones, etc. Al indicar el tipo de controlador
que se va a utilizar, llama a nodo que lo implementa.
• Fichero.cpp: es el nodo donde se desarrolla el controlador propiamente dicho. Se
define como una clase formada por una parte privada que contiene las variables
necesarias para su implementación y una parte pública que consta al menos de
cuatro métodos:
o Init: función de inicialización de todas las variables y recursos necesarios
para el desarrollo del controlador.
o Update: función que realiza la función de control y envía los comandos
pertinentes a las articulaciones.
o Start: función que inicia los recursos que utiliza el controlador.
o Stop: función que finaliza y cierra el uso del controlador.
• CMakeList.txt: controla el proceso de compilación del software. Es necesario
incorporar el controlador y las librerías que emplea para que sean reconocidas.
• Package.xml: define propiedades sobre el paquete, como el nombre del paquete,
los números de versión, los autores, los mantenedores y las dependencias de otros
paquetes. Es necesario añadir el plugin que se explica a continuación.
• Control_plugin.xml: archivo plugin que indica dónde se creará la librería
necesaria para utilizar el controlador.
De esta forma, y con todos estos paquetes, cuando se lance el archivo de tipo launch, este
cargará los nodos necesarios para el control y el archivo de tipo yaml. Entonces este archivo
indicará qué controladores se van a usar y definirá los valores necesarios para su control. De
4.3 ROS_CONTROL
42
este modo se ejecutará el controlador implementado en el archivo de tipo cpp, llamando
primero al método init, posteriormente al método start, a continuación, al método update
que realizará el control y cuando se detenga el controlador, se llamará a función stop de lo
finalizará.
43
5. Desarrollo
En este apartado se explicará todo el desarrollo que ha supuesto este proyecto, en el que
se harán presentes todos los objetivos expuestos con anterioridad. Se comenzará con el
modelado del exoesqueleto, realizando un diseño propio que subsane algunos de los
inconvenientes encontrados en el exoesqueleto MARCH. Posteriormente, se realizará un
análisis cinemático del nuevo diseño creado, analizando sus sistemas de referencia locales y
sus capacidades de movimiento. Seguidamente, un análisis del patrón de marcha y una
mejora del mismo tras detectar una serie de fallos que impiden una marcha correcta. De igual
forma, se examinará su comportamiento ante distintos obstáculos y terrenos varios,
procediendo a adaptar los patrones de marcha para hacerles frente. Finalmente, se explicará
qué tipo de control dirige los movimientos del exoesqueleto y cómo se ha modificado el
controlador para intentar mejorar el comportamiento del exoesqueleto durante la marcha.
En primer lugar, se procede a la simulación en el entorno de Gazebo, para poder visualizar
el exoesqueleto. Para ello, es necesario:
1. Configurar el entorno de ROS 1:
source /opt/ros/noetic/local_setup.bash
source ~/march/ros1/install/local_setup.bash
2. Lanzar la simulación, indicando que se desea visualizar en Gazebo:
roslaunch march_launch march_simulation.launch
rviz:=false gazebo_ui:=true ground_gait:=true
5. DESARROLLO
44
Aparecerá entonces una ventana emergente en la que se visualiza en entorno de Gazebo
con el modelo del exoesqueleto cargado, en un mundo vacío.
Fig. 5.1: exoesqueleto MARCH en Gazebo
5.1 Modelado del exoesqueleto
Con el objetivo de realizar el modelo del exoesqueleto para su simulación, se partió del
exoesqueleto MARCH, descrito anteriormente. Dicho exoesqueleto consta de 8
articulaciones controlables, dos para cada lado de la cadera, una para cada una de las rodillas
y una para cada tobillo.
Dado que una de las principales características deseable en el diseño de un exoesqueleto
es su adaptación a pacientes de distintas alturas, se procedió a la modificación del eslabón
que se encuentra entre la rodilla y el tobillo, con el objetivo, de realizar una tibia extensible,
que se pudiera ajustar a la altura deseada para el paciente, de forma que la rodilla del
exoesqueleto y la del paciente queden lo más alineadas posibles, para así lograr una mejor
adaptación y obtener mejores resultados.
Los eslabones que incorpora el exoesqueleto MARCH están diseñados para la altura de
una persona en concreto, que es quien pondrá a prueba el exoesqueleto en la competición
5.1 MODELADO DEL EXOESQUELETO
45
anual Cybathlon celebrada en Zúrich. Por lo tanto, sus eslabones no tienen la posibilidad de
extenderse o replegarse dependiendo de la altura de la persona que lo porte.
El eslabón propuesto en el presente proyecto, se trata de un prisma rectangular extensible,
cuya longitud se puede establecer por terminal cuando se lance la simulación en Gazebo,
mediante el parámetro “lower_leg_heigh”. Su valor por defecto se establece a 38 cm, que es
la longitud promedio que tiene una tibia humana, que se da para una persona de 1,70 metros
de altura. La extensión mínima del eslabón creado es de 30 cm, que se corresponde a la altura
de una mujer de 1,48 metros de altura o a un hombre de 1.53 metros de altura. La extensión
máxima, por su parte, es de 50cm, que se corresponde a una mujer 1,92 de metros de altura
y a un hombre de 2,1 metros de altura. De esta forma, se abarca la mayoría de la población
adulta, proporcionando una gran adaptabilidad a distintos usuarios.
El parámetro “lower_leg_heigh”, es recibido desde march_simulation.launch como un
argumento, cuyo valor por defecto es 0.38, como ya se ha comentado. Desde este archivo se
llama al archivo march.launch, volviendo a pasar como argumento el
parámetro “lower_leg_heigh”. En este archivo se llama al archivo march_world.launch, que
de nuevo recibe como argumento el parámetro “lower_leg_heigh”. Este último archivo se
encarga, entre otras cosas, de cargar el fichero URDF que, como se comentará
posteriormente, necesita conocer este valor.
Código 5.1 March_simulation.launch
1. <launch> 2. <!-- General --> 3. <arg name="robot" default="marchS" doc="Robot to use."/> 4. <arg name="lower_leg_height" default="0.385" doc="Longitud
modificable de la tibia."/> 5. <arg name="robot_description" default="$(arg robot)" doc="URDF file
to use"/> 6. 7. <!—Tibia modificable --> 8. <param name="robot_description" 9. command="$(find xacro)/xacro '$(find
march_description)/urdf/$(arg robot_description).xacro' 10. lower_leg_height:=$(arg lower_leg_height)" /> 11.
5.1 MODELADO DEL EXOESQUELETO
46
Código 5.2. March.launch
1. <!-- Simulation -->
2. <param name="robot_description" 3. command="$(find xacro)/xacro '$(find march_description)/urdf/ 4. $(arg robot_description).xacro' 5. k_velocity_value_hfe:=60.0 k_velocity_value_kfe:=60.0 6. k_velocity_value_haa:=60.0 7. k_position_value_hfe:=5000.0 8. k_position_value_kfe:=5000.0 9. k_position_value_haa:=5000.0 10. max_effort_rotary:=200.0 max_effort_linear:=200.0 11. lower_leg_height:=$(arg lower_leg_height) 12. ground_gait:=$(arg ground_gait)" /> 13. <param name="balance" value="$(arg balance)"/>
Código 5.3 March_world.launch
1. <arg name="lower_leg_height" default="0.385" doc="Longitud de la tibia."/>
2. <param name="robot_description" 3. command="$(find xacro)/xacro '$(find march_description)/urdf/ 4. $(arg robot_description).xacro' 5. k_velocity_value_hfe:=60.0 k_velocity_value_kfe:=60.0 6. k_velocity_value_haa:=60.0 7. k_position_value_hfe:=5000.0 8. k_position_value_kfe:=5000.0 9. k_position_value_haa:=5000.0 10. max_effort_rotary:=200.0 max_effort_linear:=200.0 11. lower_leg_height:=$(arg lower_leg_height) 12. ground_gait:=$(arg ground_gait) 13. realsense_simulation:=$(arg realsense_simulation)" /> 14.
Puesto que este eslabón se debe poder sujetar a la pierna, se ha diseñado un agarre
solidario con el mismo por la parte superior del prisma, que es la que se considera fija, siendo
la inferior la parte extensible. Este agarre tiene forma de semicilindro hueco, con un saliente,
que es el que irá fijo a la tibia del exoesqueleto y por cuya apertura se introduce la pierna del
paciente. Tiene un diámetro interno de 13 cm y un diámetro externo de 15 cm, una altura de
12 cm. El saliente que se interconecta con el eslabón inferior de la pierna, tiene un grosor de
3 cm, una anchura de 4 cm y una altura de 12 cm.
5.1 MODELADO DEL EXOESQUELETO
47
Fig. 5.2: agarre del eslabón inferior del exoesqueleto a la pierna del paciente.
El resultado final del eslabón correspondiente a la tibia del exoesqueleto se muestra en la
siguiente imagen:
Fig. 5.3: eslabones de la parte inferior de la pierna del exoesqueleto.
Un archivo URDF es un formato XML para representar un modelo cinemático y dinámico
de un robot y necesario para realizar la simulación dinámica y el control dinámico del mismo.
La descripción de un robot consiste en un conjunto de elementos de eslabones o links y de
un conjunto de elementos de unión o joints que conectan los eslabones, siguiendo una
5.1 MODELADO DEL EXOESQUELETO
48
relación padre-hijo. El elemento link describe un cuerpo rígido con una geometría,
masa, inercia, propiedades de colisión y características visuales. El elemento joint define las
propiedades cinemáticas y dinámicas, además de los límites de seguridad de la articulación.
Se le debe indicar cuál es el eslabón que hace las veces de nodo “padre” y cuál será su nodo
“hijo”, de forma que cada articulación será el nuevo sistema de referencia para situar origen
del nodo hijo, como se puede ver en Fig. Además, se debe indicar el tipo de articulación
(revolute, continuous, prismatic, fixed, floating, planar) y el tipo de interfaz hardware
(posición, velocidad o esfuerzo).
Fig. 5.4: relación padre-hijo de un fichero URDF
A partir del URDF del exoesqueleto MARCH, se ha creado un nuevo archivo URDF, en
el cual se ha implementado el exoesqueleto que se desea simular y controlar en este proyecto.
En primer lugar, se estableció el argumento “lower_leg_heigh”, cuyo valor por defecto es
0.38 (correspondiente a los 38 cm de longitud media de una tibia humana), y el cual puede
ser cambiado, por el valor que se reciba desde march_world.launch, que previamente ha sido
indicado por el terminal. A continuación, se creó un link llamado lower_leg, que representa
el eslabón de la tibia del exoesqueleto, con forma rectangular de dimensiones
5*7.5*lower_leg_heigh cm. Se estableció como nodo “hijo” de la articulación de la rodilla,
cuyo nodo “padre”, es el eslabón correspondiente a la parte superior de la pierna.
5.1 MODELADO DEL EXOESQUELETO
49
Código 5.4 Lower_leg link
1. <xacro:arg name="lower_leg_height" default="0.385" /> 2. <xacro:property name="lower_leg_height" 3. value="$(arg lower_leg_height)"/> 4. <xacro:property name="lower_leg_mass" value="4.458"/> 5. <xacro:property name="lower_leg_width_x" value="0.075"/> 6. <xacro:property name="lower_leg_width_y" value="0.05"/ 7. <link name="lower_leg_left"> 8. <visual> 9. <origin xyz="0 0 ${-lower_leg_height/2}" rpy="0 0 0"/> 10. <geometry> 11. <box size="${lower_leg_width_x} ${width} 12. ${lower_leg_height}"/> 13. </geometry> 14. </link> 15.
Por otro lado, se estableció un nuevo link llamado support, que se corresponde con el
agarre creado en Autodesk Inventor. Para ello, se importó el archivo STL y se estableció
como la geometría del eslabón.
Código 5.5 Support link
1. <link name="left_support"> 2. <visual> 3. <origin xyz="0 ${lower_leg_width_y + 0.03} -0.05" rpy="1.57 0 1.57"/> 4. <geometry> 5. <mesh filename="package://march_description/urdf/stl-files/support.stl"/> 6. </geometry> 7. <material name="blue"/> 8. </visual> 9. </link>
Por último, se creó una articulación de tipo fixed, para establecer la conexión entre el
eslabón correspondiente a la parte inferior de la pierna, con su agarre solidario. Se estableció
como nodo “padre” el eslabón lower_leg y como nodo “hijo”, el eslabón support.
Código 5.6 Fixed joint
1. <joint name="left_fixing" type="fixed"> 2. <parent link="lower_leg_left"/> 3. <child link="left_support"/> 4. <origin xyz="0 ${lower_leg_width_y/2} ${-lower_leg_height/2}" 5. rpy="0 0 0"/> 6. </joint> 7.
5.1 MODELADO DEL EXOESQUELETO
50
Cabe destacar que, para poder incluir estos nuevos eslabones en el archivo URDF creado
para la simulación del exoesqueleto, ha sido necesario calcular el centro de masas y las
inercias de cada uno de ellos. Para obtener el centro de masas y las inercias del agarre
solidario se ha utilizado la herramienta matemática del mismo Autodesk Inventor, la cual
proporciona todas las propiedades físicas del cuerpo modelado.
Código 5.7 Support inertia
1. <inertial> 2. <origin xyz="0.03 ${lower_leg_width_y + 0.03 -0.07} -0.05" 3. rpy="0 0 0"/> 4. <mass value="${support_mass}"/> 5. <inertia 6. ixx="0.0122162" ixy="-0.0016191" ixz="0.000805" 7. iyy="0.036601" iyz="-0.00158" 8. izz="0.0184"/> 9. </inertial> 10.
Para el caso del eslabón, no es posible realizarlo de esta forma, ya que las inercias variarán
en función de la longitud asignada por terminal a la parte inferior de la pierna, como ya se
ha comentado anteriormente. Por tanto, es necesario realizar su cálculo en el archivo URDF
creado, de manera que se recalcule cada vez que se introduzca el parámetro
“lower_leg_heigh”.
Código 5.8 Lower_leg inertia
1. <inertial> 2. <origin xyz="0 0 ${-lower_leg_height/2}" rpy="0 0 0"/> 3. <mass value="${lower_leg_mass}"/> 4. <inertia 5. ixx="${lower_leg_mass / 12.0 * 6. (lower_leg_width_x*lower_leg_width_y 7. + lower_leg_height*lower_leg_height)}" 8. ixy="0.0" ixz="0.0" 9. iyy="${lower_leg_mass / 12.0 * 10. (lower_leg_height*lower_leg_height + 11. lower_leg_width_x*lower_leg_width_y)}" iyz="0.0" 12. izz="${lower_leg_mass / 12.0 * 13. (lower_leg_width_x*lower_leg_width_y 14. + lower_leg_width_x*lower_leg_width_y)}"/> 15. </inertial>
5.1 MODELADO DEL EXOESQUELETO
51
En último lugar, se modificaron algunas propiedades visuales del resto de eslabones para
crear un diseño personalizado; por ejemplo, cambiando el color en el que los simula Gazebo.
Código 5.9 Gazebo colours
1. <!-- give colors to some links in gazebo --> 2. <gazebo reference="hip_base"> 3. <material>Gazebo/DarkGrey</material> 4. </gazebo> 5. <gazebo reference="hip_aa_frame_left_side"> 6. <material>Gazebo/Grey</material> 7. </gazebo> 8. <gazebo reference="hip_aa_frame_right_side"> 9. <material>Gazebo/Grey</material> 10. </gazebo> 11. <gazebo reference="ankle_plate_left"> 12. <material>Gazebo/Footway</material> 13. </gazebo> 14. <gazebo reference="ankle_plate_right"> 15. <material>Gazebo/Footway</material> 16. </gazebo> 17.
En la Fig se puede contemplar el diseño final del exoesqueleto personalizado, creado a
partir del fichero URDF y simulado en Gazebo.
Fig. 5.5: exoesqueleto creado para la simulación en Gazebo.
5.1 MODELADO DEL EXOESQUELETO
52
De esta forma, cuando se ejecute la simulación roslaunch march_simulation
march_simulation.launch lower_leg_heigh:=<longitud de la tibia>,
aparecerá en el mundo de Gazebo un modelo del exoesqueleto, con una tibia del tamaño que
se ha especificado. A continuación, se muestran algunos ejemplos con distintos parámetros.
(A): tibia = 30 cm (B): tibia = 38 cm (C): tibia = 50 cm
Fig. 5.6: nuevo exoesqueleto con diferentes longitudes de tibias
5.2 Análisis cinemático
Con el objetivo de analizar la capacidad de movimiento del exoesqueleto creado, en este
apartado se lleva a cabo el modelo cinemático, el cual estudia la localización del robot sin
tener en cuenta las fuerzas y/o pares que causan el movimiento. El modelo cinemático directo
obtiene la localización del extremo del robot basándose en el valor de las variables
articulares. Entre los distintos métodos de resolución, destaca el cálculo de las
transformaciones homogéneas, para lo cual se utiliza el Algoritmo Denavit Hartenberg (DH).
Este algoritmo consta de un conjunto de nueve reglas para la definición de los sistemas
de referencia, un conjunto de cuatro reglas para calcular los parámetros DH que relaciona
un sistema de referencia con otro y finalmente dos reglas adicionales para calcular las
matrices de transformación entre la base y el extremo del robot.
5.2 ANÁLISIS CINEMÁTICO
53
En el caso que ocupa este proyecto, el exoesqueleto robótico está formado por las
articulaciones de la cadera, la rodilla, el tobillo, y los eslabones móviles las unen. La cadera
está compuesta por dos articulaciones rotacionales, que conjuntamente proporcionan a la
cadera 2 GDL controlables. Si las referenciamos según el sistema de coordenadas globales,
una de ellas permite la rotación alrededor del eje Z, simulando el movimiento de apertura de
la pierna y la otra permite la rotación alrededor del eje Y, permitiendo el movimiento de
elevación de la pierna.
Por su parte, la rodilla consta de 1 GDL controlable que permite el movimiento alrededor
del eje Y de coordenadas globales, proporcionando la flexión de la pierna. Por último, el
tobillo consta de 1 GDL controlable, que permite el giro alrededor del eje Y de coordenadas
globales, haciendo posible la flexión del tobillo necesaria para poder realizar el patrón de
marcha comentado con anterioridad en este trabajo. Por tanto, el modelado de cada pierna
del exoesqueleto puede representarse como se ve en la Fig.
Fig. 5.7: modelado de una pierna
5.2 ANÁLISIS CINEMÁTICO
54
Los pasos en el algoritmo de Denavit Hartenberg son:
1. Numerar los eslabones comenzando con 1 (primer eslabón móvil) y acabando con n
(último eslabón móvil). Se enumerará como eslabón 0 a la base fija del robot.
2. Numerar cada articulación comenzando por 1 (la correspondiente al primer grado de
libertad) y acabando en n.
Fig. 5.8: pasos 1 y 2 del algoritmo DH
3. Localizar el eje de cada articulación. Como son rotativas, el eje es su propio eje de
giro.
4. Para el eje i, de 0 a n-1, situar el eje zi sobre el eje de la articulación i+1.
5.2 ANÁLISIS CINEMÁTICO
55
Fig. 5.9: pasos 3 y 4 algoritmo DH
5. Situar el origen del sistema de la base S0 en cualquier punto del eje z0. Los ejes x0
e y0 se situarán de modo que formen un sistema dextrógiro con z0.
6. Para i de 1 a n-1, situar el origen del sistema Si en la intersección del eje zi con la
línea normal común a zi-1 y zi. Si ambos ejes se cortasen se situaría Si en el punto de
corte. Si fuesen paralelos situaría Si se situaría en la articulación i+1
7. Situar xi en la línea normal común a zi-1 y zi.
Fig. 5.10: pasos 5-7 algoritmo DH
5.2 ANÁLISIS CINEMÁTICO
56
8. Situar yi de modo que forme un sistema dextrógiro con xi y zi
9. Situar el sistema Sn en el extremo del robot de modo que zn coincida con la dirección
de zn-1 y xn sea normal a zn-1 y zn
Fig. 5.11: pasos 8 y 9 algoritmo DH
Con estas nueve reglas, se definen los sistemas de referencia para cada una de las
articulaciones controlables. A continuación, se citan cuatro las reglas para calcular los
parámetros DH que relaciona un sistema de referencia con otro:
10. θi es el ángulo que habría que girar en torno a zi-1 para que xi-1 y xi queden paralelos.
11. di es la distancia medida sobre zi-1 que habría que desplazar Si-1 para alinear xi-1 y xi
12. ai es la distancia medida sobre xi (que ahora coincidiría con xi-1) que habría que
desplazar el nuevo Si-1 para que su origen coincidiese con Si.
13. αi es el ángulo que habría que girar en torno a xi-1(que ahora coincidiría con xi) para
que el nuevo Si-1 coincidiese totalmente con Si.
Siendo li la longitud del eslabón i, la tabla de parámetros de Denavit Hartenberg de una
pierna del exoesqueleto queda de la siguiente manera:
5.2 ANÁLISIS CINEMÁTICO
57
θ d a α
1 q1 0 -l1 -(π/2)
2 q2-(π/2) 0 -l2 0
3 q3 0 -l3 0
4 q4+(π/2) 0 -l4 0
Tabla 5.1. parámetros Denavit Hartenberg
Una vez establecidos estos parámetros, se pueden utilizar para el cálculo de la cinemática
directa de la pierna, que permite determinar la localización del extremo del robot basándose
en la posición de las articulaciones. Para obtenerla es necesario calcular la matriz de
transformación homogénea i-1Ti de cada articulación usando:
i-1Ti =
[ 𝑐𝑜𝑠𝜃 −𝑐𝑜𝑠𝛼 ∗ 𝑠𝑒𝑛𝜃 𝑠𝑒𝑛𝛼 ∗ 𝑠𝑒𝑛𝜃𝑠𝑒𝑛𝜃 𝑐𝑜𝑠𝛼 ∗ 𝑐𝑜𝑠𝜃 −𝑠𝑒𝑛𝛼 ∗ 𝑐𝑜𝑠𝜃 0 𝑠𝑒𝑛𝛼 𝑐𝑜𝑠𝛼
𝑎 ∗ 𝑐𝑜𝑠𝜃 𝑎 ∗ 𝑠𝑒𝑛𝜃
𝑑0 0 0 1
]
(5.1)
Aplicando esta fórmula, y siendo C=cos y S=sen se obtienen todas las matrices de
transformación. La matriz de transformación de la primera a la segunda articulación; es
decir, la transformación entre los sistemas de referencia de las dos articulaciones rotacionales
que proporcionan el movimiento de la cadera, se puede ver en (5.2).
0T1 =
[ 𝐶(𝑞1) −𝐶(𝜋/2) · 𝑆(𝑞1) 𝑆(−𝜋/2) · 𝑆(𝑞1)
𝑆(𝑞1) 𝐶(−𝜋/2) · 𝐶(𝑞1) −𝑆(−𝜋/2) · 𝐶(𝑞1) 0 𝑆(−𝜋/2) 𝐶(−𝜋/2)
−𝑙1 · 𝐶(𝑞1)
−𝑙1 · 𝐶(𝑞1)0
0 0 0 1 ]
(5.2)
La matriz de transformación 1T2 corresponde a la transformación entre el sistema de
referencia de la segunda articulación de la cadera, que permite la flexión de la misma, y el
sistema de referencia de la articulación de la rodilla. Se puede ver en (5.3).
5.2 ANÁLISIS CINEMÁTICO
58
1T2 =
[ 𝐶(𝑞2 − 𝜋/2) −𝑆(𝑞2 − 𝜋/2) 0
𝑆(𝑞1) 𝐶(−𝜋/2) · 𝐶(𝑞1) −𝑆(−𝜋/2) · 𝐶(𝑞1) 0 0 1
−𝑙2 · 𝐶(𝑞2 − 𝜋/2) −𝑙1 · 𝑆(𝑞2 − 𝜋/2)
00 0 0 1
]
(5.3)
Del mismo modo, 2T3 representa la matriz de transformación entre el sistema de
referencia la articulación de la rodilla y el sistema de referencia del tobillo y se puede ver en
(5.4).
2T3 =
[ 𝐶(𝑞3) −𝑆(𝑞3) 0
𝑆(𝑞3) 𝐶(𝑞3) 0 0 0 1
−𝑙3 · 𝐶(𝑞3)
−𝑙1 · 𝑆(𝑞2 − 𝜋/2)0
0 0 0 1 ]
(5.4)
Por último, la matriz 3T4, la cual se puede ver en (5.5), representa la transformación entre
el sistema de referencia del tobillo y el sistema de referencia del extremo del exoesqueleto,
que se corresponde con la punta del pie.
3T4 =
[ 𝐶(𝑞4 + 𝜋/2) −𝑆(𝑞4 + 𝜋/2) 0
𝑆(𝑞4 + 𝜋/2) 𝐶(𝑞4 + 𝜋/2) 0 0 0 1
−𝑙2 · 𝐶(𝑞4 + 𝜋/2)
−𝑙1 · 𝑆(𝑞4 + 𝜋/2)0
0 0 0 1 ]
(5.5)
La matriz final de transformación, que relaciona el sistema de la base con el del extremo
del robot, se obtiene multiplicando todas las matrices anteriores.
0T4 = 0T1 · 1T2 ·
2T3 · 3T4 =
[ 𝐶(𝑞1)𝐶(𝑞3)𝐶 (𝑞2 −
𝜋
2)𝐶(𝑞4 + 𝜋/2) 0 0
𝑆(𝑞1)𝑆(𝑞3)𝑆 (𝑞2 −𝜋
2) 𝑆(𝑞4 + 𝜋/2) 0 0
0 0 0
𝑙1𝑙22𝑙3𝐶(𝑞3)𝐶 (𝑞2 −𝜋
2)𝐶(𝑞4 + 𝜋/2)
𝑙13𝑙3𝑆(𝑞1)𝑆(𝑞3)𝑆 (𝑞2 −𝜋
2) 𝑆(𝑞4 +
𝜋
2)
0 0 0 0 1
]
(5.6)
5.2 ANÁLISIS CINEMÁTICO
59
Los parámetros de esta matriz se corresponden con los parámetros de rotación y
translación, según (5.7)
i-1Ti =
[ 𝑋𝑥𝑜 𝑒𝑥𝑡𝑟𝑒𝑚𝑜 𝑋𝑦𝑜 𝑒𝑥𝑡𝑟𝑒𝑚𝑜 𝑋𝑧𝑜 𝑒𝑥𝑡𝑟𝑒𝑚𝑜 𝑌𝑥𝑜 𝑒𝑥𝑡𝑟𝑒𝑚𝑜 𝑌𝑦𝑜 𝑒𝑥𝑡𝑟𝑒𝑚𝑜 𝑌𝑧𝑜 𝑒𝑥𝑡𝑟𝑒𝑚𝑜 𝑍𝑥𝑜 𝑒𝑥𝑡𝑟𝑒𝑚𝑜 𝑍𝑦𝑜 𝑒𝑥𝑡𝑟𝑒𝑚𝑜 𝑍𝑧𝑜 𝑒𝑥𝑡𝑟𝑒𝑚𝑜
𝑋0 𝑒𝑥𝑡𝑟𝑒𝑚𝑜 𝑌0 𝑒𝑥𝑡𝑟𝑒𝑚𝑜𝑍0 𝑒𝑥𝑡𝑟𝑒𝑚𝑜
0 0 0 1 ]
(5.7)
5.3 Modificación del patrón de marcha
En este apartado se van a exponer las modificaciones realizadas en el patrón de marcha
respecto al original, de forma que se mejoren los pasos del exoesqueleto, logrando una
marcha más estable y más cercana a la marcha humana.
Una vez creado el URDF del nuevo exoesqueleto y lanzada su simulación, se ejecutó la
interfaz que permite su movimiento. Dicha interfaz se basa en el entorno rqt, un marco de
software de ROS que implementa las diversas herramientas GUI en forma de complementos.
Las herramientas de rqt permiten representaciones gráficas de nodos, temas, mensajes y otra
información de ROS.
Esta interfaz está implementada en ROS 2, por lo cual, es necesario crear un puente entre
ROS 1 y ROS 2, de forma que puedan compartir los topics e intercambiar mensajes. Por
tanto, el proceso para lanzar dicha interfaz es:
1. Configurar el entorno de ROS 1
source /opt/ros/noetic/local_setup.bash
source ~/march/ros1/install/local_setup.bash
2. Configurar el entorno de ROS 2
source /opt/ros/foxy/local_setup.bash
5.3 MODIFICACIÓN DEL PATRÓN DE MARCHA
60
source ~/march/ros2/install/local_setup.bash
3. Abrir el workspace del puente de ROS:
cd ~/ros1_bridge
4. Configurar el entorno:
source install/local_setup.bash
5. Contactar con el master:
export ROS_MASTER_URI=http://localhost:11311
6. Lanzar el puente entre ROS 1 y ROS 2:
ros2 run ros1_bridge dynamic_bridge --bridge-all-topics
Con estos pasos, se ha establecido el puente entre las dos versiones de ROS. Los
siguientes pasos, indican cómo lanzar la interfaz de ROS 2:
7. Configurar el entorno de ROS 2:
source /opt/ros/noetic/local_setup.bash
source ~/march/ros1/install/local_setup.bash
8. Lanzar la interfaz rqt:
ros2 launch march_launch march_ros2_simulation.launch.py
Aparece entonces una ventana emergente con la interfaz, cuyo aspecto se muestra en Fig.
5.3 MODIFICACIÓN DEL PATRÓN DE MARCHA
61
Fig. 5.12: interfaz rqt para mover el exoesqueleto.
De esta forma, se puede seleccionar el tipo de patrón de movimiento que se desea que
realice el exoesqueleto. En primer lugar, se probó a solicitar el patrón “walk”, que permite
mover el exoesqueleto sobre un terreno llano, y se observó que tenía dificultades para
caminar, ya que la punta del pie colisionaba con el suelo. Cuando intentaba dar un paso, se
tropezaba, se resbalaba, balanceaba la pierna y provocaba la pérdida de la estabilidad.
Fig. 5.13: pie colisionando con el suelo
5.3 MODIFICACIÓN DEL PATRÓN DE MARCHA
62
Por tanto, se decidió crear unos patrones de marcha propios para cada uno de los patrones
de marcha, que son llamados desde la interfaz rqt, con el objetivo de eliminar los problemas
detectados en el ciclo de marcha.
Un patrón de marcha, llamado “gait”, está formado por varias fases, como se comentó en
apartados anteriores, llamadas “subgaits”. Cada fase, se implementa en un archivo de tipo
subgait, que contiene el nombre del gait al que pertenece, su nombre, su duración y el valor
que toma cada una de las variables articulares en un periodo determinado por su inicio.
El patrón o gait llamado “walk”, está formado por cinco subgaits:
• Right_open: corresponde al inicio de la marcha, en el cual se parte de un apoyo
doble, con las piernas juntas y se llega hasta un apoyo total de la pierna izquierda,
mientras que la derecha, solo toca el suelo con el talón
• Right_close: corresponde al fin de la marcha, en el cual, se parte de un apoyo total
de la pierna izquierda en el suelo, mientras que la derecha solo toca con el talón y
se llega a un apoyo doble completo para las dos piernas, de forma que quedan
juntas como al inicio de la marcha.
• Left_close: es exactamente lo mismo que el anterior, pero para la pierna contraria.
Corresponde al fin de la marcha, en el cual, se parte de un apoyo total de la pierna
derecha en el suelo, mientras que la izquierda solo toca con el talón y se llega a
un apoyo doble completo para las dos piernas, de forma que quedan juntas como
al inicio de la marcha.
• Right_swing: corresponde a un paso de avance, en el cual la pierna izquierda se
encuentra en constante contacto con el suelo, mientras la derecha realiza un
balanceo. Esta última, está inicialmente tocando el suelo únicamente con la punta
del pie, lo mueve hacia delante y finaliza tocando el suelo únicamente con el talón.
5.3 MODIFICACIÓN DEL PATRÓN DE MARCHA
63
• Left_swing: corresponde a un paso de avance, en el cual la pierna derecha se
encuentra en constante contacto con el suelo, mientras la izquierda realiza un
balanceo. Esta última, está inicialmente tocando el suelo únicamente con la punta
del pie, lo mueve hacia delante y finaliza tocando el suelo únicamente con el talón.
Código 5.10 Ejemplo subgait
1. duration: 1200000000 2. gait_type: walk_like 3. joints: 4. left_ankle: 5. - position: 0.04360007 6. time_from_start: 0 7. velocity: 0.0 8. - position: 0.04360007 9. time_from_start: 1200000000 10. [ . . .. . . . . . . . . . . . . . . ] 11. name: right_swing 12. version: MIV_Sheila 13.
Por su parte, el patrón de marcha se implementa en un archivo del tipo .gait, que consiste
en una máquina de estados, en la cual cada uno de sus estados es un subgait, y la condición
de transición es la finalización de dicho subgait. Comienza desde “right_open” para iniciar
la marcha. Cuando finaliza, realiza una transición hacia “left_swing”, para realizar la fase
de balanceo con la pierna izquierda y cuando finaliza esta, realiza otra transición hasta
“right_swing”, que realiza la fase de balanceo con la pierna derecha. Estas dos fases se
repiten en bucle constantemente hasta que se recibe una señal de paro llamada “stop”. En
ese momento, el estado siguiente de ambas fases cambia, siendo ahora “left_close” el
siguiente estado tras finalizar “right_swing” y “right_close” el siguiente estado tras finalizar
“left_swing”. La estructura de esta máquina de estados puede observarse en el siguiente
código:
Código 5.11 Walk.gait
1. name: walk 2. subgaits: 3. start: 4. to: right_open 5. right_open: 6. to: left_swing
5.3 MODIFICACIÓN DEL PATRÓN DE MARCHA
64
7. left_swing: 8. to: right_swing 9. stop: right_close 10. right_swing: 11. to: left_swing 12. stop: left_close 13. left_close: 14. to: end 15. right_close: 16. to: end
Una vez creado un patrón de marcha propio, especificando el valor de las variables
articulares en cada periodo de tiempo, es necesario establecerlo por defecto, cuando se llame
desde la interfaz rqt. Esto es posible mediante el archivo defautl.yaml, el cual, para cada
patrón de marcha o gait, se establece cuáles son los subgaits que tomará. Por tanto, se
establecen por defecto los MIV_improved para el patrón de marcha “walk”.
Código 5.12 Default.yaml
1. Gaits: 2. walk: 3. right_open: MIV_Sheila 4. left_swing: MIV_Sheila 5. right_swing: MIV_Sheila 6. left_close: MIV_Sheila 7. right_close: MIV_Sheila 8.
El ejecutable march_ros2_simulation.launch.py que se lanza para visualizar la interfaz
rqt, llama a su vez a gait_selection.launch.py. Este, a su vez, carga el nodo
gait_selection.py, que es el que inicia default.yaml, y cuando recibe el tipo de patrón que se
desea utilizar, busca en este archivo su nombre para conocer el nombre de los subgaits que
deben ser empleados.
Ahora, cada vez que se lance la interfaz, y se seleccione el patrón de marcha “walk”,
cargará el nuevo patrón creado.
Con el fin de visualizar de forma gráfica los patrones creados, se utiliza una interfaz,
también creada en rqt, en la cual es posible observar el valor que toman las variables
articulares en cada instante de tipo, para un subgait concreto. Para ello se debe:
5.3 MODIFICACIÓN DEL PATRÓN DE MARCHA
65
1. Configurar el entorno de ROS 1
source /opt/ros/noetic/local_setup.bash
source ~/march/ros1/install/local_setup.bash
2. Lanzar la interfaz: roslaunch march_rqt_gait_generator
march_rqt_gait_generator.launch
Aparece entonces una ventana emergente con el entorno rqt, en el cual es posible
seleccionar un subgait concreto, y se observan gráficamente los valores articulares en el
tiempo, como en la Fig.
Fig. 5.14: gráficas de variables articulares en el tiempo para Right_swing
Como se puede observar, la pierna derecha es la que realiza el balanceo mientras que la
pierna izquierda, permanece prácticamente inmóvil la mayoría de tiempo.
66
5.4 Introducción de obstáculos
El patrón de marcha comentado en el apartado anterior, permite que el exoesqueleto
creado camine sobre un terreno llano y liso. En este apartado, se trata la introducción de
nuevos obstáculos y los patrones de marcha necesarios para que el exoesqueleto pueda
avanzar sin problema.
Los obstáculos son archivos XACRO de ROS, que se pueden introducir en el entorno de
Gazebo, para simularlos junto con el exoesqueleto. Al igual que la longitud de la tibia del
exoesqueleto, es posible indicar por terminal si se desea introducir un obstáculo. El archivo
march_simulation.launch lo carga como argumento y se lo envía a march.launch, que lo
vuelve a recibir como argumento y se lo trasmite a march_world.launch. Una vez
introducidos los obstáculos, se debe observar cómo alteran al patrón de marcha, y corregirlo
en caso de que fuera necesario. Los obstáculos probados son:
• Escaleras: debido a que el exoesqueleto, debe situar la pierna de balanceo en un nivel
superior, el patrón de marcha se ve modificado. En este caso la pierna que produce
el balanceo y, por tanto, el avance, debe tomar un ángulo de 90º tanto para la
articulación de la cadera, que rota en torno al eje Y del sistema de referencia global,
como de la rodilla.
Fig. 5.15: simulación de escaleras
5.4 INTRODUCCIÓN DE OBSTÁCULOS
67
En la siguiente imagen, se puede observar, cómo han aumentado los valores articulares
de la cadera y la rodilla derecha para poder subir la escalera.
Fig. 5.16: patrón subida de escalera con la pierna derecha
• Rampa: el ciclo de marcha es igual que para un terreno llano, con la diferencia de
que el grado de flexión de la articulación de la cadera y la rodilla debe ser mayor para
la pierna que se encuentra a una altura superior y menor para la pierna que se
encuentra a una altura inferior. De esta forma se logra compensar el desnivel.
5.4 INTRODUCCIÓN DE OBSTÁCULOS
68
Fig. 5.17: simulación de la rampa
En la siguiente imagen se puede observar cómo aumenta la flexión de la cadera y la rodilla
de la pierna derecha, que es la que está avanzando hacia arriba, y cómo disminuye para la
cadera y la rodilla de la pierna izquierda, que se queda retrasada a una altura menor.
Fig. 5.18: patrón subida de rampa con la pierna derecha
5.4 INTRODUCCIÓN DE OBSTÁCULOS
69
• Plano inclinado: en este tipo de obstáculo es cuando entra en juego, la articulación
de la cadera que rota en torno al eje X del sistema de referencia global cuando está
de pie y en torno al eje Z cuando está sentado. Esta articulación permite variar el
ángulo que forman las piernas con el torso, que inicialmente es 180º, de forma que,
cuando se encuentre en un plano inclinado, pueda modificarlo para compensar el
peso y aumentar su estabilidad.
Fig. 5.19: simulación en plano inclinado
En esta imagen, se muestra como ahora el ángulo de la primera articulación de la cadera,
no permanece constante como en los otros casos, sino que aumenta para una pierna mientras
disminuye para la contraria.
5.4 INTRODUCCIÓN DE OBSTÁCULOS
70
Fig. 5.20: patrón balanceo pierna izquierda en un plano inclinado
Banco: este patrón es el más simple, y consiste en dar un valor final de 90º tanto a las
articulaciones de la rodilla como de la cadera en ambas piernas.
Fig. 5.21: exoesqueleto sentado en el banco
5.4 INTRODUCCIÓN DE OBSTÁCULOS
71
Como se puede observar, la cadera y la rodilla de ambas piernas, toman un valor final de
aproximadamente 90º, mientras que el resto de articulaciones permanecen constantes.
Fig. 5.22: patrón para sentarse
5.5 Análisis del controlador
A partir de la información adquirida sobre el funcionamiento de ROS_Control, explicada
en capítulos anteriores, en este apartado se analizará el funcionamiento del controlador que
dirige los movimientos del exoesqueleto y se determinará el tipo de control que realiza.
Para saber cuál es el controlador que utiliza, primero es necesario conocer el nombre el
archivo.yaml al que se llama desde march.launch. Si se accede a este archivo, puede
observarse que se llama al nodo que lanza el fichero “march.yaml”. A continuación, de debe
localizar y abrir dicho archivo para ver su contenido. Es posible apreciar que en su
implementación carga dos tipos de controladores: state_controller y
effortControllers/JointTrajectoryController. El primero, como ya se comentó anteriormente,
5.5 ANÁLISIS DEL CONTROLADOR
72
es el encargado de obtener el estado actual de cada una de las articulaciones y el segundo,
por su parte, es el que controla todos los movimientos del robot, y es que se desea analizar
para identificar su tipo de control.
Una vez conocido qué controlador dirige al exoesqueleto, se procede a analizarlo. Es
posible ver que, al igual que todos los controladores implementados con ROS_Control,
consta de cuatro funciones principales con la siguiente implementación:
• Init: en la cual extrae el modelo URDF del robot, el nombre de todas las
articulaciones que posee, el estado actual y deseado de las mismas, y establece la
conexión con todos los topics necesarios para el control.
• Update: en la cual extrae los puntos prefijados en el patrón de marcha seleccionado,
calcula el error en posición actual y llama al archivo hardware_interface, para
realizar la acción de control.
• Start: en la cual inicia el contador del tiempo.
• Stop: en la cual se finaliza el control.
Como se puede apreciar, en la función update que, como se explicó anteriormente,
implementa el control propiamente dicho, llama al archivo hardware_interface enviándole
el error obtenido en posición, velocidad y aceleración, por lo que también es necesario su
análisis para comprender el funcionamiento del controlador. Este archivo contiene una
función llamada updateCommand, equivalente a la función update del controlador de
esfuerzos, en la cual mediante los valores de error y los valores deseados de posición,
velocidad y aceleración, realiza la acción de control como se explicó en el segundo capítulo.
Finalmente, cabe destacar que en el mismo archivo march.yaml donde se invoca al
controlador, se establecen las variables PID de control, así como los límites articulares.
Puesto que el valor de la ganancia integral es nulo para todas las articulaciones, puede
considerarse que se está realizando un control de tipo PD.
73
5.6 Modificaciones del controlador
Con el objetivo de mejorar el controlador, se pretende recudir el error articular, de forma
que el movimiento sea lo más semejante a la marcha humana y lo más fiel al patrón de
marcha preestablecido en el apartado anterior. En este apartado se detallarán los pasos
seguidos y las consideraciones tomadas para poder llevar este proceso a cabo.
El diagrama de bloques mostrado a continuación representa un control realimentado de
la salida de un sistema o planta. La función de transferencia de la planta es 𝑃(𝑠), el
controlador está representado por la función 𝐶(𝑠) y la salida por del sistema 𝑌(𝑠). La
funcionalidad de este sistema de control es alcanzar el valor de la entrada 𝑅(𝑠) para que el
error entre la entrada y la salida, 𝐸(𝑠), sea nulo.
Fig. 5.23: diagrama de bloques de un control con realimentación.
La salida del sistema viene dada por la siguiente expresión:
𝑌(𝑠) = 𝐶(𝑠)𝑃(𝑠)(𝑅(𝑠) − 𝑌(𝑠)) (5.8)
Por lo tanto, resolviendo esta expresión se puede obtener la función de transferencia de
este sistema realimentado:
𝑌(𝑠)
𝑅(𝑠) =
𝐶(𝑠)𝑃(𝑠)
1 + 𝐶(𝑠)𝑃(𝑠) (5.9)
Como se puede ver en esta ecuación, la planta es un sistema de segundo orden, por lo cual
la función de transferencia en bucle cerrado se puede expresar como:
5.6 MODIFICACIONES DEL CONTROLADOR
74
𝑌(𝑠)
𝑅(𝑠) =
𝜔𝑛2
𝑠2+2·𝜁·𝜔𝑛·𝑠+ 𝜔𝑛2 (5.10)
donde ωn es la frecuencia natural del sistema y ζ es la amortiguación. A la ecuación (5.10)
se le denomina función de transferencia estándar de segundo orden. Sus características de
respuesta dependen de los valores de ωn y ζ.
Dado que se pretende controlar la posición de las articulaciones que conforman el
exoesqueleto a partir de comandos de esfuerzos, es necesario considerar cada articulación
como un sistema de segundo orden, igual que el mostrado. La función de transferencia,
aplicada al control fuerza – posición del exoesqueleto se muestra en (5.11).
𝐺(𝑠) =1
𝑠·(𝐽𝑠+𝐵) (5.11)
donde J es el valor inercial de la articulación controlada y B el facto de amortiguamiento.
El controlador PD de posición se muestra en la siguiente expresión:
𝑉𝑚(𝑡) = 𝐾𝑝(θ𝑑(𝑡) − θ𝑙(𝑡) − 𝐾𝑣( 𝑑
𝑑𝑡 θ𝑙(𝑡)) (5.12)
Donde 𝐾𝑝 es la ganancia de control proporcional, 𝐾𝑣 es la ganancia de control derivativa
o de velocidad, θ𝑑(𝑡) es el ángulo de referencia proporcionado al motor, θ𝑙(𝑡) es el ángulo
del eje medido en el bucle de control, y 𝑉𝑚(𝑡) es la tensión de entrada del motor. El diagrama
de bloques del control PD se muestra en siguiente figura.
5.6 MODIFICACIONES DEL CONTROLADOR
75
Fig. 5.24: diagrama de bloques de un control PD de posición.
Para la resolución de los parámetros del controlador PD, es necesario encontrar la función
de transferencia en lazo cerrado θ𝑙(𝑡)/θ𝑑(𝑡).
Transformando la expresión anterior al espacio de Laplace, se tiene que:
𝑉𝑚(𝑠) = 𝑘𝑝(𝜃𝑑(𝑠) − 𝜃𝑙(𝑠)) – 𝑘𝑣 · 𝑠 · 𝜃𝑙(𝑠) (5.13)
Del diagrama de bloques mostrado en la figura anterior, se puede escribir la siguiente
expresión:
𝜃𝑙(𝑠)
𝑉𝑚(𝑠) =
1
𝑠(𝐽𝑠+𝐵) (5.14)
Sustituyendo la ecuación (5.13) en la (5.14), y resolviendo el cociente θ𝑙(𝑡)/θ𝑑(𝑡), se
puede obtener la función de transferencia en bucle cerrado del controlador de posición, que
relaciona el ángulo deseado y el de salida:
𝜃𝑙(𝑠)
𝜃𝑑(𝑠) =
𝐾𝑝
𝐽𝑠2+(1+𝐵·𝐾𝑣)𝑠+𝐾𝑝 (5.15)
5.6 MODIFICACIONES DEL CONTROLADOR
76
Igualando esta ecuación con la (5.1), es posible obtener los valores de 𝐾𝑝 y 𝐾𝑣 en función
de los valores de inercia 𝐽, de amortiguamiento 𝐵, de frecuencia natural 𝜔𝑛 y de
amortiguamiento 𝜁. Para poder despejarlos, es necesario dejar la ecuación (5.15) de la misma
forma que la ecuación (5.1), dividiendo toda la función entre 𝐽, como se muestra a
continuación.
𝐾𝑝
𝐽
𝑠2+(1+𝐵·𝐾𝑣)𝑠
𝐽+𝐾𝑝
𝐽
= 𝜔𝑛2
𝑠2+2·𝜁·𝜔𝑛·𝑠+ 𝜔𝑛2 (5.16)
De esta forma es posible obtener los valores de 𝐾𝑝 y 𝐾𝑣, tal como se muestra en (5.17)
y (5.18).
𝐾𝑝 = 𝜔𝑛 · 𝐽 (5.17)
𝐾𝑣 = 2 · 𝜁 · 𝜔𝑛 · 𝐽 (5.18)
Una vez establecidas todas ecuaciones necesarias para establecer las variables de control,
es necesario obtener los valores específicos para el exoesqueleto. En primer lugar, es
necesario obtener la función de transferencia tal y como se indica en (5.11). El valor 𝐽 se
puede obtener con (5.19)
𝐽 = 𝐼𝑥𝑥 + 𝑚𝑎𝑠𝑠
𝑟𝑒𝑑2 (5.19)
donde 𝐼𝑥𝑥 corresponde al valor de inercia del eslabón contiguo a la articulación, mass es la
masa de dicho eslabón y red corresponde a la relación de reducción de dicha articulación.
Desde el archivo URDF se pueden obtener los valores de 𝐼𝑥𝑥 y de la masa del eslabón
mirando la declaración del link que corresponde al nodo hijo de la articulación a analizar.
Por otro lado, la relación de reducción, se encuentra en la declaración de dicho joint como
“Mechanical Reduction”.
5.6 MODIFICACIONES DEL CONTROLADOR
77
Además, se considera que el valor B para todas las articulaciones es igual a la unidad. Por
lo tanto, las funciones de transferencia para cada una de las articulaciones se obtienen de la
siguiente forma:
• Hip_aa
𝐼𝑥𝑥 = 0.013
mass = 2.9282
red = 200
𝐽 = 0.013 +2.928200
= 0.013075 (5.20)
𝐺1(𝑠) =1
0.013075·𝑠2+𝑠 (5.21)
• Hip_fe
𝐼𝑥𝑥 = 0.127
mass = 4.995
red = 101
𝐽 = 0.127 +4.995101
= 0.1275 (5.22)
𝐺1(𝑠) =1
0.1275·𝑠2+𝑠 (5.23)
• Knee
𝐼𝑥𝑥 = 0.00139·h, donde h es la altura del eslabón de la tibia.
mass = 4.485
red = 101
𝐽 = 0.00139 · ℎ +4.485101
= 0.00139·h+0.045 (5.24)
𝐺1(𝑠) =1
(0.00139·ℎ+0.045)·𝑠2+𝑠 (5.25)
• Ankle
𝐼𝑥𝑥 = 0.021
5.6 MODIFICACIONES DEL CONTROLADOR
78
mass = 1.821
red = 200
𝐽 = 0.021 +1.821200
= 0.03 (5.26)
𝐺1(𝑠) =1
0.03·𝑠2+𝑠 (5.27)
Para obtener los valores de 𝐾𝑝 y 𝐾𝑣 necesarios para el control de cada una de las
articulaciones, se realiza el mismo proceso que se hizo en las ecuaciones de la (5.13) a la
(5.16) con los sistemas de referencia adquiridos. De esta forma, tal y como se mostraba en
(5.17) y (5.18), es posible obtener los valores de 𝐾𝑝 y 𝐾𝑣 para cada uno de ellos.
Dado que se desea mejorar los valores de las ganancias establecidas por defecto, en primer
lugar, se realizará un proceso inverso, y partiendo de los valores 𝐾𝑝 y 𝐾𝑣 establecidos, se
calculará la frecuencia natural ωn y el amortiguamiento 𝜁. A partir de ellos, se endurecen las
especificaciones con el propósito de obtener un tiempo de respuesta menor, según las
siguientes ecuaciones.
𝑡𝑝 =𝜋
𝜔𝑛·√1−𝜁 (5.27)
𝑡𝑠 =𝜋
𝜔𝑛·𝜁 (5.28)
𝑡𝑑 =1+ 𝜁
√2𝜔𝑛
(5.29)
donde 𝑡𝑝 es el tiempo de pico, 𝑡𝑝 es el tiempo de establecimiento y 𝑡𝑑 es el tiempo de
retardo. Si se disminuyen estos tres tiempos, el sistema responderá más rápido reduciendo
el error. Por otra parte, cuando mayor sea el valor de 𝜁, crecerá el amortiguamiento del
sistema y se producirá una menor sobreoscilación. Teniendo todas estas condiciones en
cuenta y endureciendo con ellas las restricciones, se establecen nuevos valores de ganancia
𝐾𝑝 y 𝐾𝑣 para poner a prueba el sistema.
5.6 MODIFICACIONES DEL CONTROLADOR
79
Para poder asignar estos valores al controlador, deben indicarse en el archivo yaml, que
como se comentó en apartados anteriores, inicializa las ganancias a utilizar por el controlador
al que llama.
81
6. Pruebas y experimentación
En este apartado se detallarán cuáles han sido los resultados de las pruebas que se han ido
realizando a lo largo del desarrollo de este proyecto. En primer lugar, se mostrará cómo el
exoesqueleto sigue los patrones de marcha creados y a continuación, se expondrán los
resultados obtenidos con la modificación del controlador.
6.1 Patrones de marcha
Con el propósito de justificar que el exoesqueleto sigue los nuevos patrones de marcha
que fueron creados y establecidos por defecto, se obtiene el valor articular de cada
articulación que forma parte del exoesqueleto en cada instante de tiempo. Esto es posible
gracias al topic de jointState, que publica constantemente dicho valor.
En primer lugar, se analiza el patrón de marcha “walk” que, como se comentó en
apartados anteriores, corresponde a una marcha en un terreno llano y sin inclinación. A
continuación, se muestra la evolución de todas las articulaciones.
Fig. 6.1: articulaciones hip_aa ejecutando el patrón walk.
6.1 PATRONES DE MARCHA
82
Las articulaciones hip_aa, que corresponden a la primera articulación de la cadera, deben
permanecer inmóviles durante este patrón de marcha, lo que explica que su valor sea tan
ínfimo. El hecho de que no sea completamente cero, viene determinado por el error articular,
que se comentará posteriormente.
Fig. 6.2: articulaciones hip_fe para el patrón walk.
La gráfica de color morado corresponde a la segunda articulación de la cadera, hip_fe, de
la pierna izquierda y la de color rosa corresponde a la mima articulación, pero de la pierna
derecha. Esta gráfica muestra las fases de balanceo de la pierna izquierda y derecha. Por
tanto, se puede apreciar cómo se va repitiendo constantemente la curva de balanceo creada
en el patrón de marcha para la cadera, intercalando ambas piernas. Parten desde una posición
de la pierna atrasada, -0.2, hasta una posición de avance de la pierna, 0.5.
Fig. 6.3: articulaciones knee para el patrón walk.
6.1 PATRONES DE MARCHA
83
En la gráfica de la Fig. 6.3, se ve representado en verde la evolución de la rodilla izquierda
y en azul la evolución de la rodilla derecha. Al igual que en el caso anterior, es posible
observar la curva de flexión de la rodilla de ambas piernas que fue creada para elevarlas al
realizar las fases de balanceo. Como se puede apreciar, se flexionan hasta una amplitud de
1.15 durante el balanceo para avanzar, y posteriormente se estiran completamente para servir
de pierna de apoyo. Debido al error, que se comentará posteriormente, el valor de las
articulaciones de la rodilla no se establece completamente a cero durante la fase de apoyo
simple.
Fig. 6.4: articulaciones ankle del patrón walk
En esta última gráfica del patrón “walk”, se aprecian en azul el valor articular del tobillo
izquierdo y el rojo el valor articular del tobillo derecho. A estos se les asignó dos perfiles
trapezoidales, con el fin de flexionar el tobillo para realizar el movimiento de contacto
progresivo con el suelo. Como es posible observar, alcanzan los puntos máximos y se
mantiene en ellos con mucha precisión, sin embargo, la transición hacia ellos no es perfecta
debido a que el contacto con el suelo incrementa el error.
Una vez finalizado el análisis de este patrón de marcha, se realizará el mismo proceso
para los otros cuatro patrones, mostrando la evolución del estado de las articulaciones en
tiempo real y analizando su comportamiento.
A continuación, se muestra el patrón de marcha “stairs”, que permite subir escaleras:
6.1 PATRONES DE MARCHA
84
Fig. 6.5: articulaciones hip_aa para el patrón stairs.
Como pasaba en el patrón anterior, la primera articulación de la rodilla para ambas piernas
debe permanecer inmóvil durante todo el patrón. Sin embargo, se vuelve a apreciar un ligero
error durante todo el movimiento.
Fig. 6.6: articulaciones hip_fee durante el patrón stairs.
Esta gráfica muestra la evolución de las segundas articulaciones de la cadera de ambas
piernas durante la subida de una escalera. La línea verde muestra el movimiento
correspondiente a dicha articulación para la pierna izquierda y la naranja lo mismo para la
pierna derecha. Como se puede apreciar, siguen el perfil de una flexión de 1.3 radianes (75
grados) de la cadera para situar la pierna en el siguiente escalón y a continuación, vuelve a
la posición inicial para realizar la subida.
6.1 PATRONES DE MARCHA
85
Fig. 6.7: articulación knee para el patrón stairs
Este gráfico, muestra en morado la evolución de la articulación de la rodilla izquierda en
morado y de la rodilla derecha en azul. Al igual que la anterior, primero se aprecia una
flexión, en este caso de 1.65 radianes (94 grados), que permite posicionar el pie en el escalón
superior y, posteriormente, vuelve a su posición inicial de extensión total para realizar la
subida. Si se comparan las Fig. 6.6 y 6.7, es posible apreciar que tanto la flexión como la
extensión de la cadera y la rodilla se producen de manera simultánea.
Fig. 6.8: articulación ankle para el patrón stairs.
Como se puede observar, las articulaciones de los tobillos tienen un ligero movimiento,
tal y como se estableció en el patrón de marcha, en el cual realizan un pequeño giro
antihorario. De ahí que la curva aparezca invertida.
6.1 PATRONES DE MARCHA
86
A continuación, se mostrarán los resultados obtenidos para el patrón de marcha “ramp”,
que es útil para subir una pendiente como puede ser la de una rampa:
Fig. 6.9: articulación hip_aa para el patrón ramp.
Al igual que en los otros dos patrones, la primera articulación de la cadera debe
permanecer inmóvil para ambas piernas. Sin embargo, vuelve hacerse presente un pequeño
error articular que implica que esto no se cumpla.
Fig. 6.10: articulación hip_fee para el patrón ramp.
En el caso de la segunda articulación de la cadera, se puede apreciar en la Fig. 6.10, en
color verde para la pierna derecha y en naranja para la izquierda, cómo realizan la curva de
balanceo para lograr el avance del mismo modo que para el patrón “walk”, solo que, en este
6.1 PATRONES DE MARCHA
87
caso, con un valor mayor de flexión al no tratarse de un terreno llano, tal y como se explicó
en la creación de este patrón. Como se puede observar el patrón es seguido de forma correcta.
Fig. 6.11: articulación knee para el patrón ramp.
En la gráfica es posible ver la evolución de las articulaciones de la rodilla para ambas
piernas, representando a derecha en rosa y la izquierda en morado. Al igual que para la
segunda articulación de la rodilla, es posible observar que la curva de flexión de la rodilla
para el balanceo de la pierna es seguida de forma correcta.
Fig. 6.12: articulación ankle para el patrón ramp.
Por último, en la Fig. 6.12, se puede contemplar en verde el patrón del tobillo izquierdo
y en azul el patrón del tobillo derecho. Tal y como se esperaba, el grado de flexión del tobillo,
6.1 PATRONES DE MARCHA
88
es mayor que en otros patrones, dado que el pie no se encuentra en posición horizontal debido
a la pendiente del plano. La diferencia entre las amplitudes de ambos tobillos viene causada
por un error articular que posteriormente será comentado.
Por otro lado, se va a analizar el patrón “tilted_path”, correspondiente a un plano
inclinado que el exoesqueleto debe atravesar:
Fig. 6.13: articulación hip_aa para el patrón tilted_path
Como se comentó en la creación del patrón “tilted_path”, este es el único en el que las
primeras articulaciones de la cadera no permanecen constantes, sino que deben realizar un
pequeño giro para compensar la inclinación del plano a atravesar. Dicho giro es apreciable
en la Fig. 6.13 en la cual se muestra en rojo la pierna izquierda y en azul la derecha. El giro
de la pierna izquierda es positivo y, por tanto, en sentido horario, ya que esta pierna se
encuentra a mayor altura. Sin embargo, el giro de la pierna derecha es negativo y, por tanto,
antihorario, debido a que esta pierna se encuentra a una altura menor. Por tanto, es correcto
afirmar que el patrón para esta articulación se está ejecutando de manera correcta.
6.1 PATRONES DE MARCHA
89
Fig. 6.14: articulación hip_fe del patrón tilted_path.
En esta gráfica se puede observar en verde la segunda articulación de la cadera izquierda
y en naranja la segunda articulación de la pierna derecha. Tal y como se diseñó este patrón,
el movimiento de la pierna derecha, que está a un nivel inferior, tiene mayor amplitud de
movimiento, mientras que la pierna izquierda, tiene una amplitud menor al encontrarse a una
mayor inclinación. Por lo tanto, es posible afirmar que estas articulaciones siguen el patrón
correctamente.
Fig. 6.15: articulación knee para el patrón tilted_path
Lo mismo que se ha comentado para la articulación anterior, sucede para la rodilla. Se
puede ver cómo la amplitud de giro de la rodilla derecha, mostrada en morado, es mayor que
la amplitud de giro de la rodilla izquierda, mostrada en rosa, debido a que cada pierna está
6.1 PATRONES DE MARCHA
90
situada en un nivel de inclinación distinto. Además, cabe destacar, que la rodilla derecha
tiene mayor error al volver al estado previo al movimiento que la rodilla izquierda.
Fig. 6.16: articulación ankle para el patrón tilted_path
Por último, en las articulaciones del tobillo, es posible observar la diferencia de perfiles
para cada uno de ellos, debido a que las condiciones de reposo del pie sobre el suelo no son
las mismas, debido a la inclinación del plano. A pesar del ligero error, ambas articulaciones
siguen los perfiles creados para ellas en el patrón de marcha, por tanto, se obtiene un
resultado satisfactorio.
Finalmente, se mostrarán los resultados del patrón “sit”, que permite al exoesqueleto
sentarse. Como se comentó, este patrón es simple ya que simplemente debe realizar un giro
de 90 grados para las articulaciones segundas de la cadera y las articulaciones de la rodilla.
Fig. 6.17: articulación hip_aa para el patrón sit.
6.1 PATRONES DE MARCHA
91
Como se puede observar, la primera articulación de la rodilla permanece prácticamente
constante, con un ligero error articular.
Fig. 6.18: articulación hip_fe para el patrón sit
Como se puede apreciar, la segunda articulación de la cadera, para ambas piernas, sigue
exactamente el patrón que fue creado, el cual se puede oberservar en la Fig. 5.20 del apartado
5.4 de introducción de obstáculos, alcanzando los 90 grados de giro.
Fig. 6.19: articulación knee para el patrón sit.
Tal y como se puede ver en la Fig. 6.19, la articulación de la rodilla también sigue a la
perfección el patrón creado en el apartado 5.4 de introducción de obstáculos tal y como se
puede ver en Fig. 5.20 alcanzando también los 90 grados de giro.
6.1 PATRONES DE MARCHA
92
Fig. 6.20: articulación ankle del patrón sit
En último lugar, las articulaciones de los tobillos, deben permanecer constantes, como es
el caso del tobillo izquierdo mostrado en verde. Sin embargo, en el tobillo derecho mostrado
en morado, es fácil ver que no sigue fielmente el patrón, debido a una tardía anulación del
error, que se comentará posteriormente.
6.2 Modificación del controlador
Con el objetivo de mostrar los resultados obtenidos con las modificaciones de las
variables 𝐾𝑝 y 𝐾𝑣 del controlador del exoesqueleto, se presentan a continuación una serie
de gráficos y tablas de contenido a modo resumen del efecto logrado en cuanto al error
articular se refiere.
Como se comentó anteriormente en primer lugar se calcularon las especificaciones para
los valores de las ganancias por defecto, 𝐾𝑝 =1000 y 𝐾𝑣 =10, y posteriormente se hicieron
más restrictivas para lograr un mejor comportamiento mediante la reducción del tiempo de
respuesta y por tanto del error. Reduciendo las variables tp, ts y td, los mejores valores
obtenidos fueron de 𝐾𝑝=3000 y 𝐾𝑣 =30, como se muestra en las siguientes tablas:
𝑲𝒑 𝑲𝒗 tp ts td
1000 10 0.023 0.075 0.011
6.2 MODIFICACIÓN DEL CONTROLADOR
93
1000 5 0.03 0.098 0.0118
5000 50 0.021 0.078 0.011
3000 30 0.019 0.057 0.008
Tabla 6.1: gancias para la articulación hip_aa
𝑲𝒑 𝑲𝒗 tp ts td
1000 10 0.021 0.057 0.010
1000 5 0.025 0.083 0.0126
5000 50 0.021 0.062 0.010
3000 30 0.014 0.045 0.006
Tabla 6.2: gancias para la articulación hip_fe
𝑲𝒑 𝑲𝒗 tp ts td
1000 10 0.025 0.057 0.012
1000 5 0.029 0.083 0.014
5000 50 0.025 0.062 0.012
3000 30 0.016 0.045 0.007
Tabla 6.3: gancias para la articulación knee
𝑲𝒑 𝑲𝒗 tp ts td
1000 10 0.022 0.057 0.0103
1000 5 0.025 0.083 0.0114
5000 50 0.021 0.062 0.0103
3000 30 0.014 0.045 0.006
Tabla 6.4: gancias para la articulación ankle
Por tanto, como se puede comprobar en estas tablas a modo resumen, el mejor valor
obtenido para las ganancias es de 𝐾𝑝 =3000 y 𝐾𝑣 =30.
6.2 MODIFICACIÓN DEL CONTROLADOR
94
Para mostrar las diferencias en el error obtenido, se van a exponer una serie de gráficas
para tres de los cinco patrones de marcha creados. En ellas, se representa en color azul el
error obtenido al ejecutar el controlador con los valores que tenía por defecto para las
ganancias y en naranja el error obtenido si se ejecuta el controlador con los nuevos valores
de las ganancias calculados. El primer patrón del cual se representa el error es “walk”:
(A): left hip_aa (B): right hip_aa
Fig. 6.21: errores primera articulación de la cadera en el patrón walk.
Como se puede observar, el error se reduce considerablemente para la primera
articulación de la cadera en ambas piernas mientras ejecuta un patrón de marcha sobre un
terreno llano.
(A): left hip_fe (B): right hip_fe
Fig 6.22: errores segunda articulación de la cadera en el patrón walk
6.2 MODIFICACIÓN DEL CONTROLADOR
95
Como se puede observar, ambos errores toman valores similares, ya que dependiendo del
instante de tiempo uno supera a otro y viceversa. Por tanto, se pude deducir, que no supone
un error ni mayor ni menor la modificación de las ganancias.
(A): left knee (B): right knee
Fig. 6.23: errores articulación de la rodilla para el patrón walk.
Para las articulaciones de las rodillas si que es posible notar una mejoría en el error
articular, ya que, en cualquier instante de tiempo, la amplitud del error obtenido con las
nuevas ganancias es menor al obtenido con las ganancias por defecto. Por tanto, es correcto
afirmar que los nuevos valores calculados reducen el error articular de las rodillas.
(A): left ankle (B): right ankle
Fig. 6.24: error articulación del tobillo para el patrón walk.
6.2 MODIFICACIÓN DEL CONTROLADOR
96
Es posible observar, como se comentó en el punto anterior, que los errores articulares de
los tobillos en ciertos momentos ascienden en gran medida y necesitan bastante tiempo para
estabilizarse. Esto sucede tanto para las ganancias que utilizaba el controlador por defecto,
como para las nuevas ganancias obtenidas. Por este motivo, no se puede afirmar una mejoría
en la respuesta frente al movimiento de las articulaciones del tobillo.
El segundo patrón del cual se procede a analizar su error es el correspondiente a la subida
de unas escaleras. Los errores obtenidos al ejecutar el patrón “stairs” aparecen en las
siguientes gráficas:
(A): left hip_aa (B): right hip_aa
Fig. 6.25: errores primera articulación de la cadera para el patrón stairs.
Como se puede contemplar, el error inferior en prácticamente todo instante de tiempo
para la pierna izquierda y considerablemente inferior durante todo el tiempo para la pierna
derecha. Por tanto, se puede afirmar, que las nuevas ganancias calculadas disminuyen el
error de esta articulación durante la subida de escaleras.
6.2 MODIFICACIÓN DEL CONTROLADOR
97
(A): left hip_fe (B): right hip_fe
Fig. 6.26: error segunda articulación de la cadera para el patrón stairs.
Si se observan ambas gráficas es posible ver cómo el error articular se vuelve a reducir
para ambas piernas en todo momento, haciendo patente el hecho de que la introducción de
las nuevas ganancias reduce de manera considerable el error de esta articulación, la cual es
una de las dos más importantes para realizar una subida de escaleras.
(A): left knee (B): right knee
Fig. 6.27: error articulación de la rodilla para el patrón stairs.
La rodilla es otra de las dos articulaciones más importantes para el patrón de subida de
escaleras y, como se puede ver en estas gráficas de la Fig. 6.27, introduciendo el nuevo valor
de las ganancias calculadas el error articular se reduce de manera considerable frente al error
obtenido si se ejecuta el controlador con los valores de ganancias fijados por defecto.
6.2 MODIFICACIÓN DEL CONTROLADOR
98
(A): left ankle (B): right ankle
Fig. 6.28: error articulación del tobillo para el patrón stairs.
Al igual que sucedía con el patrón de marcha anterior y como se comentó en apartados
previos, el error articular del tobillo aumenta considerablemente en ciertos instantes de
tiempo, debido a su apoyo en el suelo. En la figura de la izquierda se puede ver el error del
tobillo izquierdo, el cual está en el escalón inferior, que se reduce con la introducción de
nuevas ganancias, y en la figura de la derecha el error del tobillo derecho, el cual está en el
escalón superior, que permanece inferior durante la mayoría del tiempo, salvo en momento
acotado. Por tanto, se puede afirmar que se reduce el error si el pie está en el escalón inferior,
pero no si se encuentra en el escalón superior de subida.
Como se ha podido observar con todas estas gráficas, las nuevas ganancias calculadas
permiten un mejor control para el patrón de subida de escaleras, reduciendo
considerablemente el error de la segunda articulación de la cadera y la rodilla, que son las
principales fuentes de movimiento, y mejorando en cierto modo el error de la primera
articulación de la cadera y del tobillo.
En último lugar, se muestran los errores articulares obtenidos para el patrón que permite
al exoesqueleto tomar asiento. El patrón “sit”, como ya se comentó, realiza movimientos
mediante las articulaciones de la cadera, “hip_fe” y de la rodilla, “knee”:
6.2 MODIFICACIÓN DEL CONTROLADOR
99
(A): left hip_aa (B): right hip_aa
Fig. 6.29: error primera articulación de la cadera para el patrón sit.
Como se comentó en la explicación de este patrón, la primera articulación de la cadera
debe permanecer inmóvil, y esto se consigue en mayor medida con la introducción de las
nuevas ganancias calculadas que con las ganancias por defecto. Se puede observar que el
error se reduce de manera considerable para las articulaciones de ambas piernas.
(A): left hip_fe (B): right hip_fe
Fig. 6.30: error segunda articulación de la cadera para el patrón sit.
Es posible contemplar en las gráficas de la Fig. 6.30 cómo se reduce en gran medida en
error de las segundas articulaciones de la cadera que, como se comentó, son encargadas de
la mitad del movimiento necesario para que el exoesqueleto pueda sentarse. Por tanto, es
6.2 MODIFICACIÓN DEL CONTROLADOR
100
correcto afirmar, que la introducción de las nuevas ganancias mejora los resultados del
patrón “sit” para las articulaciones segundas de la cadera.
(A): left knee (B): right knee
Fig. 6.31: error articulación de la rodilla para el patrón sit.
Las articulaciones de la rodilla son las encargadas de la otra mitad del movimiento
necesario para ejecutar este patrón de tomar asiento. Como se puede observar, mediante la
introducción de los nuevos valores de ganancias calculados, se logra una gran reducción del
error articular y se consiguen, por tanto, unos movimientos más precisos, que lo aproximan
en mayor medida a su objetivo.
(A): left ankle (B); right ankle
Fig. 6.32: error articulaciones del tobillo para el patrón sit
6.2 MODIFICACIÓN DEL CONTROLADOR
101
En último lugar, como ya se explicó en apartados anteriores debe permanecer inmóvil,
pero se introduce un pequeño error que lo impide. Este error se produce tanto con los valores
de ganancia establecidos inicialmente como con los nuevos valores de ganancia calculados.
Sin embargo, con la introducción de los nuevos valores, se logra que este error se disminuya
para ambas piernas, notándose un efecto mayor en la pierna derecha.
Como se ha expuesto, utilizando los valores de ganancia calculados en este trabajo, se
obtienen unos errores mucho menores para la gran mayoría de las articulaciones que
conforman el exoesqueleto si este realiza un patrón para sentarse.
103
7. Conclusiones
En este último apartado, tras exponer todo el contenido de este trabajo, primero, se
exponen las consecuencias que son fruto de este trabajo y, a continuación, se realiza un
recorrido por los distintos trabajos futuros que pueden partir del presente trabajo.
En primer lugar, se ha realizado una introducción a la robótica, centrándose
posteriormente en el área de la robótica de servicios, en la que se ha expuesto su definición,
clasificación en función de la tarea que realiza, su relación con el ser humano y el tipo de
interacción. Además, se han expuesto los objetivos y casos de uso de la robótica de
rehabilitación.
A continuación, ha tenido lugar un estudio sobre marcos teóricos como las ventajas de
utilizar la robótica de rehabilitación, los tipos de dispositivos de rehabilitación, y los distintos
exoesqueletos vestibles de miembro inferior, entre los cuales se escogió el exoesqueleto
MARCH. Se ha explicado también las fases de la marcha humana y cómo se pueden alterar
tras sufrir un accidente. Por otro lado, se ha mostrado el marco teórico del control de robots,
haciendo un recorrido por la cinemática, el control cinemático, la dinámica, el control
dinámico y los controladores dinámicos multiarticulares, entre los que se han destacado el
controlador PD y el controlador PID.
Posteriormente, se ha realizado una introducción a ROS y ROS_control y se ha explicado
el funcionamiento de los controladores, desglosándolo en sus componentes y detallando la
interconexión de los mismos para lograr su ejecución.
7. CONCLUSIOENES
104
En el siguiente punto, se ha explicado todo el desarrollo que ha supuesto este proyecto.
Se ha comenzado con el modelado del exoesqueleto, desde su diseño hasta su análisis
cinemático. Se ha continuado, realizando su simulación, en el cual tras un análisis del patrón
de marcha se ha visto necesario realizar una mejora del mismo. Además, se ha examinado
su comportamiento ante distintos obstáculos y terrenos, para poder adaptar los patrones de
marcha necesarios para hacerles frente. Finalmente, se ha explicado cómo es el
funcionamiento del controlador, desglosando las partes del mismo, según el esquema
expuesto en el punto anterior e identificando el tipo de control que realiza. Además, se han
realizado una serie de mejoras en el controlador, mediante la modificación de las ganancias
proporcionales y derivativas, con lo que se han endurecido las especificaciones para reducir
el error.
En último lugar, se han mostrado los resultados obtenidos, primero demostrando el
seguimiento de los nuevos patrones diseñados para distintos obstáculos y a continuación,
detallando los resultados obtenidos para las ganancias calculadas, de forma que se muestran
tanto las nuevas especificaciones como la variación del error. Ha sido demostrado que, con
el nuevo valor de ganancias calculado, se mejora el comportamiento de cuatro de las ocho
articulaciones para el patrón de marcha que permite caminar en un terreno llano y se ha
mejorado con creces el comportamiento del exoesqueleto cuando este sube una escalera o
toma asiento.
Con todo esto, es posible concluir, que todos los objetivos propuestos en este trabajo se
han cumplido satisfactoriamente.
7.1 Trabajos futuros
Tras la finalización de este trabajo, quedan todavía diversos campos de estudio que
pueden partir del mismo, puesto que existen infinidad de mejoras tanto para la simulación
como para el control.
Por un lado, uno de los posibles trabajos futuros sería la creación de patrones de marcha
para nuevas situaciones como terrenos rocosos, con distintos valores de fricción, etc., que
7.1 TRABAJOS FUTUROS
105
permitan crear una experiencia totalmente real en la utilización del exoesqueleto. Además,
el diseño del exoesqueleto puede ampliarse, creando eslabones para el fémur, pie, caderas y
cintura ajustable a distintos tamaños, usando exactamente el mismo método que se ha
expuesto en este trabajo.
De otra parte, el control podría extenderse no solo a la mejora de las ganancias, sino a la
introducción de nuevos controladores dinámicos multiarticulares de posicionamiento, como
el control PD con compensación precalculada de gravedad o incluso con la introducción de
controladores dinámicos multiarticulares de seguimiento, como es el control por Par
Calculado, que se intentó llevar a cabo en este trabajo. Debido a la gran cantidad de
controladores dinámicos existentes, la cantidad de posibles trabajos futuros puede
considerarse prácticamente ilimitada.
107
Bibliografía
1. Jegat, J., Barray, V., Morel, V., Mauduyt de la Greve, I., Le Metayer, M., Lacert, P.
"Rehabilitacion en caso de paralisis cerebral," Enciclopedia Médica Quirúrgica.
(Elsevier, Paris-France),Kinesioterápia,Medicina Física y Readaptación, 26-480-A-
10, pág. 28, 1995.
2. Hamonet, C. L., Heuleu, J.N. “Manual de Rehabilitacion,” París: MASSON, 1990.
3. Hall, C., M Brody, L.T. "Ejercicio terapéutico Recuperación funcional," España:
Paidotribo, 2006.
4. Neiger, H., Gosselin, P., Lacomba, M. T. "Fisioterapia tecnicas pasivas," España :
Médica Panamericana, 1998.
5. Newport R. “The benefits of robot-assisted rehabilitation on the recovery of motor
and visuospatial function in individuals recovering from stroke”. pp 66-73, 2007.
6. Neuron, “Beneficios de la terapia robótica en la rehabilitación del paciente”, 2020.
7. Foundation Cochrane, “Las ventajas de la terapia rehabilitadora con robots en
pacientes con ictus”, 2017.
8. García M. “Los Exoesqueletos Robóticos Pueden Proporcionar Beneficios de Salud
para Personas”, 2019.
8. BIBLIOGRAFÍA
108
9. The Global Burden of Disease: “a comprehensive assessment of mortality and
disability from diseases, injuries, and risk factors in 1990 and projected to 2020”.
Boston: Harvard University Press; 1996.
10. Krebs HI, Ferraro M, Buerger SP, Newbery MJ, Makiyama A, Sandmann M, et al:
“Rehabilitation robotics: pilot trial of a spatial extension for MIT-Manus J
Neuroengineering Rehabil”, pp. 5, 2004.
11. Gassert R. and Dietz V.: “Rehabilitation robots for the treatment of sensorimotor
deficits: a neurophysiological perspective”, 2018.
12. R. Colombo, V. Sanghineti, “Rehabilitation Robotics: Technology and Application”,
Academic Press, 2018.
13. B. Siciliano, O. Khatib, “Springer Handbook of Robotics 2nd Edition”, Springer,
2016.
14. https://exoskeletonreport.com/product/armeopower/
15. https://exoskeletonreport.com/product/lokomat/
16. https://exoskeletonreport.com/product/kineassist/
17. https://www.universal-robots.com/products/ur5-robot/
18. https://exoskeletonreport.com/product/amadeo/
19. https://exoskeletonreport.com/product/myopro/
20. https://rewalk.com/
21. https://www.rexbionics.com/
109
22. https://grupoadd.es/el-robot-hal
23. https://www.technaid.com/es/productos/robotic-exoskeleton-exo-h3/
24. https://www.gogoa.eu/hank
25. https://www.projectmarch.nl/nl/march-vi-exoskeleton
26. Masia, L., Xiloyannis, M., Binh-Khanh, D., Antuvan, C. W., Contu, S. y Kim, G. K.
“Actuation for Robot-Aided Rehabilitation: Design and Control Strategies,”
Rehabilitation Robotics (Chapter 4), Elsevier, 2018.
27. A. Martín, J L., J. Orejuela, F J. Barbero, C. Sánchez, “Human walking phases”, pp
44-49, 1999.
28. Rodríguez I., “Entrenamiento robótico como medio de rehabilitación para la
marcha”, pp 46-54, 2012.
29. M.E. Raffino. "Cinemática". 2021.
30. Gianluca A., Stefano C., Giuseppe F., “Kinematic Control of Redundant
Manipulators with On-Line End-Effector Path Tracking Capability Under Velocity
and Acceleration Constraints, Volume 33, Issue 27, pp 183-188, 2000.
31. Pomares J., Torres F., Gil P., Puente S., Aracil R., “Robots y sistemas sensoriales”,
2002.
32. Barrientos, A., Peñín, L. F., Balaguer, C., Aracil, R. “Fundamentos de Robótica”,
McGraw-Hill, Madrid (2007)
33. Siciliano, B., Sciavicco, L., Villani, L., Oriolo, G. “Robotics: Modelling, Planning
and Control”, Springer-Verlag, London (2010)
8. BIBLIOGRAFÍA
110
34. Craig, J. J. “Introduction to Robotics: Mechanics and Control”, Pearson Prentice
Hall, (2017)
35. Duyar, Izzet y Pelin, Can, “Body height estimation based on tibia length in different
stature groups”. September 2003.
36. M.T. Belmonte; J.L. Sánchez Blanque; I. Alemán y M.C. Botella, “Estimation of
stature from tibia length in female adult contemporary Spanish population” vol.17
Málaga abr./jun. 2011.
37. http://wiki.ros.org/es/ROS
38. http://wiki.ros.org/ros_control
39. http://wiki.ros.org/Books
40. https://www.theconstructsim.com/robotigniteacademy_learnros/ros-courses-
library/ros-control-101/
41. https://docs.projectmarch.nl/doc/useful_tools/ros_control.html
42. https://docs.projectmarch.nl/doc/march_packages/march_simulation.html
111
Lista de Acrónimos y Abreviaturas
ACV Accidentes CardioVasculares
DH Denavit Hartenberg
GUI Graphical User Interface
PD Proporcional Derivativo
PID Proporcional Integral Derivativo
ROS Robot Operating System
STL STereoLithography
TFG Trabajo Final de Grado
URDF Unified Robotic Description Format
XACRO Extensible Macros
XML Extensible Markup Language
113
A. Anexo I: Código URDF del exoesqueleto creado
Código A: march_improved.xacro
1. <?xml version="1.0"?> 2. <!-- Revolute-Revolute Manipulator --> 3. <robot name="march" xmlns:xacro="http://www.ros.org/wiki/xacro"> 4. <!-- Switch between airgaiting or standing on the ground--> 5. <!-- Value set to: 'world' fixes the robot to the world--> 6. <!-- Value set to: 'base_link' makes the robot stand on the ground also set
launch parameter fixed to false and set 7. the hover_height to 0.0. Set ground_gait to true to ground gait in
simulation.--> 8. <xacro:arg name="ground_gait" default="false"/> 9. 10. <!-- Switch between using the physical camera and the simulation camera --> 11. <!-- If set to 'true', no physical camera is needed --> 12. <!-- If this value is set to 'false', the plugin will not be started and the
topics --> 13. <!-- published by the real camera will be used. --> 14. <!-- In both these situations the camera will still be visible and placed in
the urdf,--> 15. <!-- to be used for the transformations.--> 16. <xacro:arg name="realsense_simulation" default="false"/> 17. 18. <xacro:unless value="$(arg ground_gait)"> 19. <xacro:property name="parent_name" value="world"/> 20. <xacro:property name="hover_height" value="0.3"/> 21. </xacro:unless> 22. <xacro:if value="$(arg ground_gait)"> 23. <xacro:property name="parent_name" value="base_link"/> 24. <xacro:property name="hover_height" value="0.0"/> 25. <gazebo> 26. <plugin name="com_controller_plugin"
filename="libmarch_gazebo_plugins.so"/> 27. </gazebo> 28. </xacro:if> 29. 30. <!-- The max effort of the rotary joints is lower then the value
corresponding to 25A, because short-circuit errors 31. have occured while applying the theoretical max effort for a long time. --> 32. <xacro:arg name="max_effort_rotary" default="18000.0" /> 33. <xacro:arg name="max_effort_linear" default="22932.0" /> <!-- = 28 A --> 34. <xacro:property name="max_effort_rotary" value="$(arg max_effort_rotary)" /> 35. <xacro:property name="max_effort_linear" value="$(arg max_effort_linear)" /> 36. 37. <!-- Values for the safety limits, see
https://wiki.ros.org/pr2_controller_manager/safety_limits --> 38. <xacro:arg name="k_velocity_value_hfe" default="20000.0" /> 39. <xacro:arg name="k_velocity_value_kfe" default="20000.0" />
114
40. <xacro:arg name="k_velocity_value_haa" default="20000.0" /> 41. <xacro:arg name="k_velocity_value_adpf" default="20000.0" /> 42. <xacro:property name="k_velocity_value_hfe" value="$(arg
k_velocity_value_hfe)" /> 43. <xacro:property name="k_velocity_value_kfe" value="$(arg
k_velocity_value_kfe)" /> 44. <xacro:property name="k_velocity_value_haa" value="$(arg
k_velocity_value_haa)" /> 45. <xacro:property name="k_velocity_value_adpf" value="$(arg
k_velocity_value_adpf)" /> 46. 47. <xacro:arg name="k_position_value_hfe" default="14.88" /> 48. <xacro:arg name="k_position_value_kfe" default="14.88" /> 49. <xacro:arg name="k_position_value_haa" default="4.0" /> 50. <xacro:arg name="k_position_value_adpf" default="5.0" /> 51. <xacro:property name="k_position_value_hfe" value="$(arg
k_position_value_hfe)" /> 52. <xacro:property name="k_position_value_kfe" value="$(arg
k_position_value_kfe)" /> 53. <xacro:property name="k_position_value_haa" value="$(arg
k_position_value_haa)" /> 54. <xacro:property name="k_position_value_adpf" value="$(arg
k_position_value_adpf)" /> 55. 56. <!-- Constants for robot dimensions --> 57. <!-- Masses determined in Catia, see
https://confluence.projectmarch.nl:8443/display/51/URDF+description --> 58. <xacro:property name="width" value="0.05"/> <!-- Square dimensions
(widthxwidth) of beams --> 59. 60. <xacro:property name="hip_base_height" value="0.160"/> 61. <xacro:property name="hip_base_mass" value="8.686"/> 62. <!-- mass = Hip base + HAA actuators --> 63. 64. <xacro:property name="hip_aa_frame_height" value="0.170"/> 65. <xacro:property name="hip_aa_frame_width" value="0.1395"/> 66. <xacro:property name="hip_aa_mass" value="2.982"/> 67. <!-- mass = Moving hip --> 68. 69. <xacro:property name="upper_leg_height" value="0.385"/> 70. <xacro:property name="upper_leg_offset" value="0.04"/> 71. <xacro:property name="upper_leg_mass" value="4.995"/> 72. <!-- mass = KFE joint + HFE joint + Upper leg --> 73. 74. <xacro:arg name="lower_leg_height" default="0.385" /> 75. <xacro:property name="lower_leg_height" value="$(arg lower_leg_height)"/> 76. <xacro:property name="lower_leg_mass" value="4.458"/> 77. <xacro:property name="lower_leg_width_x" value="0.075"/> 78. <xacro:property name="lower_leg_width_y" value="0.05"/> 79. <xacro:property name="support_mass" value="1"/> 80. 81. <!-- mass = Ankle actuator + Lower leg --> 82. 83. <xacro:property name="ankle_plate_height" value="0.12"/> 84. <xacro:property name="ankle_plate_offset" value="0.05"/> 85. 86. 87. <xacro:property name="foot_height_forward" value="${0.184}"/> 88. <xacro:property name="foot_height_backward" value="${0.059}"/> 89. <xacro:property name="foot_mass" value="1.821"/> 90. <xacro:property name="foot_mu1" value="1"/>
115
91. <xacro:property name="foot_mu2" value="1"/> 92. <!-- Minimum allowable depth before contact correction impulse is applied. --
> 93. <xacro:property name="foot_min_depth" value="0.0005"/> 94. <!-- mass = Passive ankle + foot --> 95. 96. <!-- Center of Mass (CoM) of the parts --> 97. <!-- CoM has been determined in Catia, see
https://confluence.projectmarch.nl:8443/display/51/URDF+description --> 98. <!-- The Catia locations were defined in a global coordinate system with the
origin at the center of the 99. rotation axis of the two HFE joints. Here, the joints were all set at
zero degrees. Hence, we need some 100. translations to transfer it to the reference frame of each of the
parts. Note that in the Catia x axis is 101. the URDF y axis and the Catia y axis is the negative URDF x axis. The
given CoM are for the right leg, 102. the y coordinate will be inverted for the left leg. --> 103. <xacro:property name="hip_base_com_x" value="${-hip_aa_frame_width +
0.147989}"/> 104. <xacro:property name="hip_base_com_y" value="0.016341"/> 105. <xacro:property name="hip_base_com_z" value="0.147761"/> 106. 107. <xacro:property name="hip_aa_com_x" value="${-hip_aa_frame_width +
0.108094}"/> 108. <xacro:property name="hip_aa_com_y" value="${-hip_base_height/2 -
hip_aa_frame_height + 0.197758}"/> 109. <xacro:property name="hip_aa_com_z" value="0.029507"/> 110. 111. <xacro:property name="upper_leg_com_x" value="0.000709"/> 112. <xacro:property name="upper_leg_com_y" value="${-hip_base_height/2 -
hip_aa_frame_height + 113. upper_leg_offset +
0.215254}"/> 114. <xacro:property name="upper_leg_com_z" value="-0.19205"/> 115. 116. <xacro:property name="lower_leg_com_x" value="-0.00321"/> 117. <xacro:property name="lower_leg_com_y" value="${-hip_base_height/2 -
hip_aa_frame_height + 118. upper_leg_offset +
0.184081}"/> 119. <xacro:property name="lower_leg_com_z" value="${upper_leg_height -
0.527082}"/> 120. 121. <xacro:property name="foot_com_x" value="-0.028926"/> 122. <xacro:property name="foot_com_y" value="${-hip_base_height/2 -
hip_aa_frame_height + 123. upper_leg_offset +
ankle_plate_offset + 0.155916}"/> 124. <xacro:property name="foot_com_z" value="${upper_leg_height +
lower_leg_height + ankle_plate_height - 0.789788}"/> 125. 126. <xacro:property name="foot_scale" value="1.35"/> 127. <xacro:arg name="foot_size" default="1" /> 128. <xacro:property name="foot_size" value="$(arg foot_size)"/> 129. 130. <!-- Inertia of the parts --> 131. <!-- Inertia's have been determined in Catia, see 132. https://confluence.projectmarch.nl:8443/display/51/URDF+description --
>
116
133. <!-- The inertia's were defined around the CoM. Note that in the Catia x axis is the URDF y axis and the Catia y
134. axis is the negative URDF x axis, see confluence for the impact. The given inertia's are for the right leg,
135. Ixy and Iyz will be inverted for the left leg. --> 136. <xacro:property name="hip_base_Ixx" value="0.141"/> 137. <xacro:property name="hip_base_Ixy" value="0.0000336"/> 138. <xacro:property name="hip_base_Ixz" value="-0.007"/> 139. <xacro:property name="hip_base_Iyy" value="0.087"/> 140. <xacro:property name="hip_base_Iyz" value="0.0005089"/> 141. <xacro:property name="hip_base_Izz" value="0.091"/> 142. 143. <xacro:property name="hip_aa_Ixx" value="0.013"/> 144. <xacro:property name="hip_aa_Ixy" value="0.008"/> 145. <xacro:property name="hip_aa_Ixz" value="0.005"/> 146. <xacro:property name="hip_aa_Iyy" value="0.023"/> 147. <xacro:property name="hip_aa_Iyz" value="-0.001"/> 148. <xacro:property name="hip_aa_Izz" value="0.028"/> 149. 150. <xacro:property name="upper_leg_Ixx" value="0.127"/> 151. <xacro:property name="upper_leg_Ixy" value="0.0001291"/> 152. <xacro:property name="upper_leg_Ixz" value="-0.0002056"/> 153. <xacro:property name="upper_leg_Iyy" value="0.122"/> 154. <xacro:property name="upper_leg_Iyz" value="0.016"/> 155. <xacro:property name="upper_leg_Izz" value="0.015"/> 156. 157. <xacro:property name="lower_leg_Ixx" value="0.075"/> 158. <xacro:property name="lower_leg_Ixy" value="-0.027"/> 159. <xacro:property name="lower_leg_Ixz" value="-0.008"/> 160. <xacro:property name="lower_leg_Iyy" value="0.11"/> 161. <xacro:property name="lower_leg_Iyz" value="-0.002"/> 162. <xacro:property name="lower_leg_Izz" value="0.071" /> 163. 164. <xacro:property name="foot_Ixx" value="0.021"/> 165. <xacro:property name="foot_Ixy" value="-0.002"/> 166. <xacro:property name="foot_Ixz" value="0.02"/> 167. <xacro:property name="foot_Iyy" value="0.027"/> 168. <xacro:property name="foot_Iyz" value="0.004"/> 169. <xacro:property name="foot_Izz" value="0.01" /> 170. 171. 172. <!-- Joint properties --> 173. <!-- For limit calculations, see
https://confluence.projectmarch.nl:8443/pages/viewpage.action?pageId=268697604 -->
174. <xacro:property name="left_hip_fe_rotation_lower_limit" value="${-21.04431152*pi/180}"/> <!-- rad -->
175. <xacro:property name="left_hip_fe_rotation_upper_limit" value="${98.97033691*pi/180}"/> <!-- rad -->
176. 177. <xacro:property name="right_hip_fe_rotation_lower_limit" value="${-
20.23406982*pi/180}"/> <!-- rad --> 178. <xacro:property name="right_hip_fe_rotation_upper_limit"
value="${99.48120117*pi/180}"/> <!-- rad --> 179. 180. <xacro:property name="hip_fe_soft_buffer" value="${3*pi/180}"/> <!-- rad --
> 181. <xacro:property name="hip_fe_effort_limit" value="${max_effort_rotary}"/>
<!-- IU --> 182. <xacro:property name="hip_fe_velocity_limit" value="2.0"/> <!-- rad/s --> 183.
117
184. <xacro:property name="left_hip_aa_rotation_lower_limit" value="${-18.54492188*pi/180}"/> <!-- rad -->
185. <xacro:property name="left_hip_aa_rotation_upper_limit" value="${16.34765625*pi/180}"/> <!-- rad -->
186. 187. <xacro:property name="right_hip_aa_rotation_lower_limit" value="${-
18.10546875*pi/180}"/> <!-- rad --> 188. <xacro:property name="right_hip_aa_rotation_upper_limit"
value="${15.99609375*pi/180}"/> <!-- rad --> 189. 190. <xacro:property name="hip_aa_soft_buffer" value="${3.5*pi/180}"/> <!-- rad
--> 191. <xacro:property name="hip_aa_effort_limit" value="${max_effort_linear}"/>
<!-- IU --> 192. <xacro:property name="hip_aa_velocity_limit" value="1.0"/> <!-- rad/s --> 193. 194. <xacro:property name="left_knee_rotation_lower_limit" value="${-
5.012512207*pi/180}"/> 195. <xacro:property name="left_knee_rotation_upper_limit"
value="${112.4230957*pi/180}"/> 196. 197. <xacro:property name="right_knee_rotation_lower_limit" value="${-
4.89440918*pi/180}"/> 198. <xacro:property name="right_knee_rotation_upper_limit"
value="${115.3097534*pi/180}"/> 199. 200. <xacro:property name="knee_extension_soft_buffer" value="${3.5*pi/180}"/>
<!-- rad --> 201. <xacro:property name="knee_flexion_soft_buffer" value="${3*pi/180}"/> <!--
rad --> 202. <xacro:property name="knee_effort_limit" value="${max_effort_rotary}"/> <!-
- IU --> 203. <xacro:property name="knee_velocity_limit" value="2.5"/> 204. 205. <xacro:property name="left_ankle_rotation_lower_limit" value="${-
26.30401611*pi/180}"/> 206. <xacro:property name="left_ankle_rotation_upper_limit"
value="${15.88348389*pi/180}"/> 207. 208. <xacro:property name="right_ankle_rotation_lower_limit" value="${-
23.203125*pi/180}"/> 209. <xacro:property name="right_ankle_rotation_upper_limit"
value="${14.23828125*pi/180}"/> 210. 211. <xacro:property name="ankle_dorsalflexion_soft_buffer"
value="${5*pi/180}"/> <!-- rad --> 212. <xacro:property name="ankle_plantarflexion_soft_buffer"
value="${3*pi/180}"/> <!-- rad --> 213. <xacro:property name="ankle_effort_limit" value="${max_effort_linear}"/>
<!-- IU --> 214. <xacro:property name="ankle_velocity_limit" value="1.0"/> 215. 216. 217. 218. <xacro:property name="camera_link" value="0.05"/> <!-- Size of square
'camera' box --> 219. <xacro:property name="axel_offset" value="0.05"/> <!-- Space btw top of
beam and the each joint --> 220. 221. <!-- Import all Gazebo-customization elements, including Gazebo colors --> 222. <xacro:include filename="march.gazebo"/>
118
223. 224. <material name="blue"> 225. <color rgba="0 0 0.6 1"/> 226. </material> 227. 228. <!-- give colors to some links in gazebo --> 229. <gazebo reference="hip_base"> 230. <material>Gazebo/DarkGrey</material> 231. </gazebo> 232. <gazebo reference="hip_aa_frame_left_side"> 233. <material>Gazebo/Grey</material> 234. </gazebo> 235. <gazebo reference="hip_aa_frame_right_side"> 236. <material>Gazebo/Grey</material> 237. </gazebo> 238. <gazebo reference="ankle_plate_left"> 239. <material>Gazebo/Footway</material> 240. </gazebo> 241. <gazebo reference="ankle_plate_right"> 242. <material>Gazebo/Footway</material> 243. </gazebo> 244. 245. 246. <!-- Used for fixing robot to Gazebo 'base_link' --> 247. <link name="${parent_name}"/> 248. 249. 250. <!-- Parts --> 251. <!-- Hip--> 252. <link name="hip_base"> 253. <visual> 254. <origin xyz="${-hip_aa_frame_width} 0 0" rpy="0 0 ${pi}"/> 255. <geometry> 256. <mesh filename="package://march_description/urdf/stl-
files/HipBase.stl" scale="1 1 1"/> 257. </geometry> 258. <material name="blue"/> 259. </visual> 260. 261. <inertial> 262. <origin xyz="${hip_base_com_x} ${hip_base_com_y} ${hip_base_com_z}"
rpy="0 0 0"/> 263. <mass value="${hip_base_mass}"/> 264. <inertia 265. ixx="${hip_base_Ixx}" 266. ixy="${hip_base_Ixy}" 267. ixz="${hip_base_Ixz}" 268. iyy="${hip_base_Iyy}" 269. iyz="${hip_base_Iyz}" 270. izz="${hip_base_Izz}" /> 271. </inertial> 272. 273. <collision> 274. <origin xyz="0 0 0" rpy="0 0 0"/> 275. <geometry> 276. <box size="${width} ${hip_base_height} ${width}"/> 277. </geometry> 278. </collision> 279. </link> 280. 281. <!-- IMU-->
119
282. <link name="imu_link"> 283. </link> 284. 285. <!-- Left Moving Hip--> 286. <link name="hip_aa_frame_left_side"> 287. <visual> 288. <origin xyz="${-hip_aa_frame_width} ${hip_base_height/2} 0" rpy="0
0 ${pi}"/> 289. <geometry> 290. <mesh filename="package://march_description/urdf/stl-
files/LeftHAA.stl" scale="1 1 1"/> 291. </geometry> 292. <material name="blue"/> 293. </visual> 294. 295. <collision> 296. <origin xyz="0 ${-hip_aa_frame_height/2} 0" rpy="0 0 0"/> 297. <geometry> 298. <box size="${width} ${hip_aa_frame_height} ${width}"/> 299. </geometry> 300. </collision> 301. </link> 302. 303. <link name="hip_aa_frame_left_front"> 304. <inertial> 305. <origin xyz="${hip_aa_com_x} ${-hip_aa_com_y} ${hip_aa_com_z}"
rpy="0 0 0"/> 306. <mass value="${hip_aa_mass}"/> 307. <inertia 308. ixx="${hip_aa_Ixx}" 309. ixy="${-hip_aa_Ixy}" 310. ixz="${hip_aa_Ixz}" 311. iyy="${hip_aa_Iyy}" 312. iyz="${-hip_aa_Iyz}" 313. izz="${hip_aa_Izz}" /> 314. </inertial> 315. 316. <collision> 317. <origin xyz="${-hip_aa_frame_width/2} 0 0" rpy="0 0 0"/> 318. <geometry> 319. <box size="${hip_aa_frame_width} ${width} ${width}"/> 320. </geometry> 321. </collision> 322. </link> 323. 324. <!-- Upper Leg Left--> 325. <link name="upper_leg_left"> 326. <visual> 327. <origin xyz="0 ${hip_base_height/2 + hip_aa_frame_height -
upper_leg_offset} 0" rpy="0 0 ${pi}"/> 328. <geometry> 329. <mesh filename="package://march_description/urdf/stl-
files/UpperLeftLeg.stl" scale="1 1 1"/> 330. </geometry> 331. <material name="blue"/> 332. </visual> 333. 334. <inertial> 335. <origin xyz="${upper_leg_com_x} ${-upper_leg_com_y}
${upper_leg_com_z}" rpy="0 0 0"/> 336. <mass value="${upper_leg_mass}"/>
120
337. <inertia 338. ixx="${upper_leg_Ixx}" 339. ixy="${-upper_leg_Ixy}" 340. ixz="${upper_leg_Ixz}" 341. iyy="${upper_leg_Iyy}" 342. iyz="${-upper_leg_Iyz}" 343. izz="${upper_leg_Izz}" /> 344. </inertial> 345. 346. <collision> 347. <origin xyz="0 0 ${-upper_leg_height/2}" rpy="0 0 0"/> 348. <geometry> 349. <box size="${width} ${width} ${upper_leg_height}"/> 350. </geometry> 351. </collision> 352. </link> 353. 354. <!-- Lower Leg Left --> 355. <link name="lower_leg_left"> 356. <visual> 357. <origin xyz="0 0 ${-lower_leg_height/2}" rpy="0 0 0"/> 358. <geometry> 359. <box size="${lower_leg_width_x} ${width} ${lower_leg_height}"/> 360. </geometry> 361. </visual> 362. 363. <inertial> 364. <origin xyz="0 0 ${-lower_leg_height/2}" rpy="0 0 0"/> 365. <mass value="${lower_leg_mass}"/> 366. <inertia 367. ixx="${lower_leg_mass / 12.0 *
(lower_leg_width_x*lower_leg_width_y + lower_leg_height*lower_leg_height)}" ixy="0.0" ixz="0.0"
368. iyy="${lower_leg_mass / 12.0 * (lower_leg_height*lower_leg_height + lower_leg_width_x*lower_leg_width_y)}" iyz="0.0"
369. izz="${lower_leg_mass / 12.0 * (lower_leg_width_x*lower_leg_width_y + lower_leg_width_x*lower_leg_width_y)}"/>
370. </inertial> 371. 372. <collision> 373. <origin xyz="0 0 ${-lower_leg_height/2}" rpy="0 0 0"/> 374. <geometry> 375. <box size="${lower_leg_width_x} ${lower_leg_width_y}
${lower_leg_height}"/> 376. </geometry> 377. </collision> 378. </link> 379. 380. <!-- support --> 381. 382. <link name="left_support"> 383. <visual> 384. <origin xyz="0 ${lower_leg_width_y + 0.03} -0.05" rpy="1.57 0
1.57"/> 385. <geometry> 386. <mesh filename="package://march_description/urdf/stl-
files/support.stl" scale="0.01 0.01 0.01"/> 387. </geometry> 388. <material name="blue"/> 389. </visual>
121
390. 391. <inertial> 392. <origin xyz="0.03 ${lower_leg_width_y + 0.03 -0.07} -0.05" rpy="0 0
0"/> 393. <mass value="${support_mass}"/> 394. <inertia 395. ixx="0.0122162" ixy="-0.0016191" ixz="0.000805" 396. iyy="0.036601" iyz="-0.00158" 397. izz="0.0184"/> 398. </inertial> 399. 400. <collision> 401. <origin xyz="0 ${lower_leg_width_y + 0.01} 0" rpy="0 0 0"/> 402. <geometry> 403. <box size="0.17 0.13 0.12"/> 404. </geometry> 405. </collision> 406. </link> 407. 408. <!-- Ankle plate Left --> 409. <link name="ankle_plate_left"> 410. <visual> 411. <origin 412. xyz="0 413. ${hip_base_height/2 + hip_aa_frame_height -
upper_leg_offset - ankle_plate_offset} 414. ${foot_scale * (upper_leg_height + 0.385 )}" 415. rpy="0 0 ${pi}" 416. /> 417. <geometry> 418. <mesh filename="package://march_description/urdf/stl-
files/LeftFoot.stl" scale="$(arg foot_size) 1 ${foot_scale}"/> 419. </geometry> 420. <material name="blue"/> 421. </visual> 422. <collision> 423. <origin xyz="0 0 ${-ankle_plate_height/2}" rpy="0 0 0"/> 424. <geometry> 425. <box size="${width} ${width} ${ankle_plate_height}"/> 426. </geometry> 427. </collision> 428. </link> 429. 430. <gazebo reference="ankle_plate_left"> 431. <sensor name="ankle_plate_left_contact" type="contact"> 432. <plugin name="contact_plugin" filename="libcontact.so"/> 433. <contact> 434.
<collision>ankle_plate_left_fixed_joint_lump__foot_left_collision_1</collision> 435. </contact> 436. <update_rate>30</update_rate> 437. <always_on>true</always_on> 438. </sensor> 439. </gazebo> 440. 441. <!-- Foot Left --> 442. <link name="foot_left"> 443. <inertial> 444. <origin xyz="${foot_com_x} ${-foot_com_y} ${foot_com_z}" rpy="0 0
0"/> 445. <mass value="${foot_mass}"/>
122
446. <inertia 447. ixx="${foot_Ixx}" 448. ixy="${-foot_Ixy}" 449. ixz="${foot_Ixz}" 450. iyy="${foot_Iyy}" 451. iyz="${-foot_Iyz}" 452. izz="${foot_Izz}" /> 453. </inertial> 454. <collision> 455. <origin xyz="${(-foot_height_forward+foot_height_backward)/2} 0 0"
rpy="0 0 0"/> 456. <geometry> 457. <box size="${foot_height_forward+foot_height_backward} ${width}
${width}"/> 458. </geometry> 459. </collision> 460. </link> 461. 462. <link name="pressure_sole_left"> 463. <collision> 464. <origin xyz="${(-foot_height_forward+foot_height_backward)/2} 0 0"
rpy="0 0 0"/> 465. <geometry> 466. <box size="${foot_height_forward+foot_height_backward} ${width}
0.001"/> 467. </geometry> 468. </collision> 469. </link> 470. 471. <gazebo reference="pressure_sole_left"> 472. <sensor name="left_pressure_sole" type="contact"> 473. <always_on>true</always_on> 474. <contact> 475.
<collision>ankle_plate_left_fixed_joint_lump__pressure_sole_left_collision_2</collision>
476. </contact> 477. <plugin name="left_foot_plugin" filename="libgazebo_ros_bumper.so"> 478.
<bumperTopicName>march/sensor/left_pressure_sole</bumperTopicName> 479. <frameName>world</frameName> 480. </plugin> 481. </sensor> 482. </gazebo> 483. 484. <gazebo reference="foot_left"> 485. <mu1>${foot_mu1}</mu1> 486. <mu2>${foot_mu2}</mu2> 487. <minDepth>${foot_min_depth}</minDepth> 488. <fdir1>1 0 0</fdir1> 489. </gazebo> 490. 491. <!-- Right Moving Hip--> 492. <link name="hip_aa_frame_right_side"> 493. <visual> 494. <origin xyz="${-hip_aa_frame_width} ${-hip_base_height/2} 0" rpy="0
0 ${pi}"/> 495. <geometry> 496. <mesh filename="package://march_description/urdf/stl-
files/RightHAA.stl" scale="1 1 1"/> 497. </geometry>
123
498. <material name="blue"/> 499. </visual> 500. 501. <collision> 502. <origin xyz="0 ${hip_aa_frame_height/2} 0" rpy="0 0 0"/> 503. <geometry> 504. <box size="${width} ${hip_aa_frame_height} ${width}"/> 505. </geometry> 506. </collision> 507. </link> 508. 509. <link name="hip_aa_frame_right_front"> 510. <inertial> 511. <origin xyz="${hip_aa_com_x} ${hip_aa_com_y} ${hip_aa_com_z}"
rpy="0 0 0"/> 512. <mass value="${hip_aa_mass}"/> 513. <inertia 514. ixx="${hip_aa_Ixx}" 515. ixy="${hip_aa_Ixy}" 516. ixz="${hip_aa_Ixz}" 517. iyy="${hip_aa_Iyy}" 518. iyz="${hip_aa_Iyz}" 519. izz="${hip_aa_Izz}" /> 520. </inertial> 521. 522. <collision> 523. <origin xyz="${-hip_aa_frame_width/2} 0 0" rpy="0 0 0"/> 524. <geometry> 525. <box size="${hip_aa_frame_width} ${width} ${width}"/> 526. </geometry> 527. </collision> 528. </link> 529. 530. <!-- Upper Leg Right--> 531. <link name="upper_leg_right"> 532. <visual> 533. <origin xyz="0 ${-hip_base_height/2 - hip_aa_frame_height +
upper_leg_offset} 0" rpy="0 0 ${pi}"/> 534. <geometry> 535. <mesh filename="package://march_description/urdf/stl-
files/UpperRightLeg.stl" scale="1 1 1"/> 536. </geometry> 537. <material name="blue"/> 538. </visual> 539. 540. <inertial> 541. <origin xyz="${upper_leg_com_x} ${upper_leg_com_y}
${upper_leg_com_z}" rpy="0 0 0"/> 542. <mass value="${upper_leg_mass}"/> 543. <inertia 544. ixx="${upper_leg_Ixx}" 545. ixy="${upper_leg_Ixy}" 546. ixz="${upper_leg_Ixz}" 547. iyy="${upper_leg_Iyy}" 548. iyz="${upper_leg_Iyz}" 549. izz="${upper_leg_Izz}" /> 550. </inertial> 551. 552. <collision> 553. <origin xyz="0 0 ${-upper_leg_height/2}" rpy="0 0 0"/> 554. <geometry>
124
555. <box size="${width} ${width} ${upper_leg_height}"/> 556. </geometry> 557. </collision> 558. 559. </link> 560. 561. <!-- Lower Leg Right --> 562. <link name="lower_leg_right"> 563. <visual> 564. <origin xyz="0 0 ${-lower_leg_height/2}" rpy="0 0 0"/> 565. <geometry> 566. <box size="${lower_leg_width_x} ${lower_leg_width_y}
${lower_leg_height}"/> 567. </geometry> 568. </visual> 569. 570. <inertial> 571. <origin xyz="0 0 ${-lower_leg_height/2}" rpy="0 0 0"/> 572. <mass value="${lower_leg_mass}"/> 573. <inertia 574. ixx="${lower_leg_mass / 12.0 *
(lower_leg_width_x*lower_leg_width_y + lower_leg_height*lower_leg_height)}" ixy="0.0" ixz="0.0"
575. iyy="${lower_leg_mass / 12.0 * (lower_leg_height*lower_leg_height + lower_leg_width_x*lower_leg_width_y)}" iyz="0.0"
576. izz="${lower_leg_mass / 12.0 * (lower_leg_width_x*lower_leg_width_y + lower_leg_width_x*lower_leg_width_y)}"/>
577. </inertial> 578. 579. <collision> 580. <origin xyz="0 0 ${-lower_leg_height/2}" rpy="0 0 0"/> 581. <geometry> 582. <box size="${lower_leg_width_x} ${lower_leg_width_y}
${lower_leg_height}"/> 583. </geometry> 584. </collision> 585. </link> 586. 587. <!-- support --> 588. 589. <link name="right_support"> 590. <visual> 591. <origin xyz="0 ${-lower_leg_width_y/2 - 0.055} -0.05" rpy="1.57 0 -
1.57"/> 592. <geometry> 593. <mesh filename="package://march_description/urdf/stl-
files/support.stl" scale="0.01 0.01 0.01"/> 594. </geometry> 595. <material name="blue"/> 596. </visual> 597. 598. <inertial> 599. <origin xyz="0.03 ${-lower_leg_width_y/2 - 0.055 -0.07} -0.05"
rpy="0 0 0"/> 600. <mass value="${support_mass}"/> 601. <inertia 602. ixx="0.0122162" ixy="-0.0016191" ixz="0.000805" 603. iyy="0.036601" iyz="-0.00158" 604. izz="0.0184"/> 605. </inertial>
125
606. 607. <collision> 608. <origin xyz="0 ${-lower_leg_width_y/2 -0.03} 0" rpy="0 0 0"/> 609. <geometry> 610. <box size="0.17 0.13 0.12"/> 611. </geometry> 612. </collision> 613. </link> 614. 615. 616. <!-- Ankle Plate Right --> 617. <link name="ankle_plate_right"> 618. <visual> 619. <origin 620. xyz="0 621. ${-hip_base_height/2 - hip_aa_frame_height+
upper_leg_offset + ankle_plate_offset} 622. ${foot_scale * (upper_leg_height + 0.385)}" 623. rpy="0 0 ${pi}"/> 624. /> 625. <geometry> 626. <mesh filename="package://march_description/urdf/stl-
files/RightFoot.stl" scale="$(arg foot_size) 1 ${foot_scale}"/> 627. </geometry> 628. <material name="blue"/> 629. </visual> 630. <collision> 631. <origin xyz="0 0 ${-ankle_plate_height/2}" rpy="0 0 0"/> 632. <geometry> 633. <box size="${width} ${width} ${ankle_plate_height}"/> 634. </geometry> 635. </collision> 636. </link> 637. 638. 639. <gazebo reference="ankle_plate_right"> 640. <sensor name="ankle_plate_right_contact" type="contact"> 641. <plugin name="contact_plugin" filename="libcontact.so"/> 642. <contact> 643.
<collision>ankle_plate_right_fixed_joint_lump__foot_right_collision_1</collision> 644. </contact> 645. <update_rate>30</update_rate> 646. <always_on>true</always_on> 647. </sensor> 648. </gazebo> 649. 650. <!-- Foot Right --> 651. <link name="foot_right"> 652. <inertial> 653. <origin xyz="${foot_com_x} ${foot_com_y} ${foot_com_z}" rpy="0 0
0"/> 654. <mass value="${foot_mass}"/> 655. <inertia 656. ixx="${foot_Ixx}" 657. ixy="${foot_Ixy}" 658. ixz="${foot_Ixz}" 659. iyy="${foot_Iyy}" 660. iyz="${foot_Iyz}" 661. izz="${foot_Izz}" /> 662. </inertial>
126
663. <collision> 664. <origin xyz="${(-foot_height_forward+foot_height_backward)/2} 0 0"
rpy="0 0 0"/> 665. <geometry> 666. <box size="${foot_height_forward+foot_height_backward} ${width}
${width}"/> 667. </geometry> 668. </collision> 669. </link> 670. 671. <gazebo reference="foot_right"> 672. <mu1>${foot_mu1}</mu1> 673. <mu2>${foot_mu2}</mu2> 674. <minDepth>${foot_min_depth}</minDepth> 675. <fdir1>1 0 0</fdir1> 676. </gazebo> 677. 678. <link name="pressure_sole_right"> 679. <collision> 680. <origin xyz="${(-foot_height_forward+foot_height_backward)/2} 0 0"
rpy="0 0 0"/> 681. <geometry> 682. <box size="${foot_height_forward+foot_height_backward} ${width}
0.001"/> 683. </geometry> 684. </collision> 685. </link> 686. 687. <gazebo reference="pressure_sole_right"> 688. <sensor name="right_pressure_sole" type="contact"> 689. <always_on>true</always_on> 690. <contact> 691.
<collision>ankle_plate_right_fixed_joint_lump__pressure_sole_right_collision_2</collision>
692. </contact> 693. <plugin name="right_foot_plugin"
filename="libgazebo_ros_bumper.so"> 694.
<bumperTopicName>march/sensor/right_pressure_sole</bumperTopicName> 695. <frameName>world</frameName> 696. </plugin> 697. </sensor> 698. </gazebo> 699. 700. <!-- Joints --> 701. <joint name="imu_joint" type="fixed"> 702. <parent link="${parent_name}"/> 703. <child link="imu_link"/> 704. </joint> 705. 706. <joint name="hip" type="fixed"> 707. <parent link="imu_link"/> 708. <child link="hip_base"/> 709. <origin xyz="0 0
${lower_leg_height+upper_leg_height+ankle_plate_height+width/2.0+hover_height}" rpy="0 0 0"/>
710. </joint> 711. 712. <joint name="left_hip_aa" type="revolute"> 713. <parent link="hip_base"/>
127
714. <child link="hip_aa_frame_left_side"/> 715. <origin xyz="0 ${-hip_base_height/2} 0" rpy="0 0 0"/> 716. <axis xyz="-1 0 0"/> 717. 718. <limit velocity="${hip_aa_velocity_limit}" 719. effort="${hip_aa_effort_limit}" 720. lower="${left_hip_aa_rotation_lower_limit}" 721. upper="${left_hip_aa_rotation_upper_limit}"/> 722. <safety_controller soft_lower_limit="${left_hip_aa_rotation_lower_limit
+ hip_aa_soft_buffer}" 723. soft_upper_limit="${left_hip_aa_rotation_upper_limit
- hip_aa_soft_buffer}" 724. k_position="${k_position_value_haa}" 725. k_velocity="${k_velocity_value_haa}" /> 726. </joint> 727. 728. <joint name="left_hip_angle" type="fixed"> 729. <parent link="hip_aa_frame_left_side"/> 730. <child link="hip_aa_frame_left_front"/> 731. <origin xyz="0 ${-hip_aa_frame_height} 0" rpy="0 0 0"/> 732. </joint> 733. 734. <joint name="left_hip_fe" type="revolute"> 735. <parent link="hip_aa_frame_left_front"/> 736. <child link="upper_leg_left"/> 737. <origin xyz="${-hip_aa_frame_width} ${upper_leg_offset} 0" rpy="0 0
0"/> 738. <axis xyz="0 1 0"/> 739. 740. <limit velocity="${hip_fe_velocity_limit}" 741. effort="${hip_fe_effort_limit}" 742. lower="${left_hip_fe_rotation_lower_limit}" 743. upper="${left_hip_fe_rotation_upper_limit}"/> 744. <safety_controller soft_lower_limit="${left_hip_fe_rotation_lower_limit
+ hip_fe_soft_buffer}" 745. soft_upper_limit="${left_hip_fe_rotation_upper_limit
- hip_fe_soft_buffer}" 746. k_position="${k_position_value_hfe}" 747. k_velocity="${k_velocity_value_hfe}" /> 748. </joint> 749. 750. <joint name="left_knee" type="revolute"> 751. <parent link= "upper_leg_left"/> 752. <child link="lower_leg_left"/> 753. <origin xyz="0 0 ${-upper_leg_height}" rpy="0 0 0"/> 754. <axis xyz="0 -1 0"/> 755. 756. <limit velocity="${knee_velocity_limit}" 757. effort="${knee_effort_limit}" 758. lower="${left_knee_rotation_lower_limit}" 759. upper="${left_knee_rotation_upper_limit}"/> 760. <safety_controller soft_lower_limit="${left_knee_rotation_lower_limit +
knee_extension_soft_buffer}" 761. soft_upper_limit="${left_knee_rotation_upper_limit -
knee_flexion_soft_buffer}" 762. k_position="${k_position_value_kfe}" 763. k_velocity="${k_velocity_value_kfe}" /> 764. </joint> 765. 766. <joint name="left_fixing" type="fixed"> 767. <parent link="lower_leg_left"/>
128
768. <child link="left_support"/> 769. <origin xyz="0 ${lower_leg_width_y/2} ${-lower_leg_height/2}" rpy="0 0
0"/> 770. </joint> 771. 772. <joint name="left_ankle" type="revolute"> 773. <parent link="lower_leg_left"/> 774. <child link="ankle_plate_left"/> 775. <origin xyz="0 ${ankle_plate_offset} ${-lower_leg_height}" rpy="0 0
0"/> 776. <axis xyz="0 1 0"/> 777. 778. <limit velocity="${ankle_velocity_limit}" 779. effort="${ankle_effort_limit}" 780. lower="${left_ankle_rotation_lower_limit}" 781. upper="${left_ankle_rotation_upper_limit}"/> 782. <safety_controller soft_lower_limit="${left_ankle_rotation_lower_limit
+ ankle_plantarflexion_soft_buffer}" 783. soft_upper_limit="${left_ankle_rotation_upper_limit
- ankle_dorsalflexion_soft_buffer}" 784. k_position="${k_position_value_adpf}" 785. k_velocity="${k_velocity_value_adpf}" /> 786. </joint> 787. 788. <joint name="left_foot_angle" type="fixed"> 789. <parent link="ankle_plate_left"/> 790. <child link="foot_left"/> 791. <origin xyz="0 0 ${-ankle_plate_height}" rpy="0 0 0"/> 792. </joint> 793. 794. <joint name="left_pressure_sole_joint" type="fixed"> 795. <parent link="foot_left"/> 796. <child link="pressure_sole_left"/> 797. <origin xyz="0 0 ${-(width/2)}" rpy="0 0 0"/> 798. </joint> 799. 800. <joint name="right_pressure_sole_joint" type="fixed"> 801. <parent link="foot_right"/> 802. <child link="pressure_sole_right"/> 803. <origin xyz="0 0 ${-(width/2)}" rpy="0 0 0"/> 804. </joint> 805. 806. <joint name="right_hip_aa" type="revolute"> 807. <parent link="hip_base"/> 808. <child link="hip_aa_frame_right_side"/> 809. <origin xyz="0 ${hip_base_height/2} 0" rpy="0 0 0"/> 810. <axis xyz="1 0 0"/> 811. 812. <limit velocity="${hip_aa_velocity_limit}" 813. effort="${hip_aa_effort_limit}" 814. lower="${right_hip_aa_rotation_lower_limit}" 815. upper="${right_hip_aa_rotation_upper_limit}"/> 816. <safety_controller
soft_lower_limit="${right_hip_aa_rotation_lower_limit + hip_aa_soft_buffer}" 817.
soft_upper_limit="${right_hip_aa_rotation_upper_limit - hip_aa_soft_buffer}" 818. k_position="${k_position_value_haa}" 819. k_velocity="${k_velocity_value_haa}" /> 820. 821. </joint> 822.
129
823. <joint name="right_hip_angle" type="fixed"> 824. <parent link="hip_aa_frame_right_side"/> 825. <child link="hip_aa_frame_right_front"/> 826. <origin xyz="0 ${hip_aa_frame_height} 0" rpy="0 0 0"/> 827. </joint> 828. 829. <joint name="right_hip_fe" type="revolute"> 830. <parent link="hip_aa_frame_right_front"/> 831. <child link="upper_leg_right"/> 832. <origin xyz="${-hip_aa_frame_width} ${-upper_leg_offset} 0" rpy="0 0
0"/> 833. <axis xyz="0 1 0"/> 834. 835. <limit velocity="${hip_fe_velocity_limit}" 836. effort="${hip_fe_effort_limit}" 837. lower="${right_hip_fe_rotation_lower_limit}" 838. upper="${right_hip_fe_rotation_upper_limit}"/> 839. <safety_controller
soft_lower_limit="${right_hip_fe_rotation_lower_limit + hip_fe_soft_buffer}" 840.
soft_upper_limit="${right_hip_fe_rotation_upper_limit - hip_fe_soft_buffer}" 841. k_position="${k_position_value_hfe}" 842. k_velocity="${k_velocity_value_hfe}" /> 843. 844. </joint> 845. 846. <joint name="right_knee" type="revolute"> 847. <parent link="upper_leg_right"/> 848. <child link="lower_leg_right"/> 849. <origin xyz="0 0 ${-upper_leg_height}" rpy="0 0 0"/> 850. <axis xyz="0 -1 0"/> 851. 852. <limit velocity="${knee_velocity_limit}" 853. effort="${knee_effort_limit}" 854. lower="${right_knee_rotation_lower_limit}" 855. upper="${right_knee_rotation_upper_limit}"/> 856. <safety_controller soft_lower_limit="${right_knee_rotation_lower_limit
+ knee_extension_soft_buffer}" 857. soft_upper_limit="${right_knee_rotation_upper_limit
- knee_flexion_soft_buffer}" 858. k_position="${k_position_value_kfe}" 859. k_velocity="${k_velocity_value_kfe}" /> 860. </joint> 861. 862. <joint name="right_fixing" type="fixed"> 863. <parent link="lower_leg_right"/> 864. <child link="right_support"/> 865. <origin xyz="0 ${-lower_leg_width_y/2} ${-lower_leg_height/2}" rpy="0 0
0"/> 866. </joint> 867. 868. <joint name="right_ankle" type="revolute"> 869. <parent link="lower_leg_right"/> 870. <child link="ankle_plate_right"/> 871. <origin xyz="0 ${-ankle_plate_offset} ${-lower_leg_height}" rpy="0 0
0"/> 872. <axis xyz="0 1 0"/> 873. 874. <limit velocity="${ankle_velocity_limit}" 875. effort="${ankle_effort_limit}" 876. lower="${right_ankle_rotation_lower_limit}"
130
877. upper="${right_ankle_rotation_upper_limit}"/> 878. <safety_controller soft_lower_limit="${right_ankle_rotation_lower_limit
+ ankle_plantarflexion_soft_buffer}" 879. soft_upper_limit="${right_ankle_rotation_upper_limit
- ankle_dorsalflexion_soft_buffer}" 880. k_position="${k_position_value_adpf}" 881. k_velocity="${k_velocity_value_adpf}" /> 882. </joint> 883. 884. <joint name="right_foot_angle" type="fixed"> 885. <parent link="ankle_plate_right"/> 886. <child link="foot_right"/> 887. <origin xyz="0 0 ${-ankle_plate_height}" rpy="0 0 0"/> 888. </joint> 889. 890. 891. 892. <xacro:include filename="camera/_d435.urdf.xacro" /> 893. <xacro:sensor_d435 parent="hip_base" plugin="$(arg realsense_simulation)"> 894. <!-- Attached to the hip_base, since this is most comparable to the backpack
--> 895. <!-- in amount of movement, the distance from hip base is based on first
design.--> 896. <origin xyz="-0.17 0.195 0.215" rpy="${0.5 * pi} ${0.25 * pi} ${pi}"/> 897. <!-- Rotate to be vertical and pointing down 45 degrees --> 898. </xacro:sensor_d435> 899. 900. 901. <!-- ROS Control plugin for Gazebo --> 902. <transmission name="left_hip_aa"> 903. <type>transmission_interface/SimpleTransmission</type> 904. <joint name="left_hip_aa"> 905.
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface> 906. </joint> 907. <actuator name="left_hip_aa_motor"> 908. <mechanicalReduction>200</mechanicalReduction> 909. </actuator> 910. </transmission> 911. 912. <transmission name="left_hip_fe"> 913. <type>transmission_interface/SimpleTransmission</type> 914. <joint name="left_hip_fe"> 915.
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface> 916. </joint> 917. <actuator name="left_hip_fe_motor"> 918. <mechanicalReduction>101</mechanicalReduction> 919. </actuator> 920. </transmission> 921. 922. <transmission name="left_knee"> 923. <type>transmission_interface/SimpleTransmission</type> 924. <joint name="left_knee"> 925.
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface> 926. </joint> 927. <actuator name="left_knee_motor"> 928. <mechanicalReduction>101</mechanicalReduction> 929. </actuator> 930. </transmission>
131
931. 932. <transmission name="left_ankle"> 933. <type>transmission_interface/SimpleTransmission</type> 934. <joint name="left_ankle"> 935.
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface> 936. </joint> 937. <actuator name="left_ankle_motor"> 938. <mechanicalReduction>200</mechanicalReduction> 939. </actuator> 940. </transmission> 941. 942. <transmission name="right_hip_aa"> 943. <type>transmission_interface/SimpleTransmission</type> 944. <joint name="right_hip_aa"> 945.
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface> 946. </joint> 947. <actuator name="right_hip_aa_motor"> 948. <mechanicalReduction>200</mechanicalReduction> 949. </actuator> 950. </transmission> 951. 952. <transmission name="right_hip_fe"> 953. <type>transmission_interface/SimpleTransmission</type> 954. <joint name="right_hip_fe"> 955.
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface> 956. </joint> 957. <actuator name="right_hip_fe_motor"> 958. <mechanicalReduction>101</mechanicalReduction> 959. </actuator> 960. </transmission> 961. 962. <transmission name="right_knee"> 963. <type>transmission_interface/SimpleTransmission</type> 964. <joint name="right_knee"> 965.
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface> 966. </joint> 967. <actuator name="right_knee_motor"> 968. <mechanicalReduction>101</mechanicalReduction> 969. </actuator> 970. </transmission> 971. 972. <transmission name="right_ankle"> 973. <type>transmission_interface/SimpleTransmission</type> 974. <joint name="right_ankle"> 975.
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface> 976. </joint> 977. <actuator name="right_ankle_motor"> 978. <mechanicalReduction>200</mechanicalReduction> 979. </actuator> 980. </transmission> 981. </robot>
133
B. Anexo II: Código de configuración de
parámetros
Código B: march_improved.yaml
1. march: 2. # Publish all joint states ----------------------------------- 3. joint_state_controller: 4. type: joint_state_controller/JointStateController 5. publish_rate: 50 6. 7. controller: 8. trajectory: 9. type: effort_controllers/JointTrajectoryController 10. joints: 11. - left_ankle 12. - left_hip_aa 13. - left_hip_fe 14. - left_knee 15. - right_ankle 16. - right_hip_aa 17. - right_hip_fe 18. - right_knee 19. 20. gains: # Required because we're controlling an effort interface 21. # The pid values are working, but they seem to be heavily dependent 22. # on the max effort values (in the march_world.launch file) for reasons
unknown. 23. left_ankle: {p: 3000, d: 30, i: 0, i_clamp: 0} 24. left_hip_aa: {p: 3000, d: 30, i: 0, i_clamp: 0} 25. left_hip_fe: {p: 3000, d: 30, i: 0, i_clamp: 0} 26. left_knee: {p: 3000, d: 30, i: 0, i_clamp: 0} 27. right_ankle: {p: 3000, d: 30, i: 0, i_clamp: 0} 28. right_hip_aa: {p: 3000, d: 30, i: 0, i_clamp: 0} 29. right_hip_fe: {p: 3000, d: 30, i: 0, i_clamp: 0} 30. right_knee: {p: 3000, d: 30, i: 0, i_clamp: 0} 31. 32. state_publish_rate: 25 # Override default 33. action_monitor_rate: 30 # Override default 34. stop_trajectory_duration: 0 # Override default 35. 36. constraints: 37. goal_time: 0.3 38. stopped_velocity_tolerance: 0.2 39. left_ankle: 40. trajectory: 0.5
134
41. left_hip_aa: 42. trajectory: 0.5 43. left_hip_fe: 44. trajectory: 0.5 45. left_knee: 46. trajectory: 0.5 47. right_ankle: 48. trajectory: 0.5 49. right_hip_aa: 50. trajectory: 0.5 51. right_hip_fe: 52. trajectory: 0.5 53. right_knee: 54. trajectory: 0.5
135
C. Anexo III: Código para establecer el patrón de
marcha
1. gaits: 2. side_step_left: 3. left_open: MIV_improved 4. right_close: MIV_ improved 5. side_step_left_small: 6. left_open: MIV_ improved 7. right_close: MIV_ improved 8. side_step_right: 9. right_open: MIV_ improved 10. left_close: MIV_ improved 11. side_step_right_small: 12. right_open: MIV_ improved 13. left_close: MIV_ improved 14. single_step_normal: 15. right_open: MIV_ improved 16. left_close: MIV_ improved 17. sit: 18. sit_down: MIV_ improved 19. sit_home: MIV_ improved 20. sofa_sit: 21. sit_down: MIV_ improved 22. sit_home: MIV_ improved 23. stairs_up: 24. right_open: MV_improved 25. left_swing: MV_improved 26. right_swing: MV_ improved 27. left_close: MV_ improved 28. right_close: MV_ improved 29. stairs_down: 30. right_open: MV_improved 31. left_swing: MV_improved 32. right_swing: MV_improved 33. left_close: MV_improved 34. right_close: MV_improved 35. walk: 36. right_open: MIV_ improved 37. left_swing: MIV_ improved 38. right_swing: MIV_ improved 39. left_close: MIV_ improved 40. right_close: MIV_ improved 41. slalom_walk: 42. right_open: MIV_ improved
136
43. left_swing: MV_ improved 44. right_swing: MV_ improved 45. left_close: MIV_ improved 46. right_close: MIV_ improved 47. tilted_path_first_start: 48. left_open: MV_ improved 49. right_close: MV_ improved 50. tilted_path_second_start: 51. left_open: MV_ improved 52. right_close: MV_ improved 53. tilted_path_first_end: 54. left_open: MV_ improved 55. right_close: MV_ improved 56. tilted_path_second_end: 57. left_open: MV_ improved 58. right_close: MV_ improved 59. tilted_path_left_straight_start: 60. right_open: MV_ improved 61. left_close: MV_ improved 62. tilted_path_left_single_step: 63. right_open: MV_ improved 64. left_close: MV_ improved 65. tilted_path_left_straight_end: 66. left_open: MV_ improved 67. right_close: MV_ improved 68. tilted_path_right_straight_start: 69. left_open: MV_ improved 70. right_close: MV_ improved 71. tilted_path_right_single_step: 72. left_open: MV_ improved 73. right_close: MV_ improved 74. tilted_path_right_straight_end: 75. right_open: MV_ improved 76. left_close: MV_ improved 77. ramp_door_slope_up: 78. right_open: MV_ improved 79. left_open: MV_ improved 80. right_swing: MV_ improved 81. left_swing: MV_ improved 82. right_close: MV_ improved 83. left_close: MV_ improved 84. ramp_door_slope_down: 85. right_open: MV_ improved 86. left_open: MV_ improved 87. right_swing: MV_ improved 88. left_swing: MV_ improved 89. right_close: MV_ improved 90. left_close: MV_ improved 91. ramp_door_last_step: 92. right_open: MV_ improved 93. left_close: MV_ improved 94. ramp_door_slope_down_single: 95. right_open: MV_ improved 96. left_close: MV_ improved 97. right_swing_2: MV_ improved 98. left_close: MV_ improved 99. positions: 100. stand: 101. gait_type: walk_like 102. joints: 103. left_ankle: 0.0436
137
104. left_hip_aa: 0.0 105. left_hip_fe: -0.0873 106. left_knee: 0.0 107. right_ankle: 0.0436 108. right_hip_aa: 0.0 109. right_hip_fe: -0.0873 110. right_knee: 0.0 111. tilted_path_right_stand: 112. gait_type: walk_like 113. joints: 114. left_ankle: 0.0436 115. left_hip_aa: 0.0873 116. left_hip_fe: -0.0873 117. left_knee: 0.0 118. right_ankle: 0.1309 119. right_hip_aa: -0.0524 120. right_hip_fe: 0.5236 121. right_knee: 0.8203 122. sofa_sit: 123. gait_type: sit_like 124. joints: 125. left_ankle: 0.0436 126. left_hip_aa: 0.0 127. left_hip_fe: 1.5708 128. left_knee: 1.7453 129. right_ankle: 0.0436 130. right_hip_aa: 0.0 131. right_hip_fe: 1.5708 132. right_knee: 1.7453 133. idle_3: 134. gait_type: walk_like 135. joints: 136. left_ankle: 0.0436 137. left_hip_aa: 0.0 138. left_hip_fe: -0.0873 139. left_knee: 0.0 140. right_ankle: 0.0436 141. right_hip_aa: 0.0 142. right_hip_fe: 0.1745 143. right_knee: 0.4363 144. slope_down_stand: 145. gait_type: stairs_like 146. joints: 147. left_ankle: -0.2618 148. left_hip_aa: 0.0 149. left_hip_fe: -0.0873 150. left_knee: 0.0 151. right_ankle: -0.2618 152. right_hip_aa: 0.0 153. right_hip_fe: -0.0873 154. right_knee: 0.0 155. sit: 156. gait_type: sit_like 157. joints: 158. left_ankle: 0.0436 159. left_hip_aa: 0.0 160. left_hip_fe: 1.2217 161. left_knee: 1.5708 162. right_ankle: 0.0436 163. right_hip_aa: 0.0 164. right_hip_fe: 1.2217
138
165. right_knee: 1.5708 166. idle_6: 167. gait_type: walk_like 168. joints: 169. left_ankle: 0.0436 170. left_hip_aa: 0.0 171. left_hip_fe: 0.1745 172. left_knee: 0.4363 173. right_ankle: 0.0436 174. right_hip_aa: 0.0 175. right_hip_fe: -0.0873 176. right_knee: 0.0 177. tilted_path_left_stand: 178. gait_type: walk_like 179. joints: 180. left_ankle: 0.1309 181. left_hip_aa: -0.0524 182. left_hip_fe: 0.5236 183. left_knee: 0.8203 184. right_ankle: 0.0436 185. right_hip_aa: 0.0873 186. right_hip_fe: -0.0873 187. right_knee: 0.0 188.