NetworkTables API
Limelight OSはNetworkTables 4クライアントを搭載しています。設定UIで構成されたチーム番号/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 | パイプラインのレイテンシー寄与(ms)。総レイテンシーを得るには「cl」に加算します |
cl | double | キャプチャパイプラインのレイテンシー(ms)。センサーの中央行の露出終了からトラッキングパイプライン開始までの時間 |
t2d | double | 一致したタイムスタンプの統計値を含む配列:[targetValid, targetCount, targetLatency, captureLatency, tx, ty, txnc, tync, ta, tid, targetClassIndexDetector, targetClassIndexClassifier, targetLongSidePixels, targetShortSidePixels, targetHorizontalExtentPixels, targetVerticalExtentPixels, targetSkewDegrees] |
getpipe | int | カメラの実際のアクティブパイプラインインデックス(0〜9) |
getpipetype | string | パイプラインタイプ(例:「pipe_color」) |
json | string | ターゲティング結果の完全なJSONダンプ。「output」タブでパイプラインごとに有効にする必要があります |
tclass | string | 主要なニューラル検出器結果またはニューラル分類器結果のクラス名 |
tc | doubleArray | 十字線領域(3x3ピクセル領域)の下の平均HSV色を数値配列として取得 |
hb | double | ハートビート値。フレームごとに1回増加し、20億でリセット |
hw | doubleArray | ハードウェアメトリクス [fps, CPU温度, RAM使用量, 温度] |
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 | ロボットの向きと角速度を度と度/秒で設定[yaw,yawrate,pitch,pitchrate,roll,rollrate] |
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 | PiPメイン - セカンダリカメラストリームがプライマリカメラストリームの右下隅に配置されます |
2 | PiPセカンダリ - プライマリカメラストリームがセカンダリカメラストリームの右下隅に配置されます |
crop | (配列)クロップ矩形を設定します。パイプラインはウェブインターフェースのデフォルトクロップ矩形を利用する必要があります。配列は正確に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に設定することをお勧めします。温度上昇を抑えるために処理フレーム間でスキップするフレーム数を設定します。スキップされたフレーム中に出力はゼロになりません。 |
---|
- 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
IMUコントロール
キー | 型 | 説明 |
---|---|---|
imumode_set | int | IMUモードを設定します。0 - 外部IMUを使用、1 - 外部IMUを使用し内部IMUをシード、2 - 内部を使用、3 - MT1支援収束で内部を使用、4 - 外部IMU支援収束で内部IMUを使用 |
imuassistalpha_set | double | 相補フィルタのアルファ/強度。高い値は内部IMUが支援ソースにより速く収束することを意味します。デフォルトは低い値0.001に設定されています。これは以前よりも内部IMUを信頼しているためです。支援モードは内部IMUを選択された支援ソースに向けて非常に穏やかに「引っ張る」ように設計されています。 |
Python
Pythonスクリプトは任意のインバウンドおよびアウトバウンドデータを可能にします。
llpython | Pythonスクリプトによって送信される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 | バーコードデータの文字列配列 |