8. Control del reBot Arm usando el SDK de Python
Capítulo 8 del Curso de Introducción a la IA Física de Seeed: controla el reBot Arm con el SDK de Python: parámetros, conexión con administrador de contexto, movimiento, punto cero y estado de las articulaciones.
1. Si el entorno no está instalado, consulta la sección 7.2 para la instalación del entorno.
2. Los parámetros de cada controlador de articulación del brazo robótico del SDK de Python deben ajustarse según los requisitos reales de uso. Los parámetros actuales solo pueden satisfacer escenarios con requisitos de baja precisión.
Instala las dependencias necesarias:
python3 -m pip install pyyaml motorbridge
Obtén el código de ejemplo:
git clone https://github.com/hopcan/rebotArm_ctrl.git
- Los ejemplos de Python para controlar reBot DM están en
rebotArm_ctrl/example/rebotDM. - El archivo de configuración para el brazo robótico reBot DM está en
rebotArm_ctrl/config. - Los ejemplos de Python para controlar reBot RS están en
rebotArm_ctrl/example/rebotRS. - El archivo de configuración para el brazo robótico reBot RS está en
rebotArm_ctrl/config.
8.1 Modificar parámetros y cambiar modos
8.1 Modificar parámetros y cambiar modos
El modo de control recomendado para reBot DM es POS_VEL. Cambiar el modo de control de las articulaciones del brazo robótico y configurar los parámetros se puede lograr modificando los parámetros correspondientes en rebotDM.yaml bajo rebotArm_ctrl/config.
Por ejemplo:
- name: Shoulder Pan
motor_can_id: 1
MIT:
kp: 10.0
kd: 1.0
POS_VEL:
vel_kp: 0.0125
vel_ki: 0.004
pos_kp: 150.0
pos_ki: 0.5
vlim: 5.0
posmax: 2.6
posmin: -2.6
use_mode: POS_VEL
Los kp y kd de MIT, y los vel_kp, vel_ki, pos_kp, pos_ki y vlim de POS_VEL son los parámetros del modo correspondiente, que se pueden cambiar según el efecto de control del brazo robótico. use_mode puede cambiar el modo de control de la articulación correspondiente y se puede cambiar a MIT o POS_VEL.
8.2 Conectar/desconectar el brazo robótico (usando administrador de contexto)
8.2 Conectar/desconectar el brazo robótico (usando administrador de contexto)
Consulta example/rebotDM/1_rebotDM_connect.py o example/rebotRS/1_rebotRS_connect.py.
- Primero crea el controlador de bus.
- Comprueba si el puerto existe.
- Se deben otorgar permisos al puerto antes de ejecutar el programa.
reBot DM usa un puerto serie, creado de la siguiente manera:
channel = "/dev/ttyACM0"
ctrl = Controller.from_dm_serial(channel, 921600)
reBot RS usa PCAN:
channel = "can0"
ctrl = Controller(channel)
- Implementado mediante un administrador de contexto seguro:
with reBotArm_handle(ctrl, "rebotDM") as handle:
with reBotArm_handle(ctrl, "rebotRS") as handle:
Donde reBotArm_handle también admite el parámetro config_path. Este parámetro puede especificar el archivo de configuración importado, y ya no se importará el archivo de configuración predeterminado del brazo robótico. Puedes consultar los archivos de configuración en config para escribir tu propio archivo de configuración.
with reBotArm_handle(ctrl, "rebotDM", config_path="absolute path of yaml") as handle:
with reBotArm_handle(ctrl, "rebotRS", config_path="absolute path of yaml") as handle:
Implementación principal:
- La función
__enter__llamará a la funciónconnectpara conectarse automáticamente al brazo robótico. Si la conexión falla, se mostrará el registro correspondiente. - La función
__exit__llamará a la funcióndisconnectpara desconectarse automáticamente del brazo robótico cuando el programa termine. - Conectarse al brazo robótico añadirá motores al controlador de bus, comprobará la comunicación de los motores al encender, verificará si el ID CAN del motor y el ID maestro son válidos, verificará si el archivo de configuración es válido y cambiará el modo de control del motor al modo de control objetivo.
- Al desconectarse del brazo robótico, primero se restaurará automáticamente el estado inicial y luego se deshabilitará.
Después de usar Ctrl+C para salir del programa, espera unos segundos. No sigas pulsando Ctrl+C; debes esperar a que el brazo robótico vuelva automáticamente a su posición inicial y luego se deshabilite.
Si no quieres usar el administrador de contexto, puedes llamar directamente a la función connect y a la función disconnect para conectar/desconectar el brazo robótico.
8.3 Controlar el movimiento del brazo robótico
8.3 Controlar el movimiento del brazo robótico
Consulta example/rebotDM/3_rebotDM_move_joint.py o example/rebotRS/3_rebotRS_move_joint.py.
while True:
handle.move_to_joint_positions([0, 0, 0, 0.5, 0.5, 0, -1])
for motor_id in list(range(1, 8)):
print(f"motor {motor_id}")
print(f"pos: {handle.motor_state[motor_id].pos:.3f} rad")
print(f"vel: {handle.motor_state[motor_id].vel:.3f} rad/s")
print(f"torque: {handle.motor_state[motor_id].torq:.3f} Nm\n")
time.sleep(0.002)
handle.motor_state es un diccionario que contiene la información de estado de todas las articulaciones. El método de lectura es como se muestra arriba.
8.4 Establecer el punto cero del brazo robótico
8.4 Establecer el punto cero del brazo robótico
Consulta example/rebotDM/2_rebotDM_set_zero.py o example/rebotRS/2_rebotRS_set_zero.py.
with reBotArm_handle(ctrl, "rebotRS") as handle:
handle.set_zero_position()
with reBotArm_handle(ctrl, "rebotDM") as handle:
handle.set_zero_position()
Llamar a la función set_zero_position a través de la clase de control del brazo robótico puede establecer el ID de articulación correspondiente para todas las articulaciones del brazo robótico.
8.5 Actualizar el estado de las articulaciones del brazo robótico
8.5 Actualizar el estado de las articulaciones del brazo robótico
Consulta example/rebotDM/5_rebotDM_request_joints_data.py o example/rebotRS/5_rebotRS_request_joints_data.py.
with reBotArm_handle(ctrl, "rebotDM") as handle:
if handle.is_connected:
print("Controller is connected and ready.")
print("Motor Use Modes:", handle.use_mode)
else:
print("Controller failed to connect.")
handle.ctrl.disable_all()
while True:
print(handle.get_joints_state())
time.sleep(0.002)
with reBotArm_handle(ctrl, "rebotRS") as handle:
if handle.is_connected:
print("Controller is connected and ready.")
print("Motor Use Modes:", handle.use_mode)
else:
print("Controller failed to connect.")
handle.ctrl.disable_all()
while True:
print(handle.get_joints_state())
time.sleep(0.002)
get_joints_state(): Actualiza de forma activa el estado de cada articulación del brazo robótico y devuelve los ángulos actuales de las articulaciones.