Skip to main content

MyActuator X 系列电机入门指南

本文将介绍如何开始使用 MyActuator 系列电机,以及如何在 reComputer Mini Jetson Orin 上使用 Python 和 ROS 控制它们。

规格参数

以下是所有电机型号的完整参数表:

参数X2-7X4-10X4-36X8-120X12-320X15-450
减速比28.1712.63619.612020.25
输入电压 (V)242424484872
空载转速 (RPM)178317111158125108
空载输入电流 (A)110.91.62.73.5
额定转速 (RPM)1422388312710098
额定扭矩 (N.m)2.5410.54385145
额定输出功率 (W)371001005749001480
额定相电流 A(rms)37.86.117.63025
峰值扭矩 (N.m)71034120320450
峰值相电流 A(rms)8.119.521.543.810069.2
效率 (%)6369.563.1797582.4
电机反电动势常数 (Vdc/Krpm)4.36619.217.929.9
模块扭矩常数 (N.m/A)0.80.81.92.43.35.8
电机相电阻 (Ω)0.610.320.350.180.120.08
电机相电感 (mH)0.130.140.170.310.050.14
极对数131313102020
三相连接方式Y
反驱扭矩 (N.m)0.40.81.143.213.84
背隙 (弧分)121010101010
输出轴承类型深沟球轴承交叉滚子轴承
轴向承受力 (KN)0.251.21.344.55.4
轴向应力 (KN)0.251.21.314.55.4
径向载荷 (KN)11.21.54.556
惯量 (Kg.cm²)0.170.250.31.512.931.6
编码器类型及接口双编码器 ABS-17BIT (输入) / 17-18BIT (输出)
控制精度 (度)<0.01
通信方式CAN 总线 / EtherCAT
重量 (Kg)0.260.330.361.402.373.50
绝缘等级F

RMD-X V4 系列命名规则

  • RMD: 品牌名称 R-减速器 M-电机 D-驱动
  • X2: X 代表系列名称:集成行星执行器,2 表示电机型号,例如:X2 X4 X6 X8 等
  • P28: 行星齿轮比,例如:P12 P28 P32 等
  • 7: 峰值扭矩 7N.m
  • E: 通信方式 E: CAN BUS 和 EtherCAT

主要特点

  1. CAN BUS 和 EtherCAT
  2. 交叉滚子轴承
  3. 双编码器
  4. 高扭矩密度
  5. 高精度
  6. 中空设计

入门指南

使用前的环境准备

PC上的Windows系统

  • 下载 对应产品手册

  • 下载 MYACTUATOR_Setup Software_V4.0.zip

  • 解压 MYACTUATOR_Setup Software_V4.0.zip 并安装以下内容:

    • 位于 Required Runtime Environment\ZLGUSBCAN_Driver 目录中的 USBCAN_AllInOne_x86_x64_2.0.0.1.exe
    • 位于 Required Microsoft Runtime Libraries 目录中的 MSVBCRT.AIO.2019.10.19.X86 X64.exe

连接电路

这里我们选择了 X4-36 电机,其接口图如下所示。

端口定义端口描述
① VCC电源正极
② GND电源负极
③ CAN_HCAN_H 网络信号端
④ CAN_LCAN_L 网络信号端
⑤ EtherCAT_INEtherCAT 输入端
⑥ EtherCAT_OUTEtherCAT 输出端
⑦ T+主机向模块发送控制命令
⑧ T-模块向主机发送状态反馈
⑨ R+主机反映模块状态数据
⑩ R-模块反映主机控制命令

这里我们使用 CAN 通信方式,需要额外的 USB-CAN 接口通过 Windows 上位机进行调试。

此处需要为电机提供单独的 24V 电源,并将 USB 连接到您的电脑。

使用 MYACTUATOR Setup Software 250206.exe 测试电机

设置 ID 并连接读取电机信息校准电机校准电机运行电机旋转测试
fig1fig2fig3fig4fig5
默认电机 ID 为 1。输入 ID 为 1 并点击“连接”。连接后,点击“读取”以获取电机的当前信息。首次使用时,点击“校准电机”进行校准。校准完成后,点击“读取”和“保存”。现在可以在电机运行部分测试不同的电机控制模式。

有关更多详细功能,请参考包含在 MYACTUATOR_Setup Software_V4.0.zip 文件中的 Setup Software Instruction Manual - V3.0.pdf

使用 ​reComputer Mini Jetson Orin 控制电机

目前市场上电机最常见的 CAN 通信接口使用 XT30 (2+2)JST 接头。我们的 reComputer Mini Jetson Orin 设备配备了 双 XT30 (2+2) 接口基于 JST 的 CAN 接口,提供无缝兼容性。

有关 CAN 使用的更多详细信息,请参考此 wiki

启用 CAN 接口

步骤1: 在使用 CAN0 和 CAN1 之前,请移除底部盖板并将两个 120Ω 终端电阻设置为 ON 位置。

步骤2: 通过 XT30 (2+2) 接口将电机直接连接到 reComputer Mini 的 CAN0。

danger

此电源仅用于单电机学习和测试。对于多个电机,请设计单独的电源板,并将 Jetson 的电源与电机电源隔离,以避免高电流直接通过 Jetson。

启用 Jetson CAN 通信

打开终端并输入以下命令,将 GPIO 引脚拉高以激活 CAN0:

gpioset --mode=wait 0 43=0

如果使用 JST 接口的 CAN1,请将引脚 106 拉高。

gpioset --mode=wait 0 106=0

保持此终端打开,启动一个新终端并配置 CAN0。

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

构建 Python 和 C++ 环境

步骤1: 克隆 SDK。

git clone https://github.com/ZhuYaoHui1998/myactuator_rmd.git

步骤2: 此驱动 SDK 需要安装以下依赖项。对于 Debian Linux,可以通过以下命令安装:

sudo apt-get install -y build-essential cmake
sudo apt install linux-modules-extra-5.15.0-1025-nvidia-tegra # 对于 Jetson Jetpack 6.0

如果需要使用 Python 绑定,还需额外安装 Python 3、pip 和 pybind11:

sudo apt-get install -y python3 python3-pip python3-pybind11 python3-setuptools

安装依赖项后,需按照以下步骤将驱动 SDK 安装为 C++ 库或 Python 包。两者都将使用 CMake 编译 C++ 代码。

构建 C++ 库

要构建 C++ 驱动 SDK,请在此文件夹中打开一个新终端并执行以下命令。在较旧版本的 Linux 上,构建可能会失败并显示错误消息 error: 'const struct can_frame' has no member named 'len',需要应用 issue 5 中讨论的代码修改。

cd ~/myactuator_rmd
mkdir build
cd build
cmake .. -D PYTHON_BINDINGS=on
make -j $(nproc)
sudo make install

标志 PYTHON_BINDINGS(默认为关闭)会额外构建 Python 绑定。如果只需使用 C++ 库,可以忽略此标志。当以这种方式构建 Python 绑定时,它们将被编译为共享库但不会安装。这意味着需要手动安装库,或者只能在构建文件夹中本地导入它们。

要卸载该包,可以使用以下命令:xargs rm < install_manifest.txt

构建 Python 库

要构建并安装此 SDK 的 Python 绑定,请在主文件夹中打开一个新终端并执行以下命令:

cd ~/myactuator_rmd
pip3 install .

这将使用 setup.py 调用 CMake 并将绑定安装为 C++ 库。如果需要移除它们,只需调用 pip3 uninstall myactuator-rmd-py

使用 C++ 控制

  1. 创建项目目录结构
    在代码 src 目录下创建项目目录,例如命名为 myactuator_example,并在子目录下创建一个 src 文件夹。
cd ~/myactuator_rmd
mkdir -p ~/myactuator_rmd/src/myactuator_example/src
cd ~/myactuator_rmd/src/myactuator_example
  1. 编写 CMakeLists.txt
    ~/myactuator_rmd/src/myactuator_example/CMakeLists.txt 文件中写入以下内容:
touch CMakeLists.txt
cmake_minimum_required(VERSION 3.20)  
project(myactuator_example)

# 查找 myactuator_rmd 库
find_package(myactuator_rmd REQUIRED)

# 创建可执行文件
add_executable(myactuator_node
src/main.cpp
)

# 使用 C++17 标准
target_compile_features(myactuator_node PUBLIC
cxx_std_17
)

# 链接 myactuator_rmd 库
target_link_libraries(myactuator_node PUBLIC
myactuator_rmd::myactuator_rmd
)
  1. 编写 main.cpp
    ~/myactuator_rmd/src/myactuator_example/src/main.cpp 文件中写入以下代码:
touch src/main.cpp
#include <cstdlib>
#include <iostream>
#include <myactuator_rmd/myactuator_rmd.hpp>

int main() {
myactuator_rmd::CanDriver driver {"can0"};
myactuator_rmd::ActuatorInterface actuator {driver, 1};

std::cout << actuator.getVersionDate() << std::endl;
std::cout << actuator.sendPositionAbsoluteSetpoint(180.0, 500.0) << std::endl;
actuator.shutdownMotor();
return EXIT_SUCCESS;
}
  1. 构建项目
cd ~/myactuator_rmd/src/myactuator_example
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
  1. 运行程序
sudo ./myactuator_node

前提条件

  • CAN 接口 can0 必须正确配置(确保电机和 CAN 总线正确连接)。
  • myactuator_rmd 库必须正确安装(如果未安装,请先安装)。

有关更多 C++ 实现细节,请参考 myactuator_rmd.hpp 中的所有内容。我们将详细介绍 Python 的使用方法。

使用 Python 控制

在目录 ~/myactuator_rmd/src/myactuator_example 下创建一个名为 scripts 的文件夹,用于存储 Python 脚本。

cd ~/myactuator_rmd/src/myactuator_example
mkdir scripts

获取版本号

在 scripts 目录下创建一个名为 test.py 的自定义 Python 脚本,并填入以下代码。

import myactuator_rmd_py as rmd
import time

# 初始化 CAN 驱动和执行器接口
driver = rmd.CanDriver("can0") # 使用 can0
actuator = rmd.ActuatorInterface(driver, 1) # CAN ID 设置为 1

# 获取版本号
print("版本号:", actuator.getVersionDate())

加载库并继续为特定网络接口(此处为 can0)和驱动(此处为 1,对应 CAN 地址 0x140 + 1 = 0x141)创建驱动。

获取电机状态

# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

# 电机状态 1
status1 = actuator.getMotorStatus1()
print(f"""
电机状态 1:
温度: {status1.temperature}°C
刹车状态: {'已释放' if status1.is_brake_released else '已锁定'}
电压: {status1.voltage}V
错误代码: {status1.error_code}
""")

# 电机状态 2
status2 = actuator.getMotorStatus2()
print(f"""
电机状态 2:
温度: {status2.temperature}°C
电流: {status2.current}A
轴速度: {status2.shaft_speed} RPM
轴角度: {status2.shaft_angle}°
""")

# 电机状态 3
status3 = actuator.getMotorStatus3()
print(f"""
电机状态 3:
温度: {status3.temperature}°C
相位 A 电流: {status3.current_phase_a}A
相位 B 电流: {status3.current_phase_b}A
相位 C 电流: {status3.current_phase_c}A
""")

## 扭矩计算

import myactuator_rmd_py as rmd
from myactuator_rmd_py.actuator_constants import X4_24 # 根据您的电机型号导入

def get_normalized_torque(actuator):
"""从电流计算归一化扭矩"""
# 获取电流值
status = actuator.getMotorStatus2()
current = status.current

# 计算归一化扭矩(电流/额定值)
torque_ratio = current / X4_24.rated_current
actual_torque = torque_ratio * X4_24.rated_torque
return actual_torque

# 使用示例
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

try:
while True:
torque = get_normalized_torque(actuator)
print(f"当前扭矩: {torque:.3f} Nm (额定: {X4_24.rated_torque} Nm)", end='\r')
time.sleep(0.1)
except KeyboardInterrupt:
actuator.shutdownMotor()

控制模式

  • 获取当前控制模式
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
mode = actuator.getControlMode()
print(f"当前控制模式: {mode}")
  • 绝对位置控制
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

# 移动到 180 度位置,速度为 100 度/秒
actuator.sendPositionAbsoluteSetpoint(180.0, 300.0)
time.sleep(5) # 等待电机到达目标位置

# 获取当前位置
angle = actuator.getMultiTurnAngle()
print(f"当前位置: {angle}°")

time.sleep(5)
mode = actuator.getControlMode()
print(f"当前控制模式: {mode}")
actuator.shutdownMotor()

您将看到电机旋转到 180 度位置。

  • 相对位置控制
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

# 从当前位置再移动 90 度
current_angle = actuator.getMultiTurnAngle()
target_angle = current_angle + 90.0
actuator.sendPositionAbsoluteSetpoint(target_angle, 50.0)
time.sleep(3)
angle = actuator.getMultiTurnAngle()
print(f"当前位置: {angle}°")
mode = actuator.getControlMode()
print(f"当前控制模式: {mode}")
actuator.shutdownMotor()

您将观察到电机逆时针旋转 90 度。

  • 速度控制
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

# 连续旋转,速度为 500 RPM
actuator.sendVelocitySetpoint(500.0)
time.sleep(15)

# 停止电机
actuator.stopMotor()

# 获取当前位置
angle = actuator.getMultiTurnAngle()
print(f"当前位置: {angle}°")

mode = actuator.getControlMode()
print(f"当前控制模式: {mode}")
  • 扭矩控制
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

# 施加 0.5A 电流(扭矩)
actuator.sendCurrentSetpoint(0.5)
time.sleep(2)

# 停止扭矩输出
actuator.stopMotor()

# 获取当前位置
angle = actuator.getMultiTurnAngle()
print(f"当前位置: {angle}°")

mode = actuator.getControlMode()
print(f"当前控制模式: {mode}")
  • 闭环运动控制
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time

# 初始化
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

# 带反馈的位置控制
feedback = actuator.sendPositionAbsoluteSetpoint(180.0, 100.0)
time.sleep(5)
print(feedback)


# 带反馈的速度控制
feedback = actuator.sendVelocitySetpoint(20.0)
time.sleep(5)
print(feedback)

# 带反馈的扭矩控制
torque_constant = 0.32 # 根据电机型号设置
feedback = actuator.sendTorqueSetpoint(1.5, torque_constant)
time.sleep(5)
print(feedback)

actuator.stopMotor()

电机刹车控制

# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

# 启用刹车
actuator.lockBrake()
print("刹车已启用")

# 释放刹车
actuator.releaseBrake()
print("刹车已释放")

电机电源控制

# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

# 关闭电机电源
actuator.shutdownMotor()
print("电机电源已关闭")

编码器功能

  • 获取多圈编码器位置
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
encoder_pos = actuator.getMultiTurnEncoderPosition()
print(f"多圈编码器位置: {encoder_pos}")
  • 将当前位置设置为零点(需要重启)
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)
actuator.setCurrentPositionAsEncoderZero()
print("当前位置已设置为编码器零点")
  • 设置自定义零点(需要重启)
# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time

driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

# 获取当前位置作为零点
current_pos = actuator.getMultiTurnEncoderOriginalPosition()
print(f"原始编码器位置: {current_pos}")

# 设置零点偏移
actuator.setEncoderZero(current_pos)
print(f"编码器零点已设置为: {current_pos}")

# 重启以应用设置
actuator.shutdownMotor()
time.sleep(1) # 等待关闭
actuator = rmd.ActuatorInterface(driver, 1) # 重新初始化

# 验证
new_pos = actuator.getMultiTurnEncoderPosition()
print(f"重启后的位置(应接近 0): {new_pos}")

加速度设置

# -*- coding: gbk -*-
import myactuator_rmd_py as rmd
import time
from myactuator_rmd_py.actuator_state import AccelerationType

# 初始化
driver = rmd.CanDriver("can0")
actuator = rmd.ActuatorInterface(driver, 1)

## 获取初始加速度
print(f"初始加速度: {actuator.getAcceleration()}")

actuator.setAcceleration(5000, AccelerationType.POSITION_PLANNING_ACCELERATION)

## 获取修改后的加速度
print(f"修改后的加速度: {actuator.getAcceleration()}")

# 设置不同的加速度类型
actuator.setAcceleration(1000, AccelerationType.POSITION_PLANNING_ACCELERATION)
actuator.setAcceleration(800, AccelerationType.POSITION_PLANNING_DECELERATION)
actuator.setAcceleration(1200, AccelerationType.VELOCITY_PLANNING_ACCELERATION)
actuator.setAcceleration(1000, AccelerationType.VELOCITY_PLANNING_DECELERATION)

技术支持与产品讨论

感谢您选择我们的产品!我们致力于为您提供多种支持,以确保您使用我们的产品时体验顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...