Files

82 lines
3.3 KiB
C#
Raw Permalink Normal View History

2026-07-21 11:11:01 +08:00
using System;
using System.Net.Http;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace MultiWheelC;
/// <summary>
/// Playground 仿真器 HTTP Web API 轻量客户端:查询小车位姿、瞬移小车。
/// 服务端实现见 Playground/Web/PlaygroundWebApi.cs,默认监听 http://localhost:18090。
/// 坐标单位 mm,朝向 yawDeg 单位为度,世界坐标系与场景 JSON 一致。
/// </summary>
public static class PlaygroundWebApi
{
// 禁用系统代理:本机 Playground 走 localhost,若经系统代理(如 127.0.0.1:7890)会连接失败。
private static readonly HttpClient Http = new HttpClient(new HttpClientHandler { UseProxy = false })
{
Timeout = TimeSpan.FromSeconds(3)
};
public struct Pose
{
public float X;
public float Y;
public float YawDeg;
}
/// <summary>查询单台小车的世界位姿。GET /api/robots/{name}。</summary>
public static Pose GetPose(string baseUrl, string robotName)
{
var url = $"{baseUrl.TrimEnd('/')}/api/robots/{Uri.EscapeDataString(robotName)}";
var json = Http.GetStringAsync(url).GetAwaiter().GetResult();
var o = JObject.Parse(json);
return new Pose
{
X = o.Value<float>("x"),
Y = o.Value<float>("y"),
YawDeg = o.Value<float>("yawDeg")
};
}
/// <summary>将小车瞬移到目标世界位姿。POST /api/robots/{name}/move。</summary>
public static void Move(string baseUrl, string robotName, float x, float y, float yawDeg)
{
var url = $"{baseUrl.TrimEnd('/')}/api/robots/{Uri.EscapeDataString(robotName)}/move";
var body = JsonConvert.SerializeObject(new { x, y, yaw = yawDeg, stop = true });
using var content = new StringContent(body, Encoding.UTF8, "application/json");
var resp = Http.PostAsync(url, content).GetAwaiter().GetResult();
resp.EnsureSuccessStatusCode();
}
/// <summary>查询车辆运动是否启用(暂停时为 false)。GET /api/motion。</summary>
public static bool MotionEnabled(string baseUrl)
{
var url = $"{baseUrl.TrimEnd('/')}/api/motion";
var json = Http.GetStringAsync(url).GetAwaiter().GetResult();
return JObject.Parse(json).Value<bool>("motionEnabled");
}
/// <summary>恢复车辆运动。POST /api/motion/resume。</summary>
public static void ResumeMotion(string baseUrl)
{
var url = $"{baseUrl.TrimEnd('/')}/api/motion/resume";
var resp = Http.PostAsync(url, null).GetAwaiter().GetResult();
resp.EnsureSuccessStatusCode();
}
/// <summary>
/// 暂停车辆运动(仅冻结运动,不停止仿真;传感器继续扫描)。POST /api/motion/pause。
/// feedback: "zero"(默认,反馈归零) / "none"(不上报) / "hold"(保留暂停瞬间值)。
/// </summary>
public static void PauseMotion(string baseUrl, string feedback = "zero")
{
var url = $"{baseUrl.TrimEnd('/')}/api/motion/pause";
var body = JsonConvert.SerializeObject(new { feedback });
using var content = new StringContent(body, Encoding.UTF8, "application/json");
var resp = Http.PostAsync(url, content).GetAwaiter().GetResult();
resp.EnsureSuccessStatusCode();
}
}