- Requisitos sistema:
- Ubuntu 22.04
- Instalación desktop de ROS2 Humble
- Crear una carpeta workspace (p.e. nimble_ws o ros_ws) y subcarpeta nimble_ws/src. En ella copiaremos los archivos descargandolos directamente o ejecutando:
git clone https://github.com/jcarballeira/nimble.git-
Compilar: Situarse en "cd nimble_ws" y ejecutar "colcon build". Rezar a vuestra divinidad favorita.
-
Cargar la instalación con "source install/setup.bash"
-
Este paso hay que realizarlo desde nimble_ws al abrir un nuevo terminal. Para evitarlo, abrir un terminal nuevo, ejecutar "gedit .bashrc" Se abrirá un archivo en el que debemos copiar al final la siguiente instrucción:
source ~/nimble_ws/install/setup.bash
De esta forma se ejecuta automáticamente al abrir un nuevo terminal. De todas formas, al compilar algo nuevo habrá que reiniciar el terminal para que se actualice ese archivo.
-
Ejecución del nodo deseado "ros2 run nimble your_node"
-
En el caso del mainPC existe un fichero launch para ejecutar todos los nodos en una única instrucción. Ejecutar "ros2 launch nimble nimble_launch.py".
-
Existen 2 paquetes diferentes e imprescindibles:
-
nimble_interfaces: Contiene el servicio para la generacion de trayectorias ideales (NN) y los mensajes creados para almacenar información de forma concreta (para el resto se usan msgs predefinidos en ROS2). Al final del documento hay una lista de los tipos de mensaje creados y los distintos campos que contienen
-
nimble: Incluye todos los nodos a ejecutar tanto en el mainPC como el los diferentes micros o raspberrys.
-
Cada nodo está suscrito a todos los topics indicados y preparado para publicar lo necesario (o eso creo).
Tiene las funciones asociadas a la recepción de cada mensaje (callbacks). En esos callbacks se almacena cada mensaje en una estructura de datos para procesarlos según el objetivo de cada nodo. La estructura está pensada para almacenar los mensajes según lleguen y poder hacer el procesamiento necesario según el nodo. De esta manera se puede comprobar si ya llegó toda la información, subdividirlo en varias funciones de procesamiento si solo se necesitan 2 mensajes, directamente en el callback si solo hace falta un mensaje...según cada nodo.
Además cada nodo tiene un timer (de perido ajustable, default:1000ms) que ejecuta un callback por si se quiere publicar o ejecutar algo periódicamente. Típicamente los sensores se publican cada cierto tiempo, habrá casos en los que solo se quiera publicar si ocurre algo concreto, por ejemplo para enviar un set point. En caso de no usarlo eliminadlo para evitar que entre innecesariamente.
Ahora que cada cual haga sus chapuzas correspondientes en cada nodo. Salud y república. Deslicen hacia abajo para más info interesante, suscribanse y denle a like.
std_msgs/Header header
float64 heightfloat64 femurfloat64 tibiafloat64 height_anklefloat64 distance_to_heelfloat64 distance_to_toefloat64 depth_pelvisfloat64 width_pelvis
std_msgs/Header header
float64 speedfloat64 step_lengthfloat64 step_heightint32 min_assistint32 max_assist
std_msgs/Header header
float64 optic_sensorfloat64 velocityfloat64 position
std_msgs/Header header- std_msgs/Float32MultiArray phase (fase de marcha)
- trajectory_msgs/msg/JointTrajectory trajectory
- bool new_indicator (indicador de que la trayectoria completa es nueva)
std_msgs/Header header
geometry_msgs/Point[] left_pelvisfloat64 xfloat64 yfloat64 z
geometry_msgs/Point[] right_pelvisgeometry_msgs/Point[] base_pelvisgeometry_msgs/Point[] left_hipgeometry_msgs/Point[] right_hipgeometry_msgs/Point[] left_kneegeometry_msgs/Point[] right_kneegeometry_msgs/Point[] left_anklegeometry_msgs/Point[] right_anklegeometry_msgs/Point[] left_heelgeometry_msgs/Point[] right_heelgeometry_msgs/Point[] left_toegeometry_msgs/Point[] right_toe
std_msgs/Header header- std_msgs/Float32MultiArray phase (fase de marcha)
- geometry_msgs/Point point
nimble_interfaces/srv/TrajGeneratorService (a partir de medidas y necesidades de paso genera la trayectoria ideal articulaciones)
- Request 1:
measurements(nimble_interfaces/msg/Measurements)
- Request 2:
therapy_requirements(nimble_interfaces/msg/TherapyRequirements) - Response:
joints_trajectory(trajectory_msgs/msg/JointTrajectory)
nimble_interfaces/srv/CartesianTrajService (a partir de trayectoria articular completa calcula la cartesiana completa y los parametros de paso resultantes)
- Request 1:
measurements(nimble_interfaces/msg/Measurements)
- Request 2:
joints_trajectory(trajectory_msgs/msg/JointTrajectory) - Response 1:
cartesian_trajectory(nimble_interfaces/msg/CartesianTrajectory) - Response 2:
step_target(nimble_interfaces/msg/TherapyRequirements)
std_msgs/Header header
string[] name(seguiremos este orden para articulaciones ["hipR", "kneeR", "ankleR","hipL", "kneeL", "ankleL"]) ó ["x","y","z"] si es cartesianafloat64[] position(vector de vectores con posicion angular)float64[] velocity(análogo al anterior con velocidades)float64[] effort(análogo al anterior con velocidades)
float64 xfloat64 yfloat64 z
std_msgs/Header header
string[] joint_names(seguiremos este orden ["hipR", "kneeR", "ankleR","hipL", "kneeL", "ankleL","pelvisList", "pelvisTilt", "hipR_Abd", "hipL_Abd"])JointTrajectoryPoint[] pointsfloat64[] positionsfloat64[] velocitiesfloat64[] accelerationsfloat64[] effortduration time_from_start
MultiArrayLayout layout
int32[] data
MultiArrayLayout layout
float32[] data
int16 data