feat: publish particles and weights to pubusb
This commit is contained in:
@@ -57,6 +57,8 @@ defmodule Localiser.Localisation.Tag.Filter do
|
|||||||
def handle_cast({:ingest, measurements}, state) do
|
def handle_cast({:ingest, measurements}, state) do
|
||||||
{:ok, {x, y}, new_filter_state} = state.filter_module.update(state.filter_state, measurements)
|
{:ok, {x, y}, new_filter_state} = state.filter_module.update(state.filter_state, measurements)
|
||||||
|
|
||||||
|
publish_particles(state.tag_id, new_filter_state, {x, y})
|
||||||
|
|
||||||
new_room = find_room(state.rooms, x, y)
|
new_room = find_room(state.rooms, x, y)
|
||||||
new_room_id = if new_room, do: new_room.id, else: nil
|
new_room_id = if new_room, do: new_room.id, else: nil
|
||||||
|
|
||||||
@@ -79,7 +81,7 @@ defmodule Localiser.Localisation.Tag.Filter do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Room geometry changed — reload the rooms cache so containment checks stay accurate.
|
# Room geometry changed: reload the rooms cache so containment checks stay accurate.
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({event, _}, state) when event in [:room_created, :room_updated] do
|
def handle_info({event, _}, state) when event in [:room_created, :room_updated] do
|
||||||
{:noreply, %{state | rooms: load_rooms()}}
|
{:noreply, %{state | rooms: load_rooms()}}
|
||||||
@@ -91,6 +93,27 @@ defmodule Localiser.Localisation.Tag.Filter do
|
|||||||
|
|
||||||
def handle_info(_msg, state), do: {:noreply, state}
|
def handle_info(_msg, state), do: {:noreply, state}
|
||||||
|
|
||||||
|
# Only publish if the filter exposes particle state (i.e. is the particle filter).
|
||||||
|
defp publish_particles(tag_id, filter_state, {x, y}) do
|
||||||
|
# Other filter implementations may not have a :particles key - silently skip.
|
||||||
|
with %{particles: particles, weights: weights} <- filter_state do
|
||||||
|
payload = %{
|
||||||
|
tag_id: tag_id,
|
||||||
|
estimate: %{x: x, y: y},
|
||||||
|
particles: Enum.zip(particles, weights)
|
||||||
|
|> Enum.map(fn {p, w} ->
|
||||||
|
{px, py} = particle_xy(p)
|
||||||
|
%{x: px, y: py, w: w}
|
||||||
|
end)
|
||||||
|
}
|
||||||
|
|
||||||
|
Phoenix.PubSub.broadcast(Localiser.PubSub, "particles:#{tag_id}", {:particles_updated, payload})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp particle_xy({x, y}), do: {x, y}
|
||||||
|
defp particle_xy({x, y, _vx, _vy}), do: {x, y}
|
||||||
|
|
||||||
defp load_rooms do
|
defp load_rooms do
|
||||||
Floors.list_floors_with_rooms()
|
Floors.list_floors_with_rooms()
|
||||||
|> Enum.flat_map(& &1.rooms)
|
|> Enum.flat_map(& &1.rooms)
|
||||||
|
|||||||
Reference in New Issue
Block a user