Rclex.LifecycleNode behaviour (Rclex (Experimental) v0.12.0)

Copy Markdown View Source

A managed (lifecycle) node implementing the ROS 2 Managed Node design.

A Rclex.LifecycleNode wraps a regular Rclex node and adds the four primary states (:unconfigured, :inactive, :active, :finalized) with the corresponding transitions. The five standard lifecycle services are exposed under the node's namespace:

  • ~/change_state (lifecycle_msgs/srv/ChangeState)
  • ~/get_state (lifecycle_msgs/srv/GetState)
  • ~/get_available_states (lifecycle_msgs/srv/GetAvailableStates)
  • ~/get_available_transitions (lifecycle_msgs/srv/GetAvailableTransitions)
  • ~/get_transition_graph (lifecycle_msgs/srv/GetAvailableTransitions)

Usage

defmodule MyNode do
  use Rclex.LifecycleNode

  @impl true
  def on_configure(_state) do
    # acquire resources...
    {:ok, %{}}
  end

  @impl true
  def on_activate(_state) do
    # start publishing, etc.
    {:ok, %{}}
  end
end

Rclex.start_lifecycle_node(MyNode, "managed_node", namespace: "/example")
Rclex.lifecycle_change_state("managed_node", :configure, namespace: "/example")
Rclex.lifecycle_change_state("managed_node", :activate, namespace: "/example")

Callbacks

All callbacks are optional and default to {:ok, user_state}. Each receives the current user_state/0 and may return:

  • {:ok, new_user_state} — transition succeeds
  • {:error, new_user_state} — transition fails (rolls back to the previous primary state)
  • {:fatal, new_user_state} — transition errors; goes to :finalized

Available callbacks:

  • on_configure/1
  • on_cleanup/1
  • on_activate/1
  • on_deactivate/1
  • on_shutdown/1
  • on_error/1

Summary

Functions

Trigger a transition. Returns :ok if the transition succeeded, {:error, reason} otherwise.

Returns a specification to start this module under a supervisor.

Return the current primary state.

Return the current user state (whatever the user callbacks return).

Types

callback_result()

@type callback_result() ::
  {:ok, user_state()} | {:error, user_state()} | {:fatal, user_state()}

primary_state()

@type primary_state() :: :unconfigured | :inactive | :active | :finalized

transition()

@type transition() :: :configure | :cleanup | :activate | :deactivate | :shutdown

user_state()

@type user_state() :: any()

Callbacks

on_activate(user_state)

(optional)
@callback on_activate(user_state()) :: callback_result()

on_cleanup(user_state)

(optional)
@callback on_cleanup(user_state()) :: callback_result()

on_configure(user_state)

(optional)
@callback on_configure(user_state()) :: callback_result()

on_deactivate(user_state)

(optional)
@callback on_deactivate(user_state()) :: callback_result()

on_error(user_state)

(optional)
@callback on_error(user_state()) :: callback_result()

on_shutdown(user_state)

(optional)
@callback on_shutdown(user_state()) :: callback_result()

Functions

change_state(node_name, transition, opts \\ [])

@spec change_state(String.t(), transition(), keyword()) ::
  :ok | {:error, :invalid_transition | :callback_failed | :callback_errored}

Trigger a transition. Returns :ok if the transition succeeded, {:error, reason} otherwise.

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

get_state(node_name, opts \\ [])

@spec get_state(
  String.t(),
  keyword()
) :: primary_state()

Return the current primary state.

get_user_state(node_name, opts \\ [])

@spec get_user_state(
  String.t(),
  keyword()
) :: user_state()

Return the current user state (whatever the user callbacks return).