目录

Deep_Motor_SDK

English

SDK提供了can通讯、关节使能、关节控制等功能,并在example文件夹中提供了单关节控制single_motor和多关节控制multi_motor的例程。
tools文件夹中是关节调试工具软件,具体的使用方法可参考手册,其中Windows版本(.exe)支持Windows 10和Windows 11,Ubuntu版本(.AppImage)支持Ubuntu 22及以上版本。 ubuntu版本调试工具软件的安装方法有两种,任意选择一种方法以安装关节调试工具:

  • 方法一: 在安装包DeepMotorTool-v1.9.3.AppImag所在目录打开一个终端,执行以下命令:

    ./DeepMotorTool-v1.9.3.AppImage --appimage-extract
    cd squashfs-root
    ./AppRun
  • 方法二: 在安装包DeepMotorTool-v1.9.3.AppImag所在目录打开一个终端,执行以下命令:

    sudo apt update
    sudo apt install fuse libfuse2
    ./DeepMotorTool-v1.9.3.AppImage

1 环境依赖

目前仅支持在Linux系统中编译运行。

2 例程的编译和运行

2.1 检查can口通道

例程原始代码中默认使用的can接口为can0,在运行例程前请先在终端中输入ip a,以获取实际使用设备的can接口名称。

如果所使用的设备的can接口不是can0,请在例程代码中将can0修改为实际的通道。

DrMotorCan *can = DrMotorCanCreate("can0", true);

同时需要将/scripts/set_up_can.sh中的can0改为实际的接口名称。

sudo ip link set can0 type can bitrate 1000000
sudo ip link set can0 up

2.2 修改关节ID

关节默认的id为1。 single_motor例程默认会与motor_id = 1的关节进行通信,若与实际的关节id不符,请在代码中将motor_id修改为实际的关节id。

uint8_t motor_id = 1;

multi_motor例程默认会与motor_id为1~2的关节进行通信,若与实际的关节id不符,请在代码中进行相应的修改。

2.3 编译

example文件夹中已提供了可执行文件single_motor和multi_motor。若对原始的例程代码进行了修改,则需要在/Deep_Motor_SDK路径下打开一个终端中,在终端中输入./script/compile.sh命令重新编译例程代码。

2.4 运行

2.4.1 设置并启动can设备

在/Deep_Motor_SDK路径下打开一个终端,在终端中输入./script/set_up_can.sh命令以设置can波特率并启动can设备。

2.4.2 运行single_motor

在/Deep_Motor_SDK路径下打开一个终端,在终端中输入./single_motor命令以运行可执行程序single_motor,对应的关节将会持续转动,直至ctrl+c关闭终端。

2.4.3 运行multi_motor

在/Deep_Motor_SDK路径下打开一个终端,在终端中输入./multi_motor命令以运行可执行程序multi_motor,对应的所有关节将会持续转动,直至ctrl+c关闭终端。

3 SDK的使用方法

在使用SDK编写代码的过程中,可参考example,将其include到代码文件中。

#include "../sdk/deep_motor_sdk.h"

参考single_motor.c,可使用SDK实现以下一些功能:

3.1 创建和初始化can通讯接口

//不显示日志
DrMotorCan *can = DrMotorCanCreate("can0", false);

//显示日志
DrMotorCan *can = DrMotorCanCreate("can0", true);

3.2 给特定id的关节发送使能命令

uint8_t motor_id = 1;
SetNormalCMD(motor_cmd, motor_id, ENABLE_MOTOR);
SendRecv(can, motor_cmd, motor_data);

3.3 创建线程检查特定关节的工作状态

void *MotorStateCheckThreadFunc(void *args){
    MotorCheckThreadParam *params = (MotorCheckThreadParam *)args;
    MotorCMD *motor_cmd = MotorCMDCreate();
    MotorDATA *motor_data = MotorDATACreate();
    SetNormalCMD(motor_cmd, params->motor_id, GET_STATUS_WORD);
    while(!break_flag){
        int ret = SendRecv(params->can, motor_cmd, motor_data);
        CheckSendRecvError(params->motor_id, ret);
        CheckMotorError(params->motor_id, motor_data->error_);
        sleep(1);
    }
    MotorCMDDestroy(motor_cmd);
    MotorDATADestroy(motor_data);
    printf("[INFO] motor_state_check_thread for motor with id: %d stoped\r\n", (uint32_t)params->motor_id);
}

pthread_t thread_id;
MotorCheckThreadParam param;
param.can = can;
param.motor_id = 1;
if(pthread_create(&thread_id, NULL, MotorStateCheckThreadFunc, (void*)&param) != 0){
    fprintf(stderr, "Failed to create thread.\n");
    return 1;
}

3.4 给特定id的关节发送控制命令

SetMotionCMD(motor_cmd, motor_id, CONTROL_MOTOR,0,0,0.3,0,0);
ret = SendRecv(can, motor_cmd, motor_data);
CheckSendRecvError(motor_id, ret);

3.5 失能关节

SetNormalCMD(motor_cmd, motor_id, DISABLE_MOTOR);
SendRecv(can, motor_cmd, motor_data);

3.6 回收资源

DrMotorCanDestroy(can);
MotorCMDDestroy(motor_cmd);
MotorDATADestroy(motor_data);

致谢

Python版本的J60关节控制例程由哈尔滨工程大学的刘博士提供,可参照C语言版SDK的使用方式,在Python版例程的基础上开发控制关节。 感谢刘博士haikuo00zero的无私开源与贡献!

邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号