No version for distro humble showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro kilted showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro lyrical showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro rolling showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro ardent showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro bouncy showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro crystal showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro eloquent showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro dashing showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro galactic showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro foxy showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro iron showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro lunar showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro jade showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro indigo showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro hydro showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro kinetic showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro melodic showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange

No version for distro noetic showing jazzy. Known supported distros are highlighted in the buttons above.

Package Summary

Version 1.0.0
License Apache-2.0
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Checkout URI https://github.com/simone-contorno/prox_mpc.git
VCS Type git
VCS Version main
Last Updated 2026-07-28
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Message contract for the ProxMPC stack: Obstacle and ObstacleArray carry tracked-obstacle id, position, velocity, radius, covariances, and sampled predicted positions from the obstacle tracker to the Nav2 controller plugin; SolverDiagnostics carries per-control-cycle NMPC/QP solver telemetry. Interface-only package; no node.

Additional Links

Maintainers

  • Simone Contorno

Authors

No additional authors.

prox_mpc_msgs

ROS 2 Jazzy

The message contract between the ProxMPC obstacle tracker and the Nav2 controller plugin.

This is an interface-only package (rosidl messages, no node, no library code). It defines the messages that carry tracked dynamic obstacles from prox_mpc_obstacle_tracker to prox_mpc_controller for predictive obstacle avoidance, plus a per-cycle solver-telemetry message used for benchmarking.

Table of Contents

Overview

The package generates three messages with rosidl and exports the runtime through rosidl_default_runtime. It depends only on std_msgs and geometry_msgs, so any package on the workspace can consume the obstacle feed without pulling in the tracker or the controller.

Message Purpose
prox_mpc_msgs/msg/Obstacle One tracked dynamic obstacle: id, planar position, velocity, enclosing radius, covariances, and sampled predicted positions.
prox_mpc_msgs/msg/ObstacleArray A set of tracked obstacles published once per processed scan, with a header carrying the scan stamp and tracking frame.
prox_mpc_msgs/msg/SolverDiagnostics Per-control-cycle NMPC/QP solver telemetry for benchmarking (real-time, feasibility, and accuracy inputs).

Messages

Obstacle

A single tracked dynamic obstacle, expressed in the frame of the enclosing ObstacleArray header.

Field Type Unit Meaning
id uint32 - Stable track identifier, reused across scans for the same physical object.
position geometry_msgs/Point m Planar centroid; z unused (kept 0) by the 2D tracker.
velocity geometry_msgs/Vector3 m/s Estimated velocity; z unused (kept 0).
radius float64 m Enclosing radius of the detected cluster.
position_covariance float64[4] 2x2 position covariance, row-major [xx, xy, yx, yy]. Informational: the tracker fills it, but the bundled controller reads neither covariance field.
velocity_covariance float64[4] m²/s² 2x2 velocity covariance, row-major [xx, xy, yx, yy]. Informational: the bundled controller’s clearance growth is driven by its own prediction_uncertainty_growth parameter, not this field.
predicted_positions geometry_msgs/Point[] m Sampled predicted centroid positions in the ObstacleArray header frame; sample k (0-based) is the prediction at header.stamp + (k+1) * prediction_dt. z unused (kept 0). Empty when prediction sampling is disabled (prediction_steps: 0); consumers then fall back to a straight constant-velocity ray.
prediction_dt float64 s Spacing between predicted samples; 0.0 when predicted_positions is empty.

ObstacleArray

A set of tracked obstacles published once per processed scan.

Field Type Meaning
header std_msgs/Header stamp is the source scan time; frame_id is the tracking frame (a non-rotating frame, for example odom).
obstacles Obstacle[] The confirmed tracks for this scan.

SolverDiagnostics

Per-control-cycle NMPC/QP solver telemetry, filled from fields the core already computes (qp_info, sqp_iter, qp_iter_ext, slack w). Publishers are opt-in: on by default in the standalone simulation, off by default and only-when-subscribed in the production controller plugin (publish_diagnostics).

Field Type Unit Meaning
header std_msgs/Header - Control-cycle stamp; frame_id is the robot base frame the cycle was solved in.
solve_time_ms float64 ms Wall solve time measured around MPC::solve().
qp_solve_time_ms float64 ms QP-reported solve/run time from qp_info.
status uint8 - Outcome of the last QP, as one of this message’s own STATUS_* constants (see below).
converged bool - true when the cycle converged (status == STATUS_SOLVED and the applied iterate is finite); the caller’s fail-safe runs otherwise.
sqp_iters uint32 - SQP iterations.
qp_iters_ext uint32 - Total external QP iterations summed over the SQP loop.
primal_residual float64 - Final QP primal residual (qp_info.pri_res).
dual_residual float64 - Final QP dual residual (qp_info.dua_res).
objective float64 - Final QP objective value (qp_info.objValue).
max_obstacle_slack float64 m Max obstacle soft-keep-out slack w over the horizon; > 0 means the keep-out was relaxed (a safety-feasibility signal). 0 when avoidance is disabled.
control_period_ms float64 ms Measured inter-cycle wall period; NaN on the first cycle.
deadline_missed bool - true when solve_time_ms exceeds the 1000*dt budget. control_period_ms is deliberately excluded: the nominal period equals the budget by construction, so any period threshold would need an arbitrary slack.
num_active_obstacles uint16 - Number of filled (non-sentinel) obstacle slots considered this cycle.

The status field takes one of the following constants. They are this message’s own contract, not a copy of PROXQP’s QPSolverOutput ordering: the publisher maps the solver enum onto them explicitly, because proxsuite 0.6.5 inserted PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE in the middle of its enum and a mirrored value would have silently shifted meaning. New states are appended, so a recorded value never changes meaning.

Constant Value Meaning
STATUS_SOLVED 0 Converged.
STATUS_MAX_ITER_REACHED 1 Iteration cap reached before convergence.
STATUS_PRIMAL_INFEASIBLE 2 Primal infeasible.
STATUS_DUAL_INFEASIBLE 3 Dual infeasible.
STATUS_NOT_RUN 4 Solver was not run this cycle.
STATUS_SOLVED_CLOSEST_PRIMAL_FEASIBLE 5 The closest (L2 sense) primal-feasible problem was solved.
STATUS_UNKNOWN 255 A solver state this message does not model (an upstream enumerator added after the mapping was written).

Interface Contract

The producer (prox_mpc_obstacle_tracker) publishes an ObstacleArray per processed scan on tracked_obstacles (rclcpp::QoS(KeepLast(5)), reliable), with positions and velocities expressed in a fixed, non-rotating tracking frame and the header stamp set to the scan time.

The consumer (prox_mpc_controller) subscribes when predict_obstacles is enabled (reliable, depth 5).

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package prox_mpc_msgs

1.0.0 (2026-07-28)

  • Initial release: Obstacle and ObstacleArray messages for tracked dynamic obstacles (id, position, velocity, radius, covariances, and the sampled predicted positions with their time step).
  • SolverDiagnostics message: per-control-cycle NMPC/QP solver telemetry (solve times, QP status and convergence, SQP/QP iteration counts, residuals, objective, max obstacle slack, control period, and deadline/active-obstacle signals) for benchmarking; publishers are opt-in.
  • Contributors: Simone Contorno

Launch files

No launch files found

Services

No service files found

Plugins

No plugins found.

Recent questions tagged prox_mpc_msgs at Robotics Stack Exchange