# 设备交互与标定体系(对照 TeamAAS-2.0 生产版) > 依据:对 `D:\Team\Program\TeamAAS-2.0`(在产程序)与 `D:\Program\TeamAAS`(本程序)的逐文件源码核对。 > 结论先行:**机器人/相机/Feeder/吸气 的协议与流程已同源移植,标定向导结构与 2.0 对齐**; > 遗留问题 = VppCalibrationPage 游离计算器 + 2.0 已有的 Feeder 背光联动/畸变校正未移植。 --- ## 一、机器人 TCP 协议(逐条核对 ✅ 全部实现) 文件:`TeamAAS.Core\TeamAAS.Robot\Core\Robots\EpsonRobot.cs`(同步 + Async 双版本) 连接层:`RobotTcpClient.cs`——客户端/服务端双角色、结束符(CR/LF/CRLF)分帧、断线重连; 配置存 `Config\Robots.json`(IP/Port/ConnectType/Terminator/Encoding)。 应答确认模式:发送后等待回显(`rev.Contains("命令字")` 即成功,5s 超时)。 | 上位机发送 | 机器人回显 | 实现状态 | 备注 | |---|---|---|---| | `Motor,1` | `Motor` | ✅ | 使能 | | `Power,1` | `Power` | ✅ | 伺服上电 | | `Reset` | `Reset` | ✅ | 复位报警 | | `Speed,100` | `Speed` | ✅ | PTP 速度 | | `Accel,100,100` | `Accels` | ✅ | PTP 加速度(双参数) | | `Speeds,100` | `Speeds` | ✅ | 直线速度 | | `Accels,100,100` | `Accels` | ✅ | 直线加速度 | | `Speedfactor,100` | `Speedfactor` | ✅ | 全局速度倍率 | | `Go,X,Y,Z,U,V,W,0,0,0` | `Go` | ✅ | PTP 点位(Hand,Local,Tool 九段) | | `Jump,X,...,LimZ` | `Jump` | ✅ | 门型拾放(末尾多 LimZ) | | `Move,X,...` | `Move` | ✅ | 直线插补 | | `SFree` / `SLock` | 同名 | ✅ | 刹车释放/锁定 | | `Jog,axis,d` | `Jog` | ✅ | 点动 | | `Joint,joint,d` | — | ✅(表外补充) | 关节点动 | | `SetTool,i,x,y` | `SetTool` | ✅ | 设置工具坐标 | | `SelectTool,i` | — | ✅(表外补充) | 切换工具号 | | `CalibParame,0,0,0,0,0,0,0,0` | `CalibParame` | ✅ | 8 参数:{夹爪类型(Suction/Clamp)},{吸气IO},{吹气IO},{Speed},{Accel},{Power},{吸真空延时},{破真空延时} | | `CalibMotion,X,Y,Z,U,V,W,0,0,0` | `CalibMotion` | ✅ | 标定点位动作(末尾多 LimZ) | | `CalibOutIO,1` | `CalibOutIO` | ✅ | 控制夹爪/吸嘴(吸气=1,放开=0) | | `GetRobotPos` | `GetRobotPos,X,Y,Z,U,V,W,Hand,Local,Tool` | ✅ | 回包解析为 RPoint 坐标对象 | > 吸气/真空设计:**由机器人侧程序执行 IO**,上位机只下发 IO 位号与延时(CalibParame)+ 开关指令(CalibOutIO)。 > 流程画布层暂无"机器人指令"节点(指令调用集中在标定向导)——需要时按通讯节点模式补一个。 --- ## 二、相机安装方式(CameraMount)与交互差异 文件依据:2.0 `Enums\CameraMount.cs`、`Services\CameraCalibrationService.cs`(九点循环 L1116-1240)、 `Services\CalibrationService.cs\ConvertPixelToPosition`(L224-312)。我们的 `CameraCalibrationService` / `CalibrationStore` 已移植同款分支。 | 安装方式 | 物理含义 | 标定取点动作 | 运行时像素→机器人换算 | 工具坐标步骤 | |---|---|---|---|---| | **FixedDown 固定向下** | 相机架工位上方不动,机械手吸标定块在下方走位 | **防遮挡舞蹈**(每点):走到点 i → 关吸气放下块 → 退回待机点让出视野 → 拍照 → 走回点 i → 开吸气吸回;九点后回待机 | 仿射矩阵直出机器人坐标 → ComputeTool 转工具坐标;角度符号取反 | 需要(FixedDownCameraTool 分支) | | **FixedUp 固定向上** | 相机朝上(供料背光板下),机械手举块到相机上方 | 走到点 i(带 Z)→ 直接拍照 | 仿射直出 → 转工具坐标 | 需要(FixedUpCameraTool 分支) | | **MobileJ2** | 相机装 J2 臂随臂下移 | 走到点 i → 拍照 | 仿射直出 → 转工具坐标,角度取反 | 需要 | | **MobileJ4** | 相机装末端腕(眼在手,随 U 轴转) | **先走中心点记 Mark 点(工具坐标系)**;九点矩阵 = Mark点 − (点i − 点1 位移)(把 Mark 拉回相机中心) | 仿射偏移 + **按机器人当前 U 轴构造旋转矩阵修正** + 当前位姿叠加 | 需要(J4MovingDownCameraTool 分支) | | **MobileDown_XYPlatform** | 相机装 XY 龙门模组下移 | 同 J4 偏移换算(Mark=中心点) | 同 J4 但**旋转角恒 0**(模组不旋转) | **跳过** | | **None 独立相机** | 手动示意的独立相机 | 手动 | 手动 | 不适用 | **共同前置(旋转预备标定)**:机械手走 P0、P0+X、P0+Y 三点各拍一张 → Gram-Schmidt 求图像系↔机器人系 旋转矩阵 + mm/像素比例;九点机器人坐标先经该矩阵逆变换对齐坐标轴,再进仿射求解 (2.0 用 OpenCvSharp `EstimateAffine2D`;我们用正规方程+高斯消元,数学等价)。 运行时通用入口:`CalibrationStore.ConvertPixelToPosition(pixel, robotCur, calib, brand)`;Schneider 品牌 U 轴取反。 --- ## 三、相机 / Feeder / 通讯交互流程对照 | 主题 | TeamAAS-2.0(生产) | 本程序 | 兼容结论 | |---|---|---|---| | **相机** | 7 品牌(海康 MVS 为主/Basler/大恒/大华/OPT/Cognex/UVC),软触发+连续采集(无硬触发),全链路 ICogImage,`CameraConfiguration.cfg` | 同款海康/大华已移植(MvCamCtrl.Net 原生),Basler/大恒/OPT/UVC 在列;图像用**自研 GenImage** 统一载体(含 Metadata),`Config\Cameras.json` | 同源;GenImage 经 GenImageConverter 转各平台,载体设计更通用 | | **Feeder** | 独立类库 `Team.FFFeederService`:TEAM(TCP `{K1}` 背光/`{UV1}` 振动/`{HC}` 停止/方向 `{CA~CI}ms`)+ Afag aflex;**自带环形背光,标定拍照前开灯** | TeamFeeder 同款 TCP ASCII 命令 + `FeederPlugin` 流程节点(配方 `Config\Feeder_recipes.json`) | 同源;**缺标定向导的开背光联动** | | **吸气/真空** | 机器人侧执行:CalibParame 下发 IO 位+延时,CalibOutIO 开关 | 同(PickInfo:Inhal/Blow + WaitSuction/WaitBlow) | ✅ 一致 | | **通讯** | 每类设备独立 `.cfg`(JSON)+ 设置页对话框(AddRobot/AddCamera…)+ Service 工厂(Dictionary)+ SendThenResponse/事件;另硬编码 BgCommunicate/BgModbusTcp 后台通道;PLC 三菱/OPC UA | `[Communication]` 特性扫描(TcpClient/TcpServer/Serial/Udp/Web + HslCommunication PLC),统一 `Config\Communications.json`,`CommunicationManager.GetByName`,流程节点**批量读取/批量写入**(公式绑定),FlowRunner 订阅 `DataReceivedEvent` 心跳触发产品 | **我们的模式更可扩展**(加协议=加一个类);2.0 的 Settings 添加对话框值得移植 | --- ## 四、标定体系评估(双轨问题) **正式路径(唯一消费方)**:标定向导(7 步:基础设置→视觉与相机→示教点位→工具坐标TCP→九点标定→验证→完成,XY 模组跳第 3 步) → `CameraCalibrationService` → `CalibrationStore`(`Calibration\<名称>.json`,运行时 `ConvertPixelToPosition` 消费)。✅ 与 2.0 对齐。 **游离路径(问题所在)**:`Plugins.Vpp\Views\VppCalibrationPage`——引擎嵌入向导第 1 步右侧的 "标定图像操作区",实为手动计算器(载本机图片、手填九点表、自算仿射),**结果只进文本框、不落盘、不进 CalibrationStore**。 → 这就是用户困惑的"视觉与相机右边为什么有九点标定"。 **改造决定**:VppCalibrationPage 重构为向导的**实时取图面板**(相机画面 + Mark 点叠加), 删除独立九点表/计算逻辑——标定计算只走 CalibrationStore 单一路径。 **对标 2.0 尚缺**:① 标定拍照前 Feeder 开背光联动;② 棋盘格畸变校正(CogCalibCheckerboardTool); ③ 相机曝光/增益在标定流程内的下发页(部分已有)。 --- ## 五、待办(按优先级) 1. VppCalibrationPage → 实时取图面板改造(删双轨); 2. 标定向导补 Feeder 背光联动 + 畸变校正; 3. 移植 2.0 的设置页添加对话框(AddRobot/AddCamera/AddFeeder 样式)补齐设备管理 UI; 4. 流程画布补"机器人指令"节点(指令下拉 + 参数公式绑定,按通讯节点模式); 5. 实施类任务批量派发高级工程师 agent,本侧做架构与验收。