Robotics XM430-W350 云台电机使用记录

本文详细介绍了如何在ROS平台上利用DynamixelSDK控制TrossenRobotics的XM430-W350伺服舵机,包括串口配置、DYNAMIXELWizard2.0的波特率调整和基本控制节点操作,以及上位机DYNAMIXELWizard2.0的使用方法。

XM430-W350 是加拿大 Trossen Robotics 公司生产的一种伺服舵机。公司给这种电机配套了自研的控制协议以及开发 SDK 例程 Dynamixel SDK,此处记录下基于ROS的开发例程的使用方法,主要目的是用来控制2自由度云台。

目录

1、XM430-W350 伺服舵机简介

2、基于 ROS 平台的控制方法

3、上位机 DYNAMIXEL Wizard 2.0 的使用


1、XM430-W350 伺服舵机简介

XM430-W350 伺服舵机的数据手册链接:XM430-W350-T/R

Dynamixel SDK 的介绍及使用方法链接:DYNAMIXEL SDK

Dynamixel SDK 的源码链接:https://github.com/ROBOTIS-GIT/DynamixelSDK 

该伺服舵机的控制使用了公司自研的 DYNAMIXEL protocol 2.0 协议。Dynamixel SDK 支持 Linux、Windows、Mac 系统以及 arduino ,并支持基于 C++ / C / C# / python / java / matlab / LabVIEW 语言的开发以及基于 ROS 机器人框架(C++/python都有)的开发。

本文主要记录下基于ROS的开发例程的使用方法。

整体来说,这款电机的的控制方式是基于串口通信的协议。Dynamixel SDK 文件夹中有两个比较重要的底层配置文件夹,一个是实现串口初始化的配置文件以及 DYNAMIXEL 协议的实现文件。最终可以使用 DYNAMIXEL 协议通过串口向控制板读写命令的方式控制电机。

串口通信的初始化源码在 port_handler_[whichOS].cpp 文件中,whichOS 是具体使用的操作系统,比如如果是在 Linux 系统下做开发的话就是通过 port_handler_linux.cpp 文件来配置串口。DYNAMIXEL 协议的实现源码在 protocol2_packet_handler.cpp 中。该协议有两个版本,默认使用 2.0 的版本。Dynamixel SDK 文件夹中剩下的就是基于这两个底层配置使用各种开发语言或者平台实现对舵机控制的例程了。

2、基于 ROS 平台的控制方法

首先是创建 ROS 工作空间并初始化。这里简要记录下创建流程:

首先创建一个 ROS 工作空间文件夹,名字随意,并在该文件夹内创建 src 文件并进入:

mkdir dynamixel-test
cd dynamixel-test
mkdir src
cd src

使用 catkin_init_workspace 命令在 dynamixel-test/src 文件夹中初始化工作空间。然后回退到上一级目录,此时虽然没有创建 ROS 包我们仍然可以使用 catkin_make 命令对工作空间进行编译:

cd ..
catkin_make

cd 到 src 目录下下载 SDK,然后编译即可:

cd src
git clone https://github.com/ROBOTIS-GIT/DynamixelSDK.git
cd ..
catkin_make

可以使用 ls /dev/ttyUSB* 命令获取已插入的 USB 端口

***@**:~$ ls /dev/ttyUSB*
/dev/ttyUSB0

如果扫描出来的USB端口号不是0,则需要修改源码中的ROS节点中对应的串口端口号,然后再重新编译。

#define DEVICE_NAME           "/dev/ttyUSB0"  // [Linux] To find assigned port, use "$ ls /dev/ttyUSB*" command

需要修改的文件

  • bulk_read_write_node.cpp
  • indirect_address_node.cpp
  • read_write_node.cpp
  • sync_read_write_node.cpp

上述节点的运行方法在源码中都有示例,这里以 read_write_node 和 bulk_read_write_node 为例说明。

先测试 read_write_node 节点,这个节点一次只能控制一个舵机运动

rosrun dynamixel_sdk_examples bulk_read_write_node

============= BUG ============

刚开始可能会报错如下:

[PortHandlerLinux::SetupPort] Error opening serial port!
[ERROR] [1657712981.288514643]: Failed to open the port!

这是由于串口权限不足,使用以下命令赋予串口权限:

sudo chmod 666 /dev/ttyUSB0

然后再次运行上述的rosrun指令问题就解决了,不过上述的权限指令每次都得运行,后面再找下有没有可以永久设置的方法再来更新。

2022.07.19更新:可以固定端口号,顺便设置访问权限。

把Linux下外设的USB端口号映射到固定的名字_地球被支点撬走啦的博客-优快云博客

============= BUG END ============

然后运行 rostopic 指令发布话题:

rostopic pub -l /set_position dynamixel_sdk_examples/SetPosition "{id: 1, position: 1000}"

接下来测试 bulk_read_write_node 节点,这个节点可以一次控制多个舵机运动:

rosrun dynamixel_sdk_examples bulk_read_write_node

然后在新的终端里输入 rostopic 指令发布话题:

rostopic pub -1 /bulk_set_item dynamixel_sdk_examples/BulkSetItem "{id1: 2, id2: 3, item1: 'position', item2: 'position', value1: 2300, value2: 2300}"

还可以订阅服务:

**@***:~$ rosservice call /bulk_get_item "{id1: 2, id2: 3, item1: 'position', item2: 'position'}"
value1: 2301
value2: 1803

item 选项可以是 position 或者 LED,还可以根据数据手册的 control table来拓展自己的功能。

3、上位机 DYNAMIXEL Wizard 2.0 的使用

刚买回来的舵机配置的波特率可能跟源码中的不一样,我这个就是,源码中的波特率是57000,而通过上位机搜索才知道舵机里的波特率配置的是1000000 (T_T),所以如果波特率不匹配的话他还汇报错如下:

Failed to enable torque for Dynamixel ID 1

可以再源码中找到这个报错信息的片段,可以发现就是通信的问题:

  dxl_comm_result = packetHandler->write1ByteTxRx(
    portHandler, DXL1_ID, ADDR_TORQUE_ENABLE, 1, &dxl_error);
  if (dxl_comm_result != COMM_SUCCESS) {
    ROS_ERROR("Failed to enable torque for Dynamixel ID %d", DXL1_ID);
    return -1;
  }

上位机下载地址:ROBOTIS

可以选择 Windows、Linux、Mac三种版本的下载

我这里是Windows版的为例:

 打开软件之后可以现在软件的 Options 选项中选择一些参数,如果不知道的话就全选,然后选择 Scan 选项让上位机自己扫描搜索,但是可能耗时比较长,我就是从这里发现我的新舵机的初始波特率是 1000000 而不是源码中的 57000 的。

下面是一个使用的例子,目的是设置 ID 为 1 的舵机运动到指定的位置。

<think>我们正在讨论Dynamixel XM430舵机的末端柔顺控制实现方法。根据引用内容,我们知道XM430-W350舵机支持多种控制模式(引用[2]提到六种控制模式),并且有ROS开发例程(引用[1])以及使用Dynamixel SDK(引用[3][4])进行控制。末端柔顺控制通常指让机械臂末端在执行任务时具有一定的柔顺性,以适应环境接触力,避免刚性冲击。实现方法一般包括阻抗控制、导纳控制、力控制等。 步骤: 1. 了解舵机的控制模式:根据引用[2],XM430舵机支持多种控制模式,包括位置控制、速度控制、电流控制(扭矩控制)等。柔顺控制通常需要扭矩控制模式,因为我们需要根据力传感器反馈或外部扰动来调整输出扭矩。 2. 硬件准备:可能需要力/力矩传感器(如六维力传感器)安装在末端,或者通过电流反馈间接估计外力(如果舵机提供电流反馈)。引用[3]提到可以读取电流等参数,这可以用于估计外部扭矩。 3. 控制策略:柔顺控制的核心是建立力与位置/速度之间的关系。例如,阻抗控制的目标是使末端表现出期望的阻抗特性(质量-弹簧-阻尼系统),即:$F = M \ddot{x} + B \dot{x} + K x$,其中$F$是外力,$x$是位置偏差,$M$、$B$、$K$分别为惯性、阻尼和刚度系数。通过调整这些参数,可以控制末端的柔顺性。 4. 实现方法: a. 设置舵机为扭矩控制模式(或电流控制模式),这样我们可以直接给定扭矩。 b. 通过力传感器或电流反馈获取外力信息。 c. 根据柔顺控制算法(如阻抗控制)计算所需的扭矩指令。 d. 发送扭矩指令给舵机。 但是,由于XM430舵机本身可能没有直接提供力反馈接口,我们可以利用其电流反馈(引用[3]提到可以读取电流)来估计外部扭矩。因为舵机的电流与输出扭矩成正比(通常有比例系数,需要查阅手册)。 具体步骤(以阻抗控制为例): 1. 设置舵机为扭矩控制模式(通过Dynamixel SDK设置控制模式)。 2. 读取当前关节角度(位置)和电流(扭矩反馈)。 3. 通过运动学计算得到末端位置(如果需要末端柔顺,则需进行运动学正解)。 4. 通过力传感器读取末端外力(如果没有力传感器,则无法直接获取,但可以通过关节扭矩和动力学模型估计末端力,这比较复杂)。 5. 根据期望的阻抗模型计算期望的末端加速度、速度、位置变化,然后通过逆动力学或雅可比转置计算关节扭矩。 6. 将关节扭矩转换为电流值(根据舵机的扭矩常数)并发送给舵机。 然而,如果我们的系统没有力传感器,我们可以考虑使用基于位置的扭矩控制(即通过位置偏差来产生恢复扭矩)来模拟柔顺性,但这通常只能实现关节空间的柔顺,而不是末端。 另一种简化的方法是使用舵机自带的位置控制模式,但设置较低的位置增益(即降低刚度)和增加阻尼增益,这样在受到外力时位置可以较容易地改变,但这种方法不够直接,且难以精确控制柔顺特性。 考虑到XM430舵机支持轮廓控制(引用[2]提到轮廓控制),我们可以利用轮廓控制(即设定目标位置、速度和加速度)来实现平滑运动,但这不是柔顺控制。 因此,要实现末端柔顺控制,我们推荐使用扭矩控制模式,并配合力传感器(或使用电流反馈估计外力)来实现。 具体到Dynamixel SDK和ROS: 1. 使用Dynamixel SDK设置舵机为扭矩控制模式(控制模式通常对应一个数字,需要查手册,例如对于XM430,扭矩控制模式可能是4或5,具体需参考手册)。 2. 在ROS中编写节点,订阅力传感器的话题(如果有力传感器),或者通过读取舵机的电流反馈(通过Dynamixel SDK的读取函数)来估计外力。 3. 实现阻抗控制算法(或其他柔顺控制算法),计算所需的关节扭矩。 4. 通过Dynamixel SDK将扭矩指令发送给舵机。 注意:扭矩控制模式下,我们发送的是扭矩值(或电流值,取决于舵机的寄存器映射)。需要查阅XM430手册,了解如何设置控制模式以及如何发送扭矩指令。 引用[3]提到使用stm32控制Dynamixel电机,实现了多模式运动和参数读取,这可以借鉴。我们可以通过类似的方法读取电流(扭矩反馈)并发送扭矩指令。 如果没有力传感器,我们可以尝试仅通过关节扭矩反馈(即电流反馈)来估计外部扭矩。方法如下: - 在没有外力作用时,记录维持当前姿态所需的关节扭矩(即电流值)。 - 当有外力作用时,关节扭矩会发生变化,通过比较实际扭矩与预期扭矩(通过动力学模型计算)的差值,可以估计外部扭矩。 但是,动力学模型的建立需要机器人的质量、惯性参数等,且计算复杂。 因此,对于精确的末端柔顺控制,建议安装力传感器。 总结步骤: 1. 设置舵机为扭矩控制模式(通过Dynamixel SDK)。 2. 周期性地读取关节位置和电流(扭矩)值。 3. 通过力传感器获取末端外力,或通过关节扭矩和动力学模型估计末端外力(需要机器人模型)。 4. 根据柔顺控制算法(如阻抗控制)计算期望的关节扭矩。 5. 将期望的关节扭矩转换为舵机的扭矩指令(注意单位转换,通常舵机的扭矩指令是一个整数,范围在0到最大值之间,需要根据手册映射)。 6. 发送扭矩指令。 注意:由于舵机的扭矩控制模式可能有限制(如最大扭矩限制),需要确保指令在安全范围内。 关于ROS实现,引用[1]提到有基于ROS的开发例程,我们可以在这个例程的基础上编写柔顺控制节点。 参考文献: [^1]: Robotics XM430-W350 云台电机使用记录 [^2]: Dynamixel数字伺服舵机XM430-W350-R [^3]: Dynamixel电机xm430-w210(TTL 协议2)stm32控制:多模式运动和参数读取 [^4]: Dynamixel X系列舵机快速使用(Windows与ROS) 相关问题: 1. 如何设置Dynamixel XM430舵机为扭矩控制模式? 2. 在ROS中如何读取Dynamixel舵机的电流反馈? 3. 阻抗控制算法的具体实现步骤是什么? 4. 如何通过关节扭矩估计末端外力? 5. Dynamixel舵机在扭矩控制模式下的安全注意事项有哪些?</think>### Dynamixel XM430舵机末端柔顺控制实现方法 末端柔顺控制旨在使机械臂末端具备顺应外部力作用的能力,避免刚性碰撞,适用于精密装配、人机交互等场景。基于Dynamixel XM430舵机的特性(支持多模式控制[^2]),实现方法如下: --- #### **核心步骤** 1. **硬件准备** - 使用XM430-W350舵机(支持扭矩控制模式[^2]) - 可选:安装六维力传感器于末端(直接测量接触力) - 通过TTL/USB转接器连接舵机与控制主机(PC或嵌入式设备)[^4] 2. **设置扭矩控制模式** XM430支持**6种控制模式**(位置/速度/电流等),柔顺控制需启用**电流控制模式**(间接控制扭矩): ```python # 使用Dynamixel SDK设置控制模式(Python示例) dxl_comm_result, dxl_error = packetHandler.write1ByteTxRx(portHandler, DXL_ID, ADDR_OPERATING_MODE, 0) # 0=电流控制模式 ``` 电流值与扭矩的换算关系:$ \tau = k \cdot I $($k$为电机扭矩常数,需查手册) 3. **柔顺控制算法实现** - **阻抗控制法**(无需力传感器): 建立虚拟弹簧-阻尼模型,根据位置偏差计算补偿扭矩: $$ \tau_{cmd} = K_p (x_{des} - x_{act}) + K_d (\dot{x}_{des} - \dot{x}_{act}) $$ 其中 $K_p$ 调刚度,$K_d$ 调阻尼。低$K_p$值可增强柔顺性[^3]。 - **导纳控制法**(需力传感器): 根据末端受力$F_{ext}$计算目标加速度: $$ \ddot{x}_{cmd} = M^{-1} (F_{ext} - B \dot{x} - K x) $$ 再通过积分生成位置指令发送给舵机[^1]。 4. **实时控制循环** ```mermaid graph TD A[读取当前状态] --> B{是否用力传感器?} B ----> C[获取末端接触力F_ext] B ----> D[通过电流估算关节扭矩] C --> E[导纳控制器计算目标轨迹] D --> F[阻抗控制器直接输出τ_cmd] E --> G[生成位置/速度指令] G --> H[发送指令至舵机] F --> H ``` 5. **关键参数调试** - 降低位置增益(减少刚性响应) - 提高电流限幅值(允许外力推动末端) - 设置平滑滤波器(`Profile Acceleration/Velocity`[^4]) --- #### **ROS实现参考** ```python # 基于ros_control的伪代码 def compliance_controller_callback(): # 读取关节状态 current_pos = joint_state.position current_vel = joint_state.velocity # 阻抗控制计算(以单关节为例) tau_cmd = kp * (target_pos - current_pos) + kd * (target_vel - current_vel) # 发送扭矩指令 motor.set_torque(tau_cmd) ``` > **注意**: > - 无传感器方案依赖精确的动力学模型补偿重力/摩擦力[^3] > - 高响应场景需优化通信周期(建议≥100Hz) --- ### 相关问题 1. 如何通过Dynamixel SDK读取XM430舵机的实时电流值? 2. 在ROS中如何集成六维力传感器数据实现导纳控制? 3. 柔顺控制与传统的PID位置控制有何本质区别? 4. XM430舵机的扭矩控制模式有哪些具体限制? 5. 如何验证柔顺控制系统的稳定性与安全性? [^1]: Robotics XM430-W350 云台电机使用记录 [^2]: Dynamixel数字伺服舵机XM430-W350-R [^3]: Dynamixel电机xm430-w210(TTL 协议2)stm32控制:多模式运动和参数读取 [^4]: Dynamixel X系列舵机快速使用(Windows与ROS
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地球被支点撬走啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值