メインコンテンツまでスキップ

NetworkTables API

Limelight OSにはNetworkTables 4クライアントが搭載されています。設定UIで構成されたチーム番号/IDに基づいて、FRCロボット上で動作するNetworkTables 4サーバーに自動接続します。

すべてのデータはデバイス名と一致するテーブルに公開されます(例:"limelight")。カメラにホスト名/ニックネームが割り当てられている場合、テーブル名は完全なlimelight名と一致します(例:"limelight-top")。

LimelightLib WPIJavaとLimelightLib WPICPPは、NetworkTablesを介してLimelightデバイスと通信します。

基本ターゲティングデータ

以下のコードを使用します:

NetworkTableInstance.getDefault().getTable("limelight").getEntry("<variablename>").getDouble(0);

このデータを取得します:

キー説明
tvint有効なターゲットが存在する場合は1。有効なターゲットが存在しない場合は0
txdoubleクロスヘアからターゲットへの水平オフセット(LL1: -27度〜27度 / LL2: -29.8〜29.8度)
tydoubleクロスヘアからターゲットへの垂直オフセット(LL1: -20.5度〜20.5度 / LL2: -24.85〜24.85度)
txncdouble主点ピクセルからターゲットへの水平オフセット(度)
tyncdouble主点ピクセルからターゲットへの垂直オフセット(度)
tadoubleターゲット面積(画像の0%〜100%)
tldoubleパイプラインのレイテンシ寄与(ms)。合計レイテンシを得るには"cl"に加算します。
cldoubleキャプチャパイプラインレイテンシ(ms)。センサーの中央行の露光終了からトラッキングパイプライン開始までの時間。
t2ddoubleタイムスタンプ一致統計の複数の値を含む配列:[targetValid, targetCount, targetLatency, captureLatency, tx, ty, txnc, tync, ta, tid, targetClassIndexDetector, targetClassIndexClassifier, targetLongSidePixels, targetShortSidePixels, targetHorizontalExtentPixels, targetVerticalExtentPixels, targetSkewDegrees]
getpipeintカメラの現在アクティブなパイプラインインデックス(0 .. 9)
getpipetypestringパイプラインタイプ 例:"pipe_color"
jsonstringターゲティング結果の完全なJSONダンプ。'output'タブでパイプラインごとに有効にする必要があります
tclassstringプライマリニューラル検出器結果またはニューラル分類器結果のクラス名
tcdoubleArrayクロスヘア領域(3x3ピクセル領域)下の平均HSV色をNumberArrayとして取得
hbdoubleハートビート値。フレームごとに1増加し、20億でリセット
hwdoubleArrayHWメトリクス [fps, CPU温度, RAM使用量, 温度]
crosshairsdoubleArray2Dクロスヘア [cx0, cy0, cx1, cy1]
tcclassstring分類器パイプラインの計算されたクラス名
tdclassstring検出器パイプラインのプライマリ検出名

AprilTagと3Dデータ

以下のコードを使用します:

NetworkTableInstance.getDefault().getTable("limelight").getEntry("<variablename>").getDoubleArray(new double[6]);

このデータを取得します:

キー説明
botposedoubleArrayフィールド空間でのロボット変換。移動(X,Y,Z)はメートル、回転(Roll,Pitch,Yaw)は度、合計レイテンシ(cl+tl)、タグ数、タグスパン、カメラからの平均タグ距離、平均タグ面積(画像の割合)
botpose_wpibluedoubleArrayフィールド空間でのロボット変換(青ドライバーステーションWPILIB原点)。移動(X,Y,Z)はメートル、回転(Roll,Pitch,Yaw)は度、合計レイテンシ(cl+tl)、タグ数、タグスパン、カメラからの平均タグ距離、平均タグ面積(画像の割合)
botpose_wpireddoubleArrayフィールド空間でのロボット変換(赤ドライバーステーションWPILIB原点)。移動(X,Y,Z)はメートル、回転(Roll,Pitch,Yaw)は度、合計レイテンシ(cl+tl)、タグ数、タグスパン、カメラからの平均タグ距離、平均タグ面積(画像の割合)
botpose_orbdoubleArrayフィールド空間でのロボット変換(Megatag2)。移動(X,Y,Z)はメートル、回転(Roll,Pitch,Yaw)は度、合計レイテンシ(cl+tl)、タグ数、タグスパン、カメラからの平均タグ距離、平均タグ面積(画像の割合)
botpose_orb_wpibluedoubleArrayフィールド空間でのロボット変換(Megatag2)(青ドライバーステーションWPILIB原点)。移動(X,Y,Z)はメートル、回転(Roll,Pitch,Yaw)は度、合計レイテンシ(cl+tl)、タグ数、タグスパン、カメラからの平均タグ距離、平均タグ面積(画像の割合)
botpose_orb_wpireddoubleArrayフィールド空間でのロボット変換(Megatag2)(赤ドライバーステーションWPILIB原点)。移動(X,Y,Z)はメートル、回転(Roll,Pitch,Yaw)は度、合計レイテンシ(cl+tl)、タグ数、タグスパン、カメラからの平均タグ距離、平均タグ面積(画像の割合)
camerapose_targetspacedoubleArray視野内のプライマリAprilTagの座標系でのカメラの3D変換(配列(6))[tx, ty, tz, pitch, yaw, roll](メートル、度)
targetpose_cameraspacedoubleArrayカメラの座標系での視野内のプライマリAprilTagの3D変換(配列(6))[tx, ty, tz, pitch, yaw, roll](メートル、度)
targetpose_robotspacedoubleArrayロボットの座標系での視野内のプライマリAprilTagの3D変換(配列(6))[tx, ty, tz, pitch, yaw, roll](メートル、度)
botpose_targetspacedoubleArray視野内のプライマリAprilTagの座標系でのロボットの3D変換(配列(6))[tx, ty, tz, pitch, yaw, roll](メートル、度)
camerapose_robotspacedoubleArrayロボットの座標系でのカメラの3D変換(配列(6))
tidint視野内のプライマリAprilTagのID
stddevsdoubleArrayMegaTag標準偏差 [MT1x, MT1y, MT1z, MT1roll, MT1pitch, MT1Yaw, MT2x, MT2y, MT2z, MT2roll, MT2pitch, MT2yaw]
camerapose_robotspace_setdoubleArrayロボットの座標系でのカメラの姿勢を設定します。
priorityidinttx/tyターゲティングに必要なIDを設定します。他のターゲットを無視します。ローカライゼーションには影響しません
robot_orientation_setdoubleArrayロボットの向きと角速度を度と度/秒で設定します[yaw,yawrate,pitch,pitchrate,roll,rollrate]
fiducial_id_filters_setdoubleArrayローカライゼーション用の有効なフィデューシャルIDをオーバーライドします(配列)
fiducial_offset_setdoubleArray3D関心点オフセットを設定します [x,y,z]

カメラコントロール

以下のコードを使用します:

NetworkTableInstance.getDefault().getTable("limelight").getEntry("<variablename>").setNumber(<value>);

このデータを設定します:

ledModeLimelightのLED状態を設定します
[0]現在のパイプラインで設定されたLEDモードを使用
[1]強制オフ
[2]強制点滅
[3]強制オン
pipelineLimelightの現在のパイプラインを設定します
0 .. 9パイプライン0..9を選択
streamLimelightのストリーミングモードを設定します
0標準 - WebカメラがLimelightに接続されている場合、サイドバイサイドストリーム
1PiPメイン - セカンダリカメラストリームがプライマリカメラストリームの右下隅に配置されます
2PiPセカンダリ - プライマリカメラストリームがセカンダリカメラストリームの右下隅に配置されます
crop(配列)クロップ矩形を設定します。パイプラインはWebインターフェースでデフォルトのクロップ矩形を使用する必要があります。配列には正確に4つのエントリが必要です。
[0]X0 - クロップ矩形の最小または最大X値(-1〜1)
[1]X1 - クロップ矩形の最小または最大X値(-1〜1)
[2]Y0 - クロップ矩形の最小または最大Y値(-1〜1)
[3]Y1 - クロップ矩形の最小または最大Y値(-1〜1)
throttle_set(int)無効時は100-200に設定することをお勧めします。温度上昇を抑えるために処理フレーム間でスキップするフレーム数を設定します。スキップされたフレーム中も出力はゼロになりません。
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);

IMUコントロール

キー説明
imumode_setintimumodeを設定します。0 - 外部IMUを使用、1 - 外部IMUを使用し内部IMUをシード、2 - 内部を使用、3 - MT1アシスト収束付きで内部を使用、4 - 外部IMUアシスト収束付きで内部IMUを使用
imuassistalpha_setdouble相補フィルターのアルファ/強度。値が高いほど、内部IMUがアシストソースに素早く収束します。デフォルトは低い値0.001に設定されています。これは内部IMUを以前より信頼するようになったためです。アシストモードは、選択したアシストソースに向けて内部IMUを非常に穏やかに「引っ張る」ように構築されています。

Python

Pythonスクリプトは任意の入出力データを許可します。

llpythonPythonスクリプトによって送信されるNumberArray。ロボットコード内でアクセス可能です。
llrobotロボットによって送信されるNumberArray。Python SnapScripts内でアクセス可能です。

生データ

コーナー:

コーナー座標をストリームするには、"Output"タブで"send contours"を有効にします:

tcornxyコーナー座標の数値配列 [x0,y0,x1,y1......]

生ターゲット:

Limelightは、グループ化モードの影響を受けない3つの生の輪郭を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 バーコードデータの文字列配列