https://github.com/enpeizhao/episode_robot
6轴机械臂 6 degrees robot arm
https://github.com/enpeizhao/episode_robot
computer-vision llm python robotics vlm
Last synced: 2 months ago
JSON representation
6轴机械臂 6 degrees robot arm
- Host: GitHub
- URL: https://github.com/enpeizhao/episode_robot
- Owner: enpeizhao
- Created: 2025-02-20T04:35:58.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2025-02-20T04:44:25.000Z (8 months ago)
- Last Synced: 2025-06-28T10:40:06.320Z (3 months ago)
- Topics: computer-vision, llm, python, robotics, vlm
- Language: Python
- Homepage: https://enpeicv.com/forum.php?mod=forumdisplay&fid=56
- Size: 26.4 KB
- Stars: 6
- Watchers: 1
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
> 本项目是我为课程[《大模型视觉抓取6轴机械臂》](https://enpeicv.com/forum.php?mod=forumdisplay&fid=56) 设计的6轴机械臂。
>
> 主要目标是尽量用市面上的标准件制作一个性能优秀,价格优惠的教学用途机械臂(2000元以内)。
>
> If you have any questions, please submit issues or email me: enpeicv@outlook.com, have fun with it!
>
> 扫码加入微信WeChat交流群:
>
>
## 一、Episode 1机械臂参数:
**名称**:Episode 1(意为第一代,可能根据学员需求,后续升级迭代)
**本体**:主要传动机构为铝合金和45号钢CNC加工零件,外壳为PLA 3D打印件。6自由度,6个42步进电机,4个高精度行星减速器,FOC闭环驱动板,CAN总线通信,负载500g,活动半径510mm,高重复精度。
**夹爪**:负压真空夹爪,25KG 舵机2指柔性夹爪。
**软件**:ROBODK上位机,正逆解算,拖拽示教,TCP 协议API编程,3D、6D抓取网络,多模态VLM、LLM等。**SDK API**:TCP协议的API,支持各种编程语言,API有角度移动模式(MoveJ)、坐标位置模式、欧拉角模式、直线运动模式(MoveL)。
**应用**:已实现手眼标定(眼在手上、眼在手外)、3D、6D抓取等。
**视频演示**:[B站点击播放](https://www.bilibili.com/video/BV1KJwNepESk/?spm_id_from=333.1387.0.0&vd_source=39b1662212679b11469d17d3bee8df4e)
[
](https://www.bilibili.com/video/BV1KJwNepESk/?spm_id_from=333.1387.0.0&vd_source=39b1662212679b11469d17d3bee8df4e)
## 二、原理图:
**整体:**

**电机驱动:**
**夹爪:**
## 三、物料表
| 零件编号 | 图示 | 名称 | 类型 | 1成品实际数量 | 作用 |
| -------- | ------------------------------------------------------------ | ---------------- | -------- | ------------- | ------------------------------------ |
| 10003 || 小轴承支撑 | 3D打印 | 1 | 支撑两个轴承 |
| 10009 || J2腰关节 | 3D打印 | 1 | 腰关节 |
| 10010 || J6腕部 | 3D打印 | 1 | 腕部 |
| 10013 || 磁铁组装辅助 | 3D打印 | 1 | 用来安装电机后的磁铁 |
| 10016 || 法兰组装辅助 | 3D打印 | 1 | 用于辅助安装法兰螺丝 |
| 10017 || J1底座闸门 | 3D打印 | 1 | 底座闸门,用于固定各种插座 |
| 10019 || J5盖子皮带面 | 3D打印 | 1 | 盖子 |
| 10020 || J5盖子接线面 | 3D打印 | 1 | 盖子 |
| 10021 || J5小臂旋转 | 3D打印 | 1 | 小臂旋转 |
| 10024 || J4盖子 | 3D打印 | 1 | 小臂固定盖子 |
| 10025 || J4小臂固定 | 3D打印 | 1 | 小臂固定 |
| 10028 || J3大臂 | 3D打印 | 1 | 大臂 |
| 10031 || J1固定底座 | 3D打印 | 1 | 固定底座 |
| 10033 || J5 60齿同步轮 | 3D打印 | 1 | 同步带轮 |
| 10043 || J5轴承盖子 | 3D打印 | 1 | 轴承盖子 |
| 10044 || J6端侧安装面 | 3D打印 | 1 | 机械臂末端,用来安装各种工具、执行器 |
| 10045 || J6盖子 | 3D打印 | 1 | 腕部盖子 |
| 10046 || J5电机拉紧板 | 3D打印 | 1 | 用来拉紧同步带 |
| 10002 || 键槽法兰 | CNC加工 | 3 | 用于传递扭矩 |
| 10007 || 腰关节铝片正面 | CNC加工 | 1 | 用来固定电机 |
| 10008 || 腰关节铝片背面 | CNC加工 | 1 | 用来固定电机 |
| 10022 || 小臂铝片正面 | CNC加工 | 1 | 用来固定电机 |
| 10023 || 小臂铝片背面 | CNC加工 | 1 | 用来固定电机 |
| 10027 || 大臂铝板 | CNC加工 | 1 | 支撑大臂,连接电机、法兰 |
| 10001 || 电机驱动 | 采购 | 6 | 电机驱动,这里用的是张大头家CAN套餐 |
| 10004 || 小轴承 | 采购 | 4 | 轴承 |
| 10005 || 自攻螺钉M2×8 | 采购 | 20 | 用于紧固盖子 |
| 10006 || 自攻螺丝M6×16 | 采购 | 4 | 用于紧固固定底座,比如固定在木板上 |
| 10011 || 胶水 | 采购 | 1 | 用于将磁铁站在电机轴上 |
| 10012 || 联轴器 | 采购 | 1 | 联轴器 |
| 10014 | / | 电子线-绿蓝 | 采购 | 0.35m | CAN信号线 |
| 10015 | / | 电子线-红黑 | 采购 | 0.35m | 电源正负线 |
| 10018 || 带灯按钮开关 | 采购 | 1 | 开关 |
| 10026 || 倒边螺母M3x8 | 采购 | 12 | 连接腕部与轴承 |
| 10029 || 导向轴支座 | 采购 | 1 | 连接末端与电机输出轴 |
| 10030 || 固定环 | 采购 | 1 | 连接小臂旋转与电机输出轴 |
| 10032 || 回转支承 | 采购 | 1 | 固定底座与腰部连接部件 |
| 10034 || 同步带 | 采购 | 1 | 同步带 |
| 10035 || 光轴6x30 | 采购 | 1 | 配合联轴器,扩展轴长度 |
| 10036 || USB2CAN转换器 | 采购 | 1 | 插在电脑控制机械臂 |
| 10038 || 电机L60/20:1 | 采购 | 1 | 第2个关节电机、减速器 |
| 10039 | 类似10038 | 电机L48/25:1 | 采购 | 1 | 第1个关节电机、减速器 |
| 10040 || 电机L40 | 采购 | 2 | 第5、6个关节电机 |
| 10041 | 类似10038 | 电机L34/25:1 | 采购 | 1 | 第3个关节电机、减速器 |
| 10042 | 类似10038 | 电机L34/10:1 | 采购 | 1 | 第4个关节电机、减速器 |
| 10047 || J5 15齿同步轮 | 采购 | 1 | 同步带轮,连接电机与同步带 |
| 10048 || 紧定螺钉M6×10 | 采购 | 4 | 紧定键槽法兰与电机输出轴 |
| 10049 || 螺钉M8×25 | 采购 | 15 | 螺钉 |
| 10050 | / | 螺钉M6×16 | 采购 | 4 | 螺钉 |
| 10051 | / | 螺钉M5×50 | 采购 | 2 | 螺钉 |
| 10052 | / | 螺钉M5×25 | 采购 | 2 | 螺钉 |
| 10053 | / | 螺钉M5×16 | 采购 | 9 | 螺钉 |
| 10054 | / | 螺钉M4×10 | 采购 | 13 | 螺钉 |
| 10055 | / | 螺钉M3×8 | 采购 | 6 | 螺钉 |
| 10056 | / | 螺钉M3×60 | 采购 | 8 | 螺钉 |
| 10057 | / | 螺钉M3×5 | 采购 | 6 | 螺钉 |
| 10058 | / | 螺钉M3×40 | 采购 | 20 | 螺钉 |
| 10059 | / | 螺钉M3×35 | 采购 | 8 | 螺钉 |
| 10060 | / | 螺钉M3×20 | 采购 | 2 | 螺钉 |
| 10061 | / | 螺钉M3×16 | 采购 | 8 | 螺钉 |
| 10062 | / | 螺钉M3×10 | 采购 | 12 | 螺钉 |
| 10064 || 螺母M5 | 采购 | 14 | 螺母 |
| 10065 || 螺母M3 | 采购 | 19 | 螺母 |
| 10066 || DC 12V 插座 | 采购 | 1 | 12V适配器电源插座 |
| 10067 || 4P排插 | 采购 | 1 | 为夹爪控制盒预留信号线和电源线 |
| 10068 || 3x3x14键 | 采购 | 4 | 插入键槽法兰 |
| 10069 || 3x7x6 垫片 | 采购 | 6 | J1电机螺母与驱动之间 |
| 10070 | / | 3x7x2 垫片 | 采购 | 40 | 垫片 |
| 10071 || 2芯软线 | 采购 | 1.5m | 连接USB2CAN转接头与2P排插 |
| 10072 || 2P排插 | 采购 | 1 | 连接2芯软线 |
| 10073 || 12V电源 | 采购 | 1 | 12V电源适配器 |
| 10074 || 3MM扳手 | 采购 | 1 | 紧固 键槽法兰的紧定螺钉 |
| 10075 || 2.5MM扳手 | 采购 | 1 | 紧固小臂旋转 |
| 10076 | / | 1.5MM扳手 | 采购 | 1 | 紧固末端导向轴支座 |
| 10077 || 磁铁 | 采购 | 6 | 安装在电机末端,用于驱动器测量角度 |
| 10078 || 镊子 | 采购 | 1 | 用于夹取部分零件 |
| 10079 || 驱动-8P通讯线 | 驱动配套 | 6 | 驱动配套 |
| 10080 | 同上 | 驱动-4P电机线 | 驱动配套 | 6 | 驱动配套 |
| 10081 | 同上 | 驱动-注塑外壳 | 驱动配套 | 6 | 驱动配套 |
| 10082 | 同上 | 驱动-CAN模块 | 驱动配套 | 6 | 驱动配套 |
| 10083 || 热缩管 | 采购 | 0.6m | 接电子线用 |
| 10084 || 包线管 | 采购 | 0.6m | 包裹电子线 |
| 10085 || 4P连接线对插 | 采购 | 1 | 接电子线用 |
| 10086 || 长款电机配套4P线 | 采购 | 1 | 接电子线用 |
| 10087 || 快速接线端子 | 采购 | 4 | 接电子线用 |
| 10088 || 3*7*1金属垫片 | 采购 | 6 | 垫片 |
## 四、API简介
**链接机械臂**:`0.server.py`
示例代码:
```python
# 导入控制API
from episode_controller.episodeServer import MotorControlServer
......
# 配置服务器
parser = argparse.ArgumentParser(description="Motor Control Server")
# resume:是否在上次姿态恢复
parser.add_argument("--resume", type=bool, default=False, help="Resume previous session")
# usb_id:USB地址,最高支持6个机械臂同时驱动
parser.add_argument("--usb_id", type=int, default=1, help="USB handler ID, use pcaninfo to check")
# TCP协议IP地址
parser.add_argument("--ip", type=str, default="localhost", help="Server IP address")
# 端口
parser.add_argument("--port", type=int, default=12345, help="Server port")# 启动TCP协议API服务器
server = MotorControlServer(resume=args.resume, usb_id=args.usb_id)
server.start_server(host=args.ip, port=args.port)
```这样启动后,便可以使用支持TCP协议的编程语言去连接操作机械臂。
**API列表**:`episodeServer.py`
* home: 执行电机回零校准,将机械臂移动到初始位置
* gripper: 控制夹爪动作,根据参数决定抓取(闭合)或释放(打开)
* servo_gripper: 发送舵机抓取命令,设置夹爪角度
* robodk_simulation: 启动或关闭Robodk模拟功能
* set_free_mode: 设置电机自由模式,允许手动或自由控制电机
* get_motor_angles: 获取当前各电机的角度信息
* angle_mode: 通过角度模式直接控制各电机运动
* move_xyz_rotation: 使用逆运动学移动到指定XYZ位置
* move_linear_xyz_rotation: 沿直线路径移动到目标位置```python
def home(self):
"""
执行电机回零校准,将机械臂移动到初始位置。返回:
- 归位操作所需的时间(秒)。
"""
command = {'action': 'home', 'params': None}
result = self.send_command(command)
if result is not None:
print("正在归位,预计耗时 {} 秒".format(result))
time.sleep(result)
return resultdef gripper(self, on=0):
"""
控制夹爪的抓取和释放。参数:
- on: 大于0表示抓取(闭合),否则表示释放(打开)。返回:
- 机械臂响应的结果。
"""
action_str = "gripper_on" if on > 0 else "gripper_off"
command = {'action': action_str, 'params': None}
result = self.send_command(command)
time.sleep(0.05)
return resultdef servo_gripper(self, degree):
"""
控制舵机夹爪动作,设置指定角度。参数:
- degree: 舵机的目标角度(单位:度)。返回:
- 机械臂响应的结果。
"""
command = {'action': 'servo_gripper', 'params': degree}
result = self.send_command(command)
time.sleep(1) # 等待动作完成
return resultdef robodk_simulation(self, enable):
"""
启动或关闭Robodk模拟功能。参数:
- enable: 布尔值,True表示启用模拟,False表示禁用。返回:
- 机械臂响应的结果。
"""
params = 1 if enable else 0
command = {'action': 'robodk_simu', 'params': params}
result = self.send_command(command)
time.sleep(0.05)
return resultdef set_free_mode(self, mode):
"""
设置电机自由模式,允许手动或自由控制电机,用来示教模式。参数:
- mode: 自由模式参数,根据具体需求设定。返回:
- 机械臂响应的结果。
"""
command = {'action': 'set_free_mode', 'params': mode}
result = self.send_command(command)
return resultdef get_motor_angles(self):
"""
获取当前各电机编码器的角度值。返回:
- 电机角度列表,如果获取失败则返回None。
"""
command = {'action': 'get_motor_angles', 'params': None}
result = self.send_command(command)
return resultdef angle_mode(self, angles, speed_ratio=1.0):
"""
角度模式运动:根据指定角度直接控制各电机的运动。参数:
- angles: 电机角度列表,顺序与实际电机对应。
- speed_ratio: 运动速度比例,默认1.0。返回:
- 机械臂响应的结果。
"""
command = {'action': 'angle_mode', 'params': (angles, speed_ratio)}
result = self.send_command(command)
return resultdef move_xyz_rotation(self, x, y, z, rotation_angles=[90, 0, 180], order='zyx'):
"""
使用逆运动学控制机械臂运动到指定的XYZ位置,并设置目标姿态。参数:
- x, y, z: 目标位置坐标(单位:毫米或其他,根据实际设定)。
- rotation_angles: 目标姿态角度列表(默认为 [90, 0, 180])。
- order: 旋转顺序(如'zyx'),确保与控制端一致。返回:
- 如果有解,返回运动执行时间(秒),否则返回 -1 表示无解。
"""
params = [x, y, z] + rotation_angles + [order]
command = {'action': 'move_xyz_rotation', 'params': params}
result = self.send_command(command)
if result != -1 and result is not None:
print("运动中,预计耗时 {} 秒".format(result))
time.sleep(result)
else:
print("目标位置或姿态无解")
return resultdef move_linear_xyz_rotation(self, x, y, z, rotation_angles=[90, 0, 180], order='zyx'):
"""
直线模式运动:沿直线路径运动到指定位置,并同时调整末端姿态。参数:
- x, y, z: 目标位置坐标。
- rotation_angles: 目标姿态角度列表。
- order: 旋转顺序(默认为 'zyx')。返回:
- 如果运动规划成功,返回运动总时间(秒);否则返回 -1 表示无解。
"""
params = [x, y, z] + rotation_angles + [order]
command = {'action': 'move_linear_xyz_rotation', 'params': params}
result = self.send_command(command)
if result != -1 and result is not None:
print("直线运动规划成功,总共需要 {} 秒".format(result))
time.sleep(result)
else:
print("直线运动规划失败:目标无解")
return result
```## 五、应用代码
### 5.1 示教模式
> 操作其中一台机械臂,另外一台跟着运动。
代码:`3.teach_mode.py`
### 5.2 3D抓取
> 眼在手外深度相机辅助3D平面抓取(末端欧拉角固定)
代码:`2.air_sucker.py`
### 5.3 6D抓取
> 眼在手上深度相机辅助3D平面抓取(末端欧拉角不固定)
代码:`1.demo_episode_with_gripper.py`
### 5.3 结合VLM、LLM
> 结合大语言模型、多模态模型
代码:
* `2.demo_VLM_grasp.py`
* `3.demo_VLM_handler.py`