OnRobot RG2 控制(Compute Box)

📅 2026/7/8 13:06:47
OnRobot RG2 控制(Compute Box)
一、硬件https://onrobot.com/en/products/rg2-finger-gripper1. 连接onrobot rg2和compute box并连接到路由器/交换机。2.rg2 夹爪是否亮绿灯。3.测试网络连通性。IP地址可能需要通过路由器查看。ping 192.168.1.2二、软件Ubuntu 22.041. 创建conda环境conda create -n robot -n python3.102. 安装pymodbuspip install pymodbus3. 代码3.1 主代码from pymodbus.client import ModbusTcpClient import time def control_rg2(ip_address, target_width_mm, target_force_n, slave_id65): 控制 OnRobot RG2 夹爪 (终极优化版) :param ip_address: Compute Box 的 IP 地址 :param target_width_mm: 目标宽度 (毫米, 0 到 110) :param target_force_n: 目标力 (牛顿, 0 到 40) :param slave_id: Modbus 设备 ID (根据扫描结果当前设备为 65) # 使用 with 语句确保网络资源正确释放 with ModbusTcpClient(ip_address, port502, timeout3) as client: if not client.connect(): print(f❌ 无法连接到 Compute Box ({ip_address})) return try: # RG2 寄存器要求传入的值是 1/10 毫米 和 1/10 牛顿 width_val int(max(0, min(110, target_width_mm)) * 10) force_val int(max(0, min(40, target_force_n)) * 10) print(f正在发送指令 - 宽度: {target_width_mm} mm, 力度: {target_force_n} N (Device ID: {slave_id})) # 将 目标力、目标宽度、触发信号 打包 payload [force_val, width_val, 1] # 【关键修复】使用 device_id65 批量写入连续寄存器 response client.write_registers(address0, valuespayload, device_idslave_id) if response.isError(): print(f⚠️ Modbus 拒绝了写入请求: {response}) else: print(✅ 动作指令发送成功) # 给夹爪留出机械运动的时间 time.sleep(2) except Exception as e: print(f❌ 通信过程中发生错误: {e}) if __name__ __main__: COMPUTE_BOX_IP 192.168.1.2 print(--- 场景 1闭合夹爪 ---) # 先用较小的力 (15N) 测试确保安全 control_rg2(COMPUTE_BOX_IP, target_width_mm0, target_force_n35) time.sleep(1) print(\n--- 场景 2完全张开夹爪 ---) control_rg2(COMPUTE_BOX_IP, target_width_mm110, target_force_n35)3.2 扫描设备端口号代码import logging from pymodbus.client import ModbusTcpClient from pymodbus.exceptions import ModbusException # 屏蔽 pymodbus 底层烦人的异常打印保持控制台整洁 logging.getLogger(pymodbus).setLevel(logging.CRITICAL) def scan_modbus_ids(ip_address): # 测试最常见的几个 OnRobot ID test_ids [1, 65, 0, 2, 255] print(f 开始扫描 Compute Box ({ip_address}) 的 Device ID ) with ModbusTcpClient(ip_address, port502, timeout1.5) as client: if not client.connect(): print(❌ TCP连接失败请检查网络) return print(✅ TCP连接成功 (502端口开放)开始发送探测包...\n) for sid in test_ids: print(f 正在测试 Device ID: {sid:3} ... , end, flushTrue) try: # 尝试读取地址 0 的数据 response client.read_holding_registers(address0, count1, device_idsid) if response.isError(): print(f收到设备响应(提示异常但证明通讯已打通正确的 ID 是: {sid})) else: print(f 成功找到正确的 Device ID: {sid}当前值为: {response.registers}) except ModbusException: # 捕获超时异常防止程序崩溃让它安静地继续查下一个 print(超时无响应 (非此ID)) except Exception as e: print(f发生未知错误: {e}) if __name__ __main__: scan_modbus_ids(192.168.1.2)