完整的系统介绍请观看:
如果觉得项目对你有帮助,欢迎点赞👍、收藏⭐、投币🪙支持!
Horizon 具身智能系统是一个功能完备的6轴机械臂控制平台,融合了现代AI技术与精密机械控制。系统通过自然语言指令、视觉识别、语音交互等多种方式,实现机械臂的智能化控制和操作。
如果这个项目对你有帮助,请给我一个⭐Star支持一下!
- 🤖 具身智能: 基于LLM、VLM的自然语言理解和决策
- 👁️ 视觉系统: 双目立体视觉、目标检测、深度估计
- 🎮 数字孪生: MuJoCo高精度物理仿真
- 🔧 精密控制: 基于CAN总线的高精度电机控制
- 🎤 语音交互: 语音识别(ASR)和语音合成(TTS)
- 📱 现代界面: PyQt5响应式用户界面
Horizon_Arm_New/
├── 🧠 AI_SDK/ # AI服务统一调用框架
│ ├── core/ # 核心处理器
│ │ ├── llm/ # 大语言模型处理
│ │ ├── asr/ # 语音识别处理
│ │ ├── tts/ # 语音合成处理
│ │ ├── multimodal/ # 多模态处理
│ │ ├── smart_chat/ # 智能对话
│ │ └── session/ # 会话管理
│ ├── providers/ # 多厂商适配层
│ │ ├── alibaba/ # 阿里云通义千问
│ │ └── deepseek/ # DeepSeek
│ └── services/ # 服务封装层
│
├── ⚙️ Control_SDK/ # 电机控制核心SDK
│ └── Control_Core/ # 控制核心模块
│ ├── modules/ # 功能模块
│ │ ├── control_actions.py # 控制动作
│ │ ├── read_parameters.py # 参数读取
│ │ ├── modify_parameters.py # 参数修改
│ │ ├── homing_commands.py # 回零控制
│ │ └── trigger_actions.py # 触发动作
│ ├── motor_controller_modular.py # 模块化控制器
│ ├── can_interface.py # CAN通信接口
│ └── commands.py # 命令构建器
│
├── 🎯 core/ # 核心算法模块
│ ├── arm_core/ # 机械臂核心算法
│ │ ├── kinematics.py # 运动学计算
│ │ ├── vision_detection.py # 视觉检测
│ │ ├── Depth_Estimation.py # 深度估计
│ │ ├── Hand_Eye_Calibration.py # 手眼标定
│ │ ├── trajectory_executor.py # 轨迹执行
│ │ └── rrt_planner.py # 路径规划
│ └── embodied_core/ # 具身智能核心
│ ├── hierarchical_decision_system.py # 分层决策系统
│ └── mujoco_kinematics_control_core.py # MuJoCo控制
│
├── 🖥️ Main_UI/ # 图形用户界面
│ ├── ui/ # 界面组件
│ ├── widgets/ # 功能控件
│ │ ├── digital_twin_widget.py # 数字孪生
│ │ ├── teach_pendant_widget.py # 示教器
│ │ ├── vision_grasp_widget.py # 视觉抓取
│ │ ├── embodied_intelligence_widget.py # 具身智能
│ │ └── connection_widget.py # 连接管理
│ └── utils/ # 工具模块
│
└── 📁 config/ # 配置文件
├── aisdk_config.yaml # AI SDK配置
├── motor_config.json # 电机配置
├── embodied_config/ # 具身智能配置
└── urdf/ # 机器人模型文件
AI_SDK提供了多厂商AI服务的统一调用接口,支持:
from AI_SDK import AISDK
sdk = AISDK()
# 基础对话
response = sdk.chat("alibaba", "qwen-turbo", "你好")
# 流式输出
for chunk in sdk.chat("alibaba", "qwen-turbo", "讲个故事", stream=True):
print(chunk, end="")
# 上下文对话
sdk.chat("alibaba", "qwen-turbo", "我叫张三", use_context=True)
name = sdk.chat("alibaba", "qwen-turbo", "我叫什么?", use_context=True)# 文件识别
result = sdk.asr("alibaba", "file", audio_file="audio.wav")
# 麦克风识别
result = sdk.asr("alibaba", "microphone", duration=5)
# 实时流识别
for result in sdk.asr("alibaba", "stream", audio_stream=stream):
print(result)
# 关键词唤醒
for result in sdk.asr("alibaba", "keyword", keywords=["你好", "小助手"]):
if result.get("success"):
print("检测到唤醒词:", result.get("keyword_detected"))# 文本转语音文件
sdk.tts("alibaba", "file", "你好世界", output_file="output.mp3")
# 直接播放
sdk.tts("alibaba", "speaker", "欢迎使用AI系统")
# 流式合成
def text_generator():
yield "今天天气"
yield "很不错"
for chunk in sdk.tts("alibaba", "stream", text_generator()):
print("合成完成一段")# 图像理解
result = sdk.multimodal("alibaba", "image", "描述这张图片", image_path="image.jpg")
# 视频分析
result = sdk.multimodal("alibaba", "video", "分析视频内容", video_path="video.mp4")
# 多图像分析
result = sdk.multimodal("alibaba", "multiple_images", "比较这些图片",
image_paths=["img1.jpg", "img2.jpg"])# 智能问答并语音播放
result = sdk.smart_chat(
prompt="请介绍一下你自己",
llm_provider="alibaba",
llm_model="qwen-turbo",
tts_provider="alibaba",
tts_mode="speaker"
)支持的AI服务商:
- 🔵 阿里云: 通义千问系列模型
- 🟢 DeepSeek: DeepSeek系列模型
- 🔴 OpenAI: GPT系列模型(可扩展)
Control_SDK提供了完整的ZDT闭环驱动板控制功能:
from Control_SDK.Control_Core import ZDTMotorController
# 创建电机控制器
motor = ZDTMotorController(motor_id=1, port='COM18')
with motor:
# 使能电机
motor.control_actions.enable()
# 位置控制
motor.control_actions.move_to_position(90.0, speed=200)
# 速度控制
motor.control_actions.set_speed(100)
# 力矩控制
motor.control_actions.set_torque(500) # 500mA# 创建多个电机控制器
broadcast = ZDTMotorController(motor_id=0, port='COM18') # 广播控制器
motor1 = ZDTMotorController(motor_id=1, port='COM18')
motor2 = ZDTMotorController(motor_id=2, port='COM18')
# 共享CAN接口
broadcast.connect()
motor1.can_interface = broadcast.can_interface
motor2.can_interface = broadcast.can_interface
# 使能所有电机
motor1.control_actions.enable()
motor2.control_actions.enable()
# 配置同步运动(带同步标志)
motor1.control_actions.move_to_position(-3600, speed=1000, multi_sync=True)
motor2.control_actions.move_to_position_trapezoid(7200, max_speed=1000,
acceleration=2000, multi_sync=True)
# 触发同步运动
broadcast.control_actions.sync_motion()# 获取电机状态
status = motor.read_parameters.get_motor_status()
position = motor.read_parameters.get_position()
speed = motor.read_parameters.get_speed()
temperature = motor.read_parameters.get_temperature()
current = motor.read_parameters.get_current()
print(f"位置: {position:.2f}°, 速度: {speed:.2f}RPM, 温度: {temperature:.1f}°C")# 开始回零
motor.control_actions.start_homing()
# 等待回零完成
if motor.homing_commands.wait_for_homing_complete(timeout=30):
print("回零成功")
else:
print("回零超时")
# 设置当前位置为零点
motor.homing_commands.set_zero_position(save_to_chip=True)控制特性:
- 🎯 精确控制: 位置精度±0.1°,速度精度±1RPM
- 🔄 多种模式: 位置模式、速度模式、力矩模式
- 🚀 高速通信: CAN总线500K波特率
- 🛡️ 安全保护: 堵转保护、过温保护、限位保护
from core.arm_core.kinematics import RobotKinematics
# 初始化运动学
kinematics = RobotKinematics()
# 正向运动学:关节角度 → 末端位姿
joint_angles = [0, 30, -45, 0, 15, 0] # 度
end_pose = kinematics.forward_kinematics(joint_angles)
# 逆向运动学:末端位姿 → 关节角度
target_pose = [300, 200, 400, 0, 0, 0] # [x,y,z,rx,ry,rz]
joint_solution = kinematics.inverse_kinematics(target_pose)
# 轨迹规划
from core.arm_core.trajectory_executor import TrajectoryExecutor
executor = TrajectoryExecutor()
# 关节空间轨迹
trajectory = executor.plan_joint_trajectory(start_joints, end_joints, duration=3.0)
# 笛卡尔空间轨迹
trajectory = executor.plan_cartesian_trajectory(start_pose, end_pose, duration=5.0)from core.arm_core.vision_detection import VisionDetector
from core.arm_core.Depth_Estimation import StereoDepthEstimator
# 初始化视觉检测器
detector = VisionDetector(camera_matrix, dist_coeffs, model='fisheye')
# 颜色检测
hsv_lower = (35, 50, 50) # HSV下限
hsv_upper = (85, 255, 255) # HSV上限
result = detector.detect_color(image, hsv_lower, hsv_upper, min_area=500)
# 双目深度估计
depth_estimator = StereoDepthEstimator()
depth_map = depth_estimator.compute_depth(left_image, right_image)
# 获取指定点的深度
x, y = 320, 240 # 像素坐标
depth = depth_estimator.get_depth_at_point(depth_map, x, y)from core.arm_core.Hand_Eye_Calibration import HandEyeCalibrator
# 初始化标定器
calibrator = HandEyeCalibrator()
# 添加标定数据点
for i in range(num_poses):
# 机械臂移动到标定位姿
robot_pose = get_robot_pose(i)
# 拍摄标定板图像
image = capture_image()
# 检测标定板
success, camera_pose = calibrator.detect_calibration_board(image)
if success:
calibrator.add_calibration_data(robot_pose, camera_pose)
# 执行标定计算
success, transform_matrix = calibrator.calibrate()
if success:
print("手眼标定成功")
print(f"变换矩阵:\n{transform_matrix}")具身智能系统实现了三层决策架构,支持自然语言控制:
┌─────────────────────────────────────────────────────────────┐
│ 高层决策器 (High-Level Planner) │
│ - 与LLM交互进行函数选择 │
│ - 将自然语言指令转换为函数调用JSON │
│ - 智能选择合适函数和参数 │
└─────────────────────┬───────────────────────────────────────┘
│ Function Call JSON
▼
┌─────────────────────────────────────────────────────────────┐
│ 中层任务解析器 (Middle-Level Parser) │
│ - 解析高层返回的函数调用JSON │
│ - 直接调用指定函数并传递参数 │
│ - 处理函数执行结果和错误 │
└─────────────────────┬───────────────────────────────────────┘
│ Function Execution
▼
┌─────────────────────────────────────────────────────────────┐
│ 底层执行器 (Low-Level Executor) │
│ - 具体的机械臂控制函数 │
│ - MuJoCo仿真控制函数 │
│ - 视觉处理和抓取函数 │
└─────────────────────────────────────────────────────────────┘
from core.embodied_core.hierarchical_decision_system import HierarchicalDecisionSystem
# 初始化决策系统
decision_system = HierarchicalDecisionSystem(
provider="alibaba",
model="qwen-turbo",
control_mode="both" # 同时控制真实机械臂和仿真
)
# 自然语言指令控制
instructions = [
"机械臂回到初始位置",
"将第一个关节转动30度",
"移动到坐标(300, 200, 400)",
"抓取红色的物体",
"执行一个挥手动作"
]
for instruction in instructions:
result = decision_system.execute_instruction(instruction)
print(f"指令: {instruction}")
print(f"执行结果: {result['execution_result']['success']}")# MuJoCo仿真控制
from core.embodied_core import embodied_mujoco_func
# 启动MuJoCo仿真
embodied_mujoco_func.start_mujoco_simulation()
# 控制仿真机械臂
embodied_mujoco_func.move_to_joint_angles([0, 30, -45, 0, 15, 0])
embodied_mujoco_func.move_to_position([300, 200, 400, 0, 0, 0])
# 预设动作
embodied_mujoco_func.wave_hand()
embodied_mujoco_func.home_position()基于PyQt5的现代化界面,提供直观的操作体验:
- 数字孪生: 实时3D仿真显示
- 关节控制: 独立控制每个关节
- 坐标控制: 笛卡尔坐标系控制
- 状态监控: 实时显示电机状态
- 关节模式: 直接控制关节角度
- 基座模式: 基于基座坐标系
- 工具模式: 基于末端工具坐标系
- 程序录制: 录制和回放运动序列
- 相机显示: 实时相机图像显示
- 深度图: 双目深度信息可视化
- 目标检测: AI目标识别和标注
- 坐标转换: 像素坐标到机械臂坐标
- 语音交互: 语音指令输入和反馈
- 文本对话: 自然语言文本交互
- 任务队列: 批量任务管理和执行
- 执行日志: 详细的执行过程记录
- 机械臂: 6轴机械臂 + ZDT闭环驱动板
- 通信设备: CANable、CANtact或其他SLCAN兼容设备
- 相机: USB摄像头或工业相机(可选)
- 计算机: Windows 10/11, 8GB+ RAM, 支持OpenGL
- Python: 3.8+
- GUI框架: PyQt5
- 仿真环境: MuJoCo >= 2.3.0
- 计算机视觉: OpenCV >= 4.10.0
- 数值计算: NumPy, SciPy, Matplotlib
- AI服务: 网络连接(使用LLM功能时)
# 克隆项目
git clone https://github.com/your-repo/Horizon_Arm_New.git
cd Horizon_Arm_New
# 安装依赖
pip install -r requirements.txt
# Windows系统安装pyaudio
pip install pipwin
pipwin install pyaudio# 复制配置文件模板
cp config/aisdk_config.yaml.template config/aisdk_config.yaml
# 编辑配置文件,设置API密钥
# 建议使用环境变量设置密钥
export ALI_API_KEY="your_alibaba_api_key"
export DEEPSEEK_API_KEY="your_deepseek_api_key"- 连接ZDT驱动板到CAN总线
- 连接CANable设备到计算机USB端口
- 设置驱动板参数:
- P_Serial: CAN1_MAP
- CAN速率: 500K
- 电机ID: 1-6(每个电机唯一)
# 启动图形界面
python run_gui.py
# 或直接运行主程序
python Main_UI/main.py- 打开"连接管理"界面
- 选择正确的串口(如COM18)
- 点击"连接"按钮
- 等待电机连接成功
- 切换到"机械臂"标签页
- 使用关节控制滑块调整各关节角度
- 或使用坐标输入框设置目标位置
- 观察MuJoCo仿真中的实时反馈
- 切换到"具身智能"标签页
- 配置LLM提供商和模型
- 在指令输入框中输入自然语言指令
- 点击"执行指令"或使用语音输入
providers:
alibaba:
api_key: ${ALI_API_KEY} # 使用环境变量
default_params:
max_tokens: 2000
temperature: 0.7
top_p: 0.8
enabled: true
deepseek:
api_key: ${DEEPSEEK_API_KEY}
default_params:
max_tokens: 2000
temperature: 0.7
top_p: 1.0
enabled: true
logging:
level: INFO
file: AI_SDK.log
max_size: 10485760 # 10MB
backup_count: 5
session:
default_max_history: 20
max_sessions: 100{
"motors": {
"1": {
"name": "基座关节",
"reducer_ratio": 50.0,
"direction": 1,
"min_angle": -180,
"max_angle": 180
},
"2": {
"name": "肩部关节",
"reducer_ratio": 50.0,
"direction": -1,
"min_angle": -90,
"max_angle": 90
}
// ... 其他电机配置
},
"communication": {
"port": "COM18",
"baudrate": 500000,
"timeout": 1.0
}
}# 添加新的AI服务商
# 1. 在AI_SDK/providers/目录下创建新的提供商模块
# 2. 实现LLMProvider基类
# 3. 在配置文件中添加提供商配置
class NewAIProvider(LLMProvider):
def __init__(self, config):
super().__init__(config)
def chat(self, model, messages, **kwargs):
# 实现聊天接口
pass
def stream_chat(self, model, messages, **kwargs):
# 实现流式聊天接口
pass# 扩展电机控制功能
# 在Control_SDK/Control_Core/modules/目录下添加新模块
class CustomControlModule:
def __init__(self, controller):
self.controller = controller
def custom_motion(self, params):
# 实现自定义运动控制
command = self.controller.command_builder.build_custom_command(params)
return self.controller._send_command(command)# 扩展视觉检测功能
# 在core/arm_core/目录下添加新的视觉算法
class CustomVisionAlgorithm:
def __init__(self):
pass
def detect_custom_object(self, image):
# 实现自定义目标检测
return detection_result问题: 无法连接到电机控制器 解决方案:
- 检查串口号是否正确(设备管理器)
- 确认没有其他程序占用串口
- 检查CAN总线连接和供电
- 验证驱动板参数设置
问题: LLM调用失败或超时 解决方案:
- 检查网络连接
- 验证API密钥是否正确
- 确认API配额是否充足
- 检查防火墙设置
问题: 摄像头无法打开或图像异常 解决方案:
- 检查摄像头连接和驱动
- 验证摄像头权限设置
- 检查OpenCV版本兼容性
- 确认相机标定参数
问题: 仿真无法启动或显示异常 解决方案:
- 检查MuJoCo许可证
- 验证OpenGL支持
- 检查URDF模型文件
- 确认显卡驱动更新
# 启用详细日志
from Control_SDK.Control_Core import setup_logging
import logging
setup_logging(logging.DEBUG)
# 启用AI_SDK调试
os.environ['AISDK_DEBUG'] = '1'详细的API文档请参考:
本项目采用 MIT License 开源协议,你可以自由地:
- ✅ 使用本项目进行学习和研究
- ✅ 修改源代码并分发
- ✅ 用于个人或商业项目
- ✅ 私有化部署
如果你将本项目用于商业用途,请遵守以下要求:
-
注明出处:在你的产品、文档或宣传材料中明确标注:
本项目基于 Horizon 具身智能机械臂控制系统 原项目地址:https://github.com/xaio6/Embodied_AI_Arm_open 原作者B站:https://space.bilibili.com/xxxxx -
保留版权信息:不要移除源代码中的版权声明和许可证文件
-
禁止冒充原创:不得声称本项目的全部或部分代码为你的原创作品
-
鼓励反馈:如果基于本项目开发了有趣的应用,欢迎联系原作者分享
违反以上声明的商用行为,将保留追究法律责任的权利。
- 本软件按"原样"提供,不提供任何明示或暗示的保证
- 使用本软件产生的任何直接或间接损失,作者不承担责任
- 请确保在安全的环境下操作机械臂,注意人身和设备安全
欢迎所有形式的贡献!无论是报告bug、提出新功能建议,还是提交代码改进。
- Fork 本仓库
- 创建你的特性分支 (
git checkout -b feature/AmazingFeature) - 提交你的改动 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启一个 Pull Request
- 🐛 Bug修复和问题报告
- ✨ 新功能开发
- 📝 文档改进和翻译
- 🎨 UI/UX优化
- ⚡ 性能优化
- 🧪 测试用例补充
- 遵循PEP 8 Python代码风格
- 添加必要的注释和文档字符串
- 提交前运行测试确保代码可用
- Pull Request中清晰描述改动内容
