feat: 实现 ControllerClient HTTP 兼容层及 FANUC 运行时

- 新增 Flyshot.ControllerClientCompat 兼容层模块
  - 新增 Flyshot.Runtime.Fanuc 运行时模块
  - 新增 LegacyHttpApiController 暴露 HTTP 兼容 API
  - 补充 RuntimeOrchestrationTests 等测试覆盖
  - 补充 docs/ 兼容性需求与逆向工程文档
  - 更新 Host 注册、配置及解决方案引用

  变更概览:
  - Flyshot.ControllerClientCompat — 旧 ControllerClient 语义的 HTTP 适配
  - Flyshot.Runtime.Fanuc — IControllerRuntime 的 FANUC 真机实现
  - LegacyHttpApiController — HTTP API 兼容旧 SDK
  - docs/ — 兼容性需求与逆向工程分析文档
  - 测试:RuntimeOrchestrationTests、LegacyHttpApiCompatibilityTests
This commit is contained in:
2026-04-24 16:55:25 +08:00
parent 4eeaa3fef3
commit 8a20d9f507
35 changed files with 3869 additions and 10 deletions

View File

@@ -0,0 +1,165 @@
namespace Flyshot.ControllerClientCompat;
/// <summary>
/// 定义 HTTP-only 兼容层对外暴露的 ControllerClient 语义服务接口。
/// </summary>
public interface IControllerClientCompatService
{
/// <summary>
/// 获取当前兼容层对外报告的服务端版本号。
/// </summary>
string ServerVersion { get; }
/// <summary>
/// 获取当前是否已经完成机器人初始化。
/// </summary>
bool IsSetUp { get; }
/// <summary>
/// 保存当前调用方期望连接的 replacement 服务端地址。
/// </summary>
/// <param name="serverIp">客户端传入的服务端 IP。</param>
/// <param name="port">客户端传入的服务端端口。</param>
void ConnectServer(string serverIp, int port);
/// <summary>
/// 根据旧客户端使用的机器人名称完成机器人初始化。
/// </summary>
/// <param name="robotName">机器人名称。</param>
void SetUpRobot(string robotName);
/// <summary>
/// 记录当前激活的控制器类型。
/// </summary>
/// <param name="sim">是否为仿真控制器。</param>
void SetActiveController(bool sim);
/// <summary>
/// 记录当前控制器已经建立连接。
/// </summary>
/// <param name="robotIp">控制器 IP。</param>
void Connect(string robotIp);
/// <summary>
/// 记录当前控制器已经断开。
/// </summary>
void Disconnect();
/// <summary>
/// 记录当前机器人进入使能态。
/// </summary>
/// <param name="bufferSize">缓冲区大小。</param>
void EnableRobot(int bufferSize);
/// <summary>
/// 记录当前机器人退出使能态。
/// </summary>
void DisableRobot();
/// <summary>
/// 停止当前运动状态。
/// </summary>
void StopMove();
/// <summary>
/// 获取当前速度倍率。
/// </summary>
/// <returns>当前速度倍率。</returns>
double GetSpeedRatio();
/// <summary>
/// 更新当前速度倍率。
/// </summary>
/// <param name="ratio">目标速度倍率。</param>
void SetSpeedRatio(double ratio);
/// <summary>
/// 写入兼容层缓存的 IO 数值。
/// </summary>
/// <param name="port">IO 端口号。</param>
/// <param name="value">IO 值。</param>
/// <param name="ioType">IO 类型。</param>
void SetIo(int port, bool value, string ioType);
/// <summary>
/// 读取兼容层缓存的 IO 数值。
/// </summary>
/// <param name="port">IO 端口号。</param>
/// <param name="ioType">IO 类型。</param>
/// <returns>缓存中的 IO 值。</returns>
bool GetIo(int port, string ioType);
/// <summary>
/// 设置当前 TCP 三维坐标。
/// </summary>
/// <param name="x">TCP X。</param>
/// <param name="y">TCP Y。</param>
/// <param name="z">TCP Z。</param>
void SetTcp(double x, double y, double z);
/// <summary>
/// 读取当前 TCP 三维坐标。
/// </summary>
/// <returns>TCP 数组。</returns>
IReadOnlyList<double> GetTcp();
/// <summary>
/// 读取当前关节位置。
/// </summary>
/// <returns>关节位置数组。</returns>
IReadOnlyList<double> GetJointPositions();
/// <summary>
/// 更新当前关节位置。
/// </summary>
/// <param name="jointPositions">目标关节位置。</param>
void MoveJoint(IReadOnlyList<double> jointPositions);
/// <summary>
/// 执行普通轨迹。
/// </summary>
/// <param name="waypoints">轨迹路点集合。</param>
void ExecuteTrajectory(IReadOnlyList<IReadOnlyList<double>> waypoints);
/// <summary>
/// 读取当前末端位姿快照。
/// </summary>
/// <returns>位姿数组。</returns>
IReadOnlyList<double> GetPose();
/// <summary>
/// 上传一条飞拍轨迹。
/// </summary>
/// <param name="trajectory">飞拍轨迹。</param>
void UploadTrajectory(ControllerClientCompatUploadedTrajectory trajectory);
/// <summary>
/// 列出当前已上传的飞拍轨迹名称。
/// </summary>
/// <returns>轨迹名称列表。</returns>
IReadOnlyList<string> ListTrajectoryNames();
/// <summary>
/// 执行指定名称的飞拍轨迹。
/// </summary>
/// <param name="name">轨迹名称。</param>
void ExecuteTrajectoryByName(string name);
/// <summary>
/// 删除指定名称的飞拍轨迹。
/// </summary>
/// <param name="name">轨迹名称。</param>
void DeleteTrajectory(string name);
/// <summary>
/// 读取当前配置过的机器人名称。
/// </summary>
/// <returns>机器人名称。</returns>
string GetRobotName();
/// <summary>
/// 读取当前机器人自由度。
/// </summary>
/// <returns>机器人自由度。</returns>
int GetDegreesOfFreedom();
}