Skip to content

useAction

ROS 2 のアクションクライアント(roslib.Action)をラップします。一度に1つのゴールのライフサイクルだけを追跡します。新しいゴールを送るには sendGoal をもう一度呼び出してください。

tsx
import { useAction } from "roshooks";

interface FibonacciGoal {
  order: number;
}
interface FibonacciFeedback {
  sequence: number[];
}
interface FibonacciResult {
  sequence: number[];
}

const { sendGoal, cancelGoal, state, feedback, result, error } = useAction<
  FibonacciGoal,
  FibonacciFeedback,
  FibonacciResult
>({
  name: "/fibonacci",
  actionType: "example_interfaces/Fibonacci",
});

オプション

オプション説明
namestringアクション名(例: "/fibonacci")。
actionTypestringアクション型(例: "example_interfaces/Fibonacci")。

返り値

フィールド説明
sendGoal(goal: TGoal) => void新しいゴールを送信し、前回のゴール状態を置き換えます。
cancelGoal() => void実行中のゴールがあればキャンセルします。
stateActionState下記参照。
feedbackTFeedback | null直近のフィードバックメッセージ。
resultTResult | nullゴールが成功した際の結果。
errorstring | nullゴールが失敗した際のエラーメッセージ。
actionAction<TGoal, TFeedback, TResult> | nullroslib.js の Action クライアント本体。生成前は null

ActionState

ts
type ActionState = "idle" | "sending" | "active" | "succeeded" | "failed" | "canceled";
idle → sending → active → succeeded
                     │  └───────────→ failed
                     └─────────────→ canceled
  • idle — まだゴールを送信していない状態(または name/actionType が変わった直後)。
  • sendingsendGoal を呼んだ直後で、まだフィードバックが届いていない状態。
  • active — 少なくとも1件フィードバックを受信した状態。
  • succeeded / failed / canceled — 終了状態。

使用例

tsx
function FibonacciDemo() {
  const { sendGoal, cancelGoal, state, feedback, result } = useAction<
    FibonacciGoal,
    FibonacciFeedback,
    FibonacciResult
  >({
    name: "/fibonacci",
    actionType: "example_interfaces/Fibonacci",
  });

  return (
    <div>
      <button onClick={() => sendGoal({ order: 10 })}>ゴール送信</button>
      <button onClick={cancelGoal} disabled={state !== "active" && state !== "sending"}>
        キャンセル
      </button>
      <p>state: {state}</p>
      {feedback && <p>feedback: {feedback.sequence.join(", ")}</p>}
      {result && <p>result: {result.sequence.join(", ")}</p>}
    </div>
  );
}

WARNING

この Hook は ROS 2 のシンプル化された Action API を対象としています。ROS 1 の actionlib を使う場合は、roslib.js の ActionClient / Goal クラスを useRos 経由で直接使ってください。

Released under the BSD-3 License.