基于手柄遥操作机械臂采集动作数据并训练模仿学习模型(1)

近期在复现DP3的相关工作,目前尝试过在仿真环境和真实环境分别采集数据,记录相关工作,方便后续查阅。本文将详细分析一个结合手柄控制、数据采集和动作回放功能的机械臂控制系统。该系统允许用户通过手柄实时控制机械臂运动,同时记录丰富的传感数据和操作状态,实现复杂任务的动作录制和回放功能。

系统概述

这个控制系统的核心它集成了以下功能:

  • ​手柄控制​​:使用手柄摇杆和按钮控制机械臂6自由度运动

  • ​数据采集​​:记录点云、RGB图像、深度图像、机械臂状态等多模态数据

  • ​动作录制与回放​​:录制手柄操作序列并精确回放

  • ​安全保护​​:包括工作空间限制和异常处理机制

  • ​可视化界面​​:实时显示系统状态和操作信息

关键组件分析

1. 手柄控制模块

系统通过pygame库处理手柄输入,提供直观的操控体验:

# 手柄映射关系 左摇杆上下 → X轴移动 左摇杆左右 → Y轴移动 L1/L2 → Z轴控制 右摇杆上下 → RX旋转 右摇杆左右 → RY旋转 R1/R2 → RZ旋转 # 功能按钮 SELECT → 打开夹爪 START → 关闭夹爪 BUTTON4+BUTTON5 → 开始记录数据 BUTTON6+BUTTON7 → 结束记录数据 BUTTON10 → 动作录制开关 BUTTON11 → 回放功能开关

2. 数据采集系统

系统以10Hz频率采集多模态数据:

# 采集数据类型 - 时间戳 - 原始点云数据(307,200个点) - RGB图像(处理后为84x84) - 深度图像(处理后为84x84) - 机械臂状态:[x, y, z, rx, ry, rz, gripper] - 动作指令:[dx, dy, dz, drx, dry, drz, gripper_target]

数据预处理采用专门的工具函数:

processed_pc = preprocess_point_cloud(point_cloud, extrinsics_matrix, work_space) processed_rgb = preprocess_image(rgb_image, img_size=84)

3. 存储系统

采用高效的Zarr格式存储采集数据:

def write_zarr(filename, point_clouds, rgb_images, depth_images, states, actions, episode_ends): # 创建Zarr存储结构 store = zarr.DirectoryStore(filename) root = zarr.group(store=store, overwrite=True) # 设置压缩器 compressor = zarr.Blosc(cname='zstd', clevel=3, shuffle=1) # 分别存储各类数据 data_group = root.create_group('data') data_group.create_dataset('point_cloud', ...) data_group.create_dataset('img', ...) data_group.create_dataset('depth', ...) data_group.create_dataset('state', ...) data_group.create_dataset('action', ...) # 存储元数据 meta_group = root.create_group('meta') meta_group.create_dataset('episode_ends', ...)

4. 动作录制与回放系统

实现了一套完整的录制-回放工作流:

​录制功能:​

def start_recording_actions(self): self.recording_actions = True self.recorded_actions = [] self.recorded_timestamps = [] def stop_recording_actions(self): # 保存为pkl文件 data = {'timestamps': self.recorded_timestamps, 'actions': self.recorded_actions} with open(filename, 'wb') as f: pickle.dump(data, f)

​回放功能:​

def start_playback(self): self.playing_actions = True self.playback_index = 0 self.playback_start_time = time.time() def next_playback_action(self): if current_time >= recorded_timestamps[self.playback_index]: # 执行录制的动作 if action_type == "button": # 模拟按钮操作 elif action_type == "axis": # 模拟摇杆操作

​回放模式工作流:​

1. BUTTON11进入回放模式 2. L1/L2选择回放文件 3. L1+L2确认文件选择 4. R1/R2调整重复次数 5. R1+R2确认重复次数 6. BUTTON11开始回放

系统架构

+-----------------+ | Pygame | | Joystick | +-------+---------+ | v +-----------------+ +------+------+ +-----------------+ | Aubo机械臂 <----+ Controller +----> 夹爪控制 | +-----------------+ +------+------+ +-----------------+ | v +-------+---------+ | 相机系统 | | (RGB-D相机) | +-------+---------+ | v +-------+---------+ | 数据采集系统 +----> Zarr存储 | | | | | v | v | 动作录制回放 +----> PKL文件 +-----------------+

创新点与优势

  1. ​多模态数据同步采集​​:同时记录机械臂状态、传感数据和操作指令,形成完整的数据闭环

  2. ​高效存储方案​​:Zarr格式+Blosc压缩,大幅提升点云和图像数据的存储效率

  3. ​精确动作回放​​:基于时间戳的动作序列回放,实现操作精确复现

  4. ​安全机制​​:工作空间限制、异常处理和自动复位功能

  5. ​交互式界面​​:实时状态显示和控制信息可视化

  6. ​可扩展架构​​:模块化设计便于集成新传感器和控制算法

应用场景

  1. ​机器人学习​​:采集演示数据用于模仿学习或强化学习

  2. ​工业自动化​​:录制和复现精密装配操作

  3. ​研究验证​​:实现算法效果的精确复现和对比

  4. ​教育培训​​:机器人操作培训和技能传递

使用示例

# 初始化系统 controller = AuboJoystickController(aubo_controller, driver, camera, T_camera_to_base) # 开始控制循环 controller.start_control() # 导出数据 controller.export_data('motion_data.csv')

总结

这个控制系统提供了一个完整的手柄操作-数据采集-动作回放解决方案。通过精心设计的架构和丰富的功能,它既满足专业研究的高要求,又保持了操作的便捷性。系统的多模态数据采集和高效存储方案为机器人学习研究提供了可靠的数据支持,而动作录制回放功能则大大提高了操作效率和实验的可重复性。无论是进行机器人算法研究,还是部署工业自动化解决方案,这个系统都能提供强大的技术支持。其模块化设计也使得系统能够灵活扩展,适应未来更复杂的应用场景。

### 关于使用手柄控制机械的实现方案 #### 方案概述 为了实现手柄远程控制机械的功能,可以采用多种技术和工具组合的方式完成。以下是几种常见的实现方法及其特点: --- #### 方法一:基于相对坐标的控制逻辑设计 一种有效的解决方案是利用相对坐标而非绝对坐标来映射手柄动作机械运动中[^1]。这种方式的优点在于避免了因机械物理尺寸限制而导致的操作不便问题。例如,在实际应用中可以通过按下特定按键触发机械移动功能,从而允许用户自由调整姿态而不受初始位置约束。 代码示例展示了如何通过计算当前位置偏移量来进行相对定位: ```python def relative_control(current_position, joystick_input): delta_x = map(joystick_input['axis_x'], -1, 1, -0.1, 0.1) # 将手柄轴值映射为机械位移增量 delta_y = map(joystick_input['axis_y'], -1, 1, -0.1, 0.1) new_position = { 'x': current_position['x'] + delta_x, 'y': current_position['y'] + delta_y } return new_position ``` 这种方法特别适合小型化或者受限空间内的机械控制系统开发需求。 --- #### 方法二:借助第三方SDK进行深度集成 对于某些品牌如遨博协作机器人(AUBO),其官方提供的软件开发包(SDK)[^2]支持丰富的API接口访问权限。开发者可以直接调用手柄输入信号通过网络传输给目标设备执行相应指令。主要流程如下所示: 1. **建立通信链路**: 确保主机与机械位于同一局域网环境内,尝试连接至默认服务端口`8899`. 2. **解析手柄事件流**: 获取来自游戏控制器的方向键/模拟摇杆状态变更通知。 3. **发送命令序列**: 调用预定义好的函数原型向远端传递参数化的动作描述符。 下面是一个简单的伪代码片段说明这一过程: ```cpp #include <aubo_interface.h> int main(){ AUBORobot arm("192.168.1.10", 8899); if(!arm.connect()) { /* Handle error */ } while(true){ readJoystickState(&joystickData); // Assume this reads latest state double speedFactorX = convertAxisValueToSpeed(joystickData.axisLeftX); double speedFactorY = convertAxisValueToSpeed(joystickData.axisLeftY); Vector3D velocity(speedFactorX, speedFactorY, 0); arm.sendVelocityCommand(velocity); } } ``` 此途径的优势在于充分利用厂商优化后的底层驱动层能力,减少自行维护硬件抽象层的工作负担。 --- #### 方法三:Arduino平台下的低成本DIY实践案例 针对预算有限但又希望动手制作简易版系统的爱好者来说,选用像Arduino Nano这样的微控单元配合PS2传统型游戏操纵器不失为明智之选[^3]。整个项目构建围绕几个核心环节展开讨论——即数据采集、数值变换以及最终输出反馈机制的确立。 典型应用场景可能涉及单片机驱动伺服电机转动一定角度响应玩家手势改变情况。这里给出一段基础示范程序帮助理解原理架构: ```c++ #include <Servo.h> #define PS2_DATAPIN 7 #define PS2_CMDPIN 6 #define PS2_ATNPIN 5 #define PS2_CLKPIN 4 // Initialize servo motor object. Servo myservo; void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); } void loop() { int buttonPressed; unsigned char cmd[6]; ps2_read(cmd); // Read raw command bytes from controller // Map buttons to actions here... if (isButtonAPressed(cmd)) { moveServoToAngle(myservo, calculateTargetDegree()); } else if(isDPadUp(cmd)){ incrementCurrentPosition(); } } ``` 尽管如此做法灵活性较高却也伴随着精度损失风险增加等问题需要注意规避。 --- #### 方法四:ROS框架下高级自动化编程范式探索 Robot Operating System(Reduced as ROS),作为一个开源社区主导产物广泛应用于现代工业和服务领域当中[^4]. 它不仅简化了许多复杂任务处理难度还促进了跨学科间合作交流可能性. 以编写自定义节点为例演示怎样订阅Joy消息主题进而操控实体装置行为表现形式: ```python #!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from std_msgs.msg import Float64MultiArray class ArmControllerNode(object): def __init__(self): self._pub_joint_positions = rospy.Publisher('/joint_group_position_controller/command', Float64MultiArray, queue_size=1) rospy.Subscriber("/joy", Joy, callback=self.joy_callback) def joy_callback(self,msg): joint_angles = [] for i in range(len(msg.axes)): angle = msg.axes[i]*MAX_ANGLE_DEVIATION_PER_AXIS joint_angles.append(angle) array_msg = Float64MultiArray() array_msg.data = joint_angles self._pub_joint_positions.publish(array_msg) if __name__ == '__main__': try: rospy.init_node('simple_arm_teleoperation') node_instance = ArmControllerNode() rospy.spin() except Exception as e: print(e) ``` 上述例子清晰表明即使面对较为复杂的多自由度机构也能依靠标准化组件快速组装成型满足预期效果的同时保持良好扩展性特征不变。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值