FRC 编程快速入门
Limelight 支持 REST/HTTP、Websocket、Modbus 和 NetworkTables 协议来获取目标数据、状态数据和实时配置。 可以使用 JSON 和原始输出格式。有关更多信息,请参阅文档的 API 部分。
对于 FRC 团队,推荐使用的协议是 NetworkTables。Limelight 以 100Hz 的频率将所有目标数据(包括完整的 JSON 数据)发布到 NetworkTables。 团队还可以通过 NetworkTables 设置控制参数,如 ledMode、裁剪窗口等。 FRC 团队可以使用 Limelight Lib Java 和 C++ 库在几秒钟内开始使用 Limelight。Limelight Lib 是最简单的入门方式。
LimelightLib:
- Java
- C++
- Python
double tx = LimelightHelpers.getTX("");
#include "LimelightHelpers.h"
double tx = LimelightHelpers::getTX("");
double ty = LimelightHelpers::getTY("");
wip
如果你想跳过 LimelightLib 直接使用 NetworkTables 进行编程:
- Java
- C++
- LabView
- Python
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import edu.wpi.first.networktables.NetworkTable;
import edu.wpi.first.networktables.NetworkTableEntry;
import edu.wpi.first.networktables.NetworkTableInstance;
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight");
NetworkTableEntry tx = table.getEntry("tx");
NetworkTableEntry ty = table.getEntry("ty");
NetworkTableEntry ta = table.getEntry("ta");
//定期读取值
double x = tx.getDouble(0.0);
double y = ty.getDouble(0.0);
double area = ta.getDouble(0.0);
//定期发布到 smart dashboard
SmartDashboard.putNumber("LimelightX", x);
SmartDashboard.putNumber("LimelightY", y);
SmartDashboard.putNumber("LimelightArea", area);
#include "frc/smartdashboard/Smartdashboard.h"
#include "networktables/NetworkTable.h"
#include "networktables/NetworkTableInstance.h"
#include "networktables/NetworkTableEntry.h"
#include "networktables/NetworkTableValue.h"
#include "wpi/span.h"
std::shared_ptr<nt::NetworkTable> table = nt::NetworkTableInstance::GetDefault().GetTable("limelight");
double targetOffsetAngle_Horizontal = table->GetNumber("tx",0.0);
double targetOffsetAngle_Vertical = table->GetNumber("ty",0.0);
double targetArea = table->GetNumber("ta",0.0);
double targetSkew = table->GetNumber("ts",0.0);
import cv2
import numpy as np
# runPipeline() 函数会被 Limelight 的后端每帧调用一次。
def runPipeline(image, llrobot):
# 将输入图像转换为 HSV 颜色空间
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 通过移除不在以下 HSV 最小/最大值范围内的像素,
# 将 hsv 转换为二值图像
img_threshold = cv2.inRange(img_hsv, (60, 70, 70), (85, 255, 255))
# 在新的二值图像中查找轮廓
contours, _ = cv2.findContours(img_threshold,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
largestContour = np.array([[]])
# 初始化一个空数组,用于发送回机器人的值
llpython = [0,0,0,0,0,0,0,0]
# 如果检测到轮廓,则绘制它们
if len(contours) > 0:
cv2.drawContours(image, contours, -1, 255, 2)
# 记录最大的轮廓
largestContour = max(contours, key=cv2.contourArea)
# 获取包围轮廓的未旋转边界框
x,y,w,h = cv2.boundingRect(largestContour)
# 绘制未旋转的边界框
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,255),2)
# 记录一些自定义数据以发送回机器人
llpython = [1,x,y,w,h,9,8,7]
# 返回最大轮廓用于 LL 十字准线,修改后的图像,以及自定义机器人数据
return largestContour, image, llpython