FRC プログラミングクイックスタート
Limelightは、ターゲティングデータ、ステータスデータ、およびライブ設定のためのREST/HTTP、Websocket、Modbus、およびNetworkTablesプロトコルをサポートしています。 JSONおよび生の出力形式が利用可能です。詳細については、ドキュメントのAPIセクションを参照してください。
FRCチームの場合、推奨されるプロトコルはNetworkTablesです。Limelightは、完全なJSONダンプを含むすべてのターゲティングデータを100Hzでネットワークテーブルに投稿します。 チームはまた、NetworkTablesを介してledMode、クロップウィンドウなどのコントロールを設定することもできます。 FRCチームは、Limelightの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);
//定期的にスマートダッシュボードに投稿する
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