NetworkTables API
Limelight OS 具有 NetworkTables 4 客户端。它会根据在设置界面中配置的车队编号/ID自动连接到在FRC机器人上运行的 NetworkTables 4 服务器。
所有数据都发布到与设备名称匹配的表中(例如 "limelight")。如果为相机分配了 主机名/昵称,表名将与完整的 limelight 名称匹配(例如 "limelight-top")。
LimelightLib WPIJava 和 LimelightLib WPICPP 通过 NetworkTables 与 Limelight 设备进行交互。
基础目标数据
使用以下代码:
- Java
- LabView
- C++
- Python
NetworkTableInstance.getDefault().getTable("limelight").getEntry("<variablename>").getDouble(0);
nt::NetworkTableInstance::GetDefault().GetTable("limelight")->GetNumber("<variablename>",0.0);
NetworkTables.getTable("limelight").getNumber('<variablename>');
获取 以下数据:
键 | 类型 | 描述 |
---|---|---|
tv | int | 存在有效目标时为1。不存在有效目标时为0 |
tx | double | 从准星到目标的水平偏移量 (LL1: -27度到27度 / LL2: -29.8到29.8度) |
ty | double | 从准星到目标的垂直偏移量 (LL1: -20.5度到20.5度 / LL2: -24.85到24.85度) |
txnc | double | 从主像素到目标的水平偏移量(度) |
tync | double | 从主像素到目标的垂直偏移量(度) |
ta | double | 目标区域(图像的0%到100%) |
tl | double | 管道的延迟贡献(毫秒)。加上"cl"得到总延迟。 |
cl | double | 捕获管道延迟(毫秒)。从传感器中间行曝光结束到跟踪管道开始的时间。 |
t2d | double | 包含多个匹配时间戳统计值的数组:[目标有效性、目标数量、目标延迟、捕获延迟、tx、ty、txnc、tync、ta、tid、目标类索引检测器、目标类索引分类器、目标长边像素、目标短边像素、目标水平范围像素、目标垂直范围像素、目标倾斜度] |
getpipe | int | 相机当前激活的管道索引(0 .. 9) |
getpipetype | string | 管道类型,例如"pipe_color" |
json | string | 目标结果的完整JSON转储。必须在'output'选项卡中按管道启用 |
tclass | string | 主要神经检测器结果或神经分类器结果的类名 |
tc | doubleArray | 获取准星区域下方(3x3像素区域)的平均HSV颜色作为数字数组 |
hb | double | 心跳值。每帧增加一次,在20亿时重置 |
hw | doubleArray | 硬件指标 [fps, cpu温度, 内存使用 率, 温度] |
crosshairs | doubleArray | 2D准星 [cx0, cy0, cx1, cy1] |
tcclass | string | 分类器管道计算的类名称 |
tdclass | string | 检测器管道的主要检测类名称 |
AprilTag和3D数据
使用以下代码:
- Java
- C++
NetworkTableInstance.getDefault().getTable("limelight").getEntry("<variablename>").getDoubleArray(new double[6]);
nt::NetworkTableInstance::GetDefault().GetTable("limelight")->GetNumberArray("<variablename>",std::vector<double>(6));
获取以下数据:
键名 | 类型 | 描述 |
---|---|---|
botpose | doubleArray | 机器人在场地空间中的变换。平移(X,Y,Z)单位为米,旋转(Roll,Pitch,Yaw)单位为度,总延迟(cl+tl),标签数量,标签跨度,相机到标签的平均距离,平均标签面积(图像百分比) |
botpose_wpiblue | doubleArray | 机器人在场地空间中的变换(蓝方驾驶站WPILIB原点)。平移(X,Y,Z)单位为米,旋转(Roll,Pitch,Yaw)单位为度,总延迟(cl+tl),标签数量,标签跨度,相机到标签的平均距离,平均标签面积(图像百分比) |
botpose_wpired | doubleArray | 机器人在场地空间中的变换(红方驾驶站WPILIB原点)。平移(X,Y,Z)单位为米,旋转(Roll,Pitch,Yaw)单位为度,总延迟(cl+tl),标签数量,标签跨度,相机到标签的平均距离,平均标签面积(图像百分比) |
botpose_orb | doubleArray | 机器人在场地空间中的变换(Megatag2)。平移(X,Y,Z)单位为米,旋转(Roll,Pitch,Yaw)单位为度,总延迟(cl+tl),标签数量,标签跨度,相机 到标签的平均距离,平均标签面积(图像百分比) |
botpose_orb_wpiblue | doubleArray | 机器人在场地空间中的变换(Megatag2)(蓝方驾驶站WPILIB原点)。平移(X,Y,Z)单位为米,旋转(Roll,Pitch,Yaw)单位为度,总延迟(cl+tl),标签数量,标签跨度,相机到标签的平均距离,平均标签面积(图像百分比) |
botpose_orb_wpired | doubleArray | 机器人在场地空间中的变换(Megatag2)(红方驾驶站WPILIB原点)。平移(X,Y,Z)单位为米,旋转(Roll,Pitch,Yaw)单位为度,总延迟(cl+tl),标签数量,标签跨度,相机到标签的平均距离,平均标签面积(图像百分比) |
camerapose_targetspace | doubleArray | 相机在主视野AprilTag坐标系中的3D变换(数组(6)) [tx, ty, tz, pitch, yaw, roll] (米,度) |
targetpose_cameraspace | doubleArray | 主视野AprilTag在相机坐标系中的3D变换(数组(6)) [tx, ty, tz, pitch, yaw, roll] (米,度) |
targetpose_robotspace | doubleArray | 主视野AprilTag在机器人坐标系中的3D变换(数组(6)) [tx, ty, tz, pitch, yaw, roll] (米,度) |
botpose_targetspace | doubleArray | 机器人在主视野AprilTag坐标系中的3D变换(数组(6)) [tx, ty, tz, pitch, yaw, roll] (米,度) |
camerapose_robotspace | doubleArray | 相机在机器人坐标系中的3D变换(数组(6)) |
tid | int | 主视野AprilTag的ID |
stddevs | doubleArray | MegaTag标准差 [MT1x, MT1y, MT1z, MT1roll, MT1pitch, MT1Yaw, MT2x, MT2y, MT2z, MT2roll, MT2pitch, MT2yaw] |
camerapose_robotspace_set | doubleArray | 设置相机在机器人坐标系中的位姿 |
priorityid | int | 设置tx/ty目标所需的ID。忽略其他目标。不影响定位 |
robot_orientation_set | doubleArray | 设置机器人方向和角速度,单位为度和度/秒[偏航,偏航率,俯仰,俯仰率,翻滚,翻滚率] |
fiducial_id_filters_set | doubleArray | 覆盖定位的有效基准ID(数组) |
fiducial_offset_set | doubleArray | 设置3D兴趣点偏移[x,y,z] |
相机控制
使用以下代码:
- Java
- LabView
- C++
- Python
NetworkTableInstance.getDefault().getTable("limelight").getEntry("<variablename>").setNumber(<value>);
nt::NetworkTableInstance::GetDefault().GetTable("limelight")->PutNumber("<variablename>",<value>);
NetworkTables.getTable("limelight").putNumber('<variablename>',<value>)
设置以下数据:
ledMode | 设置 Limelight 的 LED 状态 |
---|---|
[0] | 使用当前管道中设置的 LED 模式 |
[1] | 强制关闭 |
[2] | 强制闪烁 |
[3] | 强制开启 |
pipeline | 设置 Limelight 的当前管道 |
---|---|
0 .. 9 | 选择管道 0..9 |
stream | 设置 Limelight 的流模式 |
---|---|
0 | 标准 - 如果网络摄像头连接到 Limelight,则显示并排流 |
1 | 画中画主要 - 次要相机流放置在主要相机流的右下角 |
2 | 画中画次要 - 主要相机流放置在次要相机流的右下角 |
crop | (数组) 设置裁剪矩形。管道必须在网页界面中使用默认裁剪矩形。数组必须恰好有 4 个条目。 |
---|---|
[0] | X0 - 裁剪矩形的最小或最大 X 值(-1 到 1) |
[1] | X1 - 裁剪矩形的最小或最大 X 值(-1 到 1) |
[2] | Y0 - 裁剪矩形的最小或最大 Y 值(-1 到 1) |
[3] | Y1 - 裁剪矩形的最小或最大 Y 值(-1 到 1) |
- Java
- C++
double[] cropValues = new double[4];
cropValues[0] = -1.0;
cropValues[1] = 1.0;
cropValues[2] = -1.0;
cropValues[3] = 1.0;
NetworkTableInstance.getDefault().getTable("limelight").getEntry("crop").setDoubleArray(cropValues);
wip
Python
Python 脚本允许任意的入站和出站数据。
llpython | 由 Python 脚本发送的数字数组。可在机器人代码中访问。 |
llrobot | 由机器人发送的数字数组。可在 Python SnapScripts 中访问。 |
原始数据
角点:
在"Output"选项卡中启用"send contours"以流式传输角点坐标:
tcornxy | 角点坐标的数字数组 [x0,y0,x1,y1......] |
原始目标:
Limelight 向 NetworkTables 发送三个不受分组模式影响的原始轮廓。也就是说,它们会经过管道参数过滤,但不会被分组。X 和 Y 以标准化屏幕空间(-1 到 1)而不是角度返回。
rawtargets | [txnc,tync,ta,txnc2,tync2,ta2....] |
原始基准标记:
获取所有有效( 未过滤)的基准标记
rawfiducials | [id, txnc, tync, ta, distToCamera, distToRobot, ambiguity, id2.....] |
原始检测:
获取所有有效(未过滤)的神经网络检测结果
rawdetections | [id, txnc, tync, ta, corner0x, corner0y, corner1x, corner1y, corner2x, corner2y, corner3x, corner3y, id2.....] |
原始条形码:
获取所有有效(未过滤)的条形码结果
rawbarcodes | 条形码数据的字符串数组 |