Package Summary
| Version | 0.1.0 |
| License | MIT |
| Build type | AMENT_PYTHON |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/nova-utd/navigator.git |
| VCS Type | git |
| VCS Version | dev |
| Last Updated | 2026-08-07 |
| Dev Status | UNKNOWN |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Nova UTD
Authors
navigator_lane_change
Route-aware lane-change and obstacle-bypass behavior module for Navigator.
Runs in shadow mode by default — publishes decisions and debug output with zero vehicle control authority. Execution mode is enabled by a single parameter change once the node has been validated in shadow.
Modes
Shadow mode (default)
The node observes the environment, runs the full decision pipeline, and publishes its intent — but takes no action on the vehicle. Use this to validate behavior in simulation or on a real vehicle before enabling execution.
Set in param/lane_change_params.yaml:
shadow_mode: true
Execution mode
When you are ready to allow the node to actually command lane changes, set:
shadow_mode: false
In execution mode the FSM transitions through to EXECUTE_LANE_CHANGE and the downstream trajectory node (PR 2) picks up the decision from /behavior/lane_change_decision to generate and follow a quintic path. No other code changes are needed — the interface is identical between modes.
Triggering a lane change from another node
Any node in the stack can request a lane change by publishing a single string to:
/behavior/lane_change_command (std_msgs/String)
Valid values: "left", "right", "cancel"
Python example
from std_msgs.msg import String
# In your node's __init__:
self._lc_pub = self.create_publisher(String, '/behavior/lane_change_command', 10)
# Request a right lane change:
msg = String()
msg.data = 'right'
self._lc_pub.publish(msg)
# Request a left lane change:
msg.data = 'left'
self._lc_pub.publish(msg)
# Cancel / abort an in-progress lane change:
msg.data = 'cancel'
self._lc_pub.publish(msg)
Commands take priority over obstacle-triggered lane changes. A command expires automatically after 30 seconds — if the publishing node goes offline, the vehicle will not be left trying to change lanes indefinitely.
From the terminal (testing / manual override)
# Change to right lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'right'"
# Change to left lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'left'"
# Cancel
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'cancel'"
Topics
Subscribed
| Topic | Type | Description |
|---|---|---|
/gnss/odometry |
nav_msgs/Odometry |
Ego position and velocity |
/planning/path |
nav_msgs/Path |
Current planned path |
/objdet3d_tracked |
navigator_msgs/Object3DArray |
Tracked objects from perception |
/intersection_status |
navigator_msgs/IntersectionStatus |
Suppresses lane changes at intersections |
/behavior/lane_change_command |
std_msgs/String |
External lane change request (left, right, cancel) |
Published
| Topic | Type | Description |
|---|---|---|
/behavior/lane_change_state |
std_msgs/String |
Current FSM state name |
/behavior/lane_change_decision |
std_msgs/String |
JSON decision summary (consumed by trajectory node in PR 2) |
/behavior/lane_change_debug |
std_msgs/String |
JSON full debug dump — all inputs, blockers, gap values |
FSM states
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| navigator_msgs | |
| ament_copyright | |
| ament_flake8 | |
| ament_pep257 | |
| rclpy | |
| std_msgs | |
| nav_msgs | |
| geometry_msgs |
System Dependencies
| Name |
|---|
| python3-pytest |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged navigator_lane_change at Robotics Stack Exchange
Package Summary
| Version | 0.1.0 |
| License | MIT |
| Build type | AMENT_PYTHON |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/nova-utd/navigator.git |
| VCS Type | git |
| VCS Version | dev |
| Last Updated | 2026-08-07 |
| Dev Status | UNKNOWN |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Nova UTD
Authors
navigator_lane_change
Route-aware lane-change and obstacle-bypass behavior module for Navigator.
Runs in shadow mode by default — publishes decisions and debug output with zero vehicle control authority. Execution mode is enabled by a single parameter change once the node has been validated in shadow.
Modes
Shadow mode (default)
The node observes the environment, runs the full decision pipeline, and publishes its intent — but takes no action on the vehicle. Use this to validate behavior in simulation or on a real vehicle before enabling execution.
Set in param/lane_change_params.yaml:
shadow_mode: true
Execution mode
When you are ready to allow the node to actually command lane changes, set:
shadow_mode: false
In execution mode the FSM transitions through to EXECUTE_LANE_CHANGE and the downstream trajectory node (PR 2) picks up the decision from /behavior/lane_change_decision to generate and follow a quintic path. No other code changes are needed — the interface is identical between modes.
Triggering a lane change from another node
Any node in the stack can request a lane change by publishing a single string to:
/behavior/lane_change_command (std_msgs/String)
Valid values: "left", "right", "cancel"
Python example
from std_msgs.msg import String
# In your node's __init__:
self._lc_pub = self.create_publisher(String, '/behavior/lane_change_command', 10)
# Request a right lane change:
msg = String()
msg.data = 'right'
self._lc_pub.publish(msg)
# Request a left lane change:
msg.data = 'left'
self._lc_pub.publish(msg)
# Cancel / abort an in-progress lane change:
msg.data = 'cancel'
self._lc_pub.publish(msg)
Commands take priority over obstacle-triggered lane changes. A command expires automatically after 30 seconds — if the publishing node goes offline, the vehicle will not be left trying to change lanes indefinitely.
From the terminal (testing / manual override)
# Change to right lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'right'"
# Change to left lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'left'"
# Cancel
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'cancel'"
Topics
Subscribed
| Topic | Type | Description |
|---|---|---|
/gnss/odometry |
nav_msgs/Odometry |
Ego position and velocity |
/planning/path |
nav_msgs/Path |
Current planned path |
/objdet3d_tracked |
navigator_msgs/Object3DArray |
Tracked objects from perception |
/intersection_status |
navigator_msgs/IntersectionStatus |
Suppresses lane changes at intersections |
/behavior/lane_change_command |
std_msgs/String |
External lane change request (left, right, cancel) |
Published
| Topic | Type | Description |
|---|---|---|
/behavior/lane_change_state |
std_msgs/String |
Current FSM state name |
/behavior/lane_change_decision |
std_msgs/String |
JSON decision summary (consumed by trajectory node in PR 2) |
/behavior/lane_change_debug |
std_msgs/String |
JSON full debug dump — all inputs, blockers, gap values |
FSM states
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| navigator_msgs | |
| ament_copyright | |
| ament_flake8 | |
| ament_pep257 | |
| rclpy | |
| std_msgs | |
| nav_msgs | |
| geometry_msgs |
System Dependencies
| Name |
|---|
| python3-pytest |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged navigator_lane_change at Robotics Stack Exchange
Package Summary
| Version | 0.1.0 |
| License | MIT |
| Build type | AMENT_PYTHON |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/nova-utd/navigator.git |
| VCS Type | git |
| VCS Version | dev |
| Last Updated | 2026-08-07 |
| Dev Status | UNKNOWN |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Nova UTD
Authors
navigator_lane_change
Route-aware lane-change and obstacle-bypass behavior module for Navigator.
Runs in shadow mode by default — publishes decisions and debug output with zero vehicle control authority. Execution mode is enabled by a single parameter change once the node has been validated in shadow.
Modes
Shadow mode (default)
The node observes the environment, runs the full decision pipeline, and publishes its intent — but takes no action on the vehicle. Use this to validate behavior in simulation or on a real vehicle before enabling execution.
Set in param/lane_change_params.yaml:
shadow_mode: true
Execution mode
When you are ready to allow the node to actually command lane changes, set:
shadow_mode: false
In execution mode the FSM transitions through to EXECUTE_LANE_CHANGE and the downstream trajectory node (PR 2) picks up the decision from /behavior/lane_change_decision to generate and follow a quintic path. No other code changes are needed — the interface is identical between modes.
Triggering a lane change from another node
Any node in the stack can request a lane change by publishing a single string to:
/behavior/lane_change_command (std_msgs/String)
Valid values: "left", "right", "cancel"
Python example
from std_msgs.msg import String
# In your node's __init__:
self._lc_pub = self.create_publisher(String, '/behavior/lane_change_command', 10)
# Request a right lane change:
msg = String()
msg.data = 'right'
self._lc_pub.publish(msg)
# Request a left lane change:
msg.data = 'left'
self._lc_pub.publish(msg)
# Cancel / abort an in-progress lane change:
msg.data = 'cancel'
self._lc_pub.publish(msg)
Commands take priority over obstacle-triggered lane changes. A command expires automatically after 30 seconds — if the publishing node goes offline, the vehicle will not be left trying to change lanes indefinitely.
From the terminal (testing / manual override)
# Change to right lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'right'"
# Change to left lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'left'"
# Cancel
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'cancel'"
Topics
Subscribed
| Topic | Type | Description |
|---|---|---|
/gnss/odometry |
nav_msgs/Odometry |
Ego position and velocity |
/planning/path |
nav_msgs/Path |
Current planned path |
/objdet3d_tracked |
navigator_msgs/Object3DArray |
Tracked objects from perception |
/intersection_status |
navigator_msgs/IntersectionStatus |
Suppresses lane changes at intersections |
/behavior/lane_change_command |
std_msgs/String |
External lane change request (left, right, cancel) |
Published
| Topic | Type | Description |
|---|---|---|
/behavior/lane_change_state |
std_msgs/String |
Current FSM state name |
/behavior/lane_change_decision |
std_msgs/String |
JSON decision summary (consumed by trajectory node in PR 2) |
/behavior/lane_change_debug |
std_msgs/String |
JSON full debug dump — all inputs, blockers, gap values |
FSM states
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| navigator_msgs | |
| ament_copyright | |
| ament_flake8 | |
| ament_pep257 | |
| rclpy | |
| std_msgs | |
| nav_msgs | |
| geometry_msgs |
System Dependencies
| Name |
|---|
| python3-pytest |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged navigator_lane_change at Robotics Stack Exchange
Package Summary
| Version | 0.1.0 |
| License | MIT |
| Build type | AMENT_PYTHON |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/nova-utd/navigator.git |
| VCS Type | git |
| VCS Version | dev |
| Last Updated | 2026-08-07 |
| Dev Status | UNKNOWN |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Nova UTD
Authors
navigator_lane_change
Route-aware lane-change and obstacle-bypass behavior module for Navigator.
Runs in shadow mode by default — publishes decisions and debug output with zero vehicle control authority. Execution mode is enabled by a single parameter change once the node has been validated in shadow.
Modes
Shadow mode (default)
The node observes the environment, runs the full decision pipeline, and publishes its intent — but takes no action on the vehicle. Use this to validate behavior in simulation or on a real vehicle before enabling execution.
Set in param/lane_change_params.yaml:
shadow_mode: true
Execution mode
When you are ready to allow the node to actually command lane changes, set:
shadow_mode: false
In execution mode the FSM transitions through to EXECUTE_LANE_CHANGE and the downstream trajectory node (PR 2) picks up the decision from /behavior/lane_change_decision to generate and follow a quintic path. No other code changes are needed — the interface is identical between modes.
Triggering a lane change from another node
Any node in the stack can request a lane change by publishing a single string to:
/behavior/lane_change_command (std_msgs/String)
Valid values: "left", "right", "cancel"
Python example
from std_msgs.msg import String
# In your node's __init__:
self._lc_pub = self.create_publisher(String, '/behavior/lane_change_command', 10)
# Request a right lane change:
msg = String()
msg.data = 'right'
self._lc_pub.publish(msg)
# Request a left lane change:
msg.data = 'left'
self._lc_pub.publish(msg)
# Cancel / abort an in-progress lane change:
msg.data = 'cancel'
self._lc_pub.publish(msg)
Commands take priority over obstacle-triggered lane changes. A command expires automatically after 30 seconds — if the publishing node goes offline, the vehicle will not be left trying to change lanes indefinitely.
From the terminal (testing / manual override)
# Change to right lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'right'"
# Change to left lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'left'"
# Cancel
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'cancel'"
Topics
Subscribed
| Topic | Type | Description |
|---|---|---|
/gnss/odometry |
nav_msgs/Odometry |
Ego position and velocity |
/planning/path |
nav_msgs/Path |
Current planned path |
/objdet3d_tracked |
navigator_msgs/Object3DArray |
Tracked objects from perception |
/intersection_status |
navigator_msgs/IntersectionStatus |
Suppresses lane changes at intersections |
/behavior/lane_change_command |
std_msgs/String |
External lane change request (left, right, cancel) |
Published
| Topic | Type | Description |
|---|---|---|
/behavior/lane_change_state |
std_msgs/String |
Current FSM state name |
/behavior/lane_change_decision |
std_msgs/String |
JSON decision summary (consumed by trajectory node in PR 2) |
/behavior/lane_change_debug |
std_msgs/String |
JSON full debug dump — all inputs, blockers, gap values |
FSM states
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| navigator_msgs | |
| ament_copyright | |
| ament_flake8 | |
| ament_pep257 | |
| rclpy | |
| std_msgs | |
| nav_msgs | |
| geometry_msgs |
System Dependencies
| Name |
|---|
| python3-pytest |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged navigator_lane_change at Robotics Stack Exchange
Package Summary
| Version | 0.1.0 |
| License | MIT |
| Build type | AMENT_PYTHON |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/nova-utd/navigator.git |
| VCS Type | git |
| VCS Version | dev |
| Last Updated | 2026-08-07 |
| Dev Status | UNKNOWN |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Nova UTD
Authors
navigator_lane_change
Route-aware lane-change and obstacle-bypass behavior module for Navigator.
Runs in shadow mode by default — publishes decisions and debug output with zero vehicle control authority. Execution mode is enabled by a single parameter change once the node has been validated in shadow.
Modes
Shadow mode (default)
The node observes the environment, runs the full decision pipeline, and publishes its intent — but takes no action on the vehicle. Use this to validate behavior in simulation or on a real vehicle before enabling execution.
Set in param/lane_change_params.yaml:
shadow_mode: true
Execution mode
When you are ready to allow the node to actually command lane changes, set:
shadow_mode: false
In execution mode the FSM transitions through to EXECUTE_LANE_CHANGE and the downstream trajectory node (PR 2) picks up the decision from /behavior/lane_change_decision to generate and follow a quintic path. No other code changes are needed — the interface is identical between modes.
Triggering a lane change from another node
Any node in the stack can request a lane change by publishing a single string to:
/behavior/lane_change_command (std_msgs/String)
Valid values: "left", "right", "cancel"
Python example
from std_msgs.msg import String
# In your node's __init__:
self._lc_pub = self.create_publisher(String, '/behavior/lane_change_command', 10)
# Request a right lane change:
msg = String()
msg.data = 'right'
self._lc_pub.publish(msg)
# Request a left lane change:
msg.data = 'left'
self._lc_pub.publish(msg)
# Cancel / abort an in-progress lane change:
msg.data = 'cancel'
self._lc_pub.publish(msg)
Commands take priority over obstacle-triggered lane changes. A command expires automatically after 30 seconds — if the publishing node goes offline, the vehicle will not be left trying to change lanes indefinitely.
From the terminal (testing / manual override)
# Change to right lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'right'"
# Change to left lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'left'"
# Cancel
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'cancel'"
Topics
Subscribed
| Topic | Type | Description |
|---|---|---|
/gnss/odometry |
nav_msgs/Odometry |
Ego position and velocity |
/planning/path |
nav_msgs/Path |
Current planned path |
/objdet3d_tracked |
navigator_msgs/Object3DArray |
Tracked objects from perception |
/intersection_status |
navigator_msgs/IntersectionStatus |
Suppresses lane changes at intersections |
/behavior/lane_change_command |
std_msgs/String |
External lane change request (left, right, cancel) |
Published
| Topic | Type | Description |
|---|---|---|
/behavior/lane_change_state |
std_msgs/String |
Current FSM state name |
/behavior/lane_change_decision |
std_msgs/String |
JSON decision summary (consumed by trajectory node in PR 2) |
/behavior/lane_change_debug |
std_msgs/String |
JSON full debug dump — all inputs, blockers, gap values |
FSM states
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| navigator_msgs | |
| ament_copyright | |
| ament_flake8 | |
| ament_pep257 | |
| rclpy | |
| std_msgs | |
| nav_msgs | |
| geometry_msgs |
System Dependencies
| Name |
|---|
| python3-pytest |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged navigator_lane_change at Robotics Stack Exchange
Package Summary
| Version | 0.1.0 |
| License | MIT |
| Build type | AMENT_PYTHON |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/nova-utd/navigator.git |
| VCS Type | git |
| VCS Version | dev |
| Last Updated | 2026-08-07 |
| Dev Status | UNKNOWN |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Nova UTD
Authors
navigator_lane_change
Route-aware lane-change and obstacle-bypass behavior module for Navigator.
Runs in shadow mode by default — publishes decisions and debug output with zero vehicle control authority. Execution mode is enabled by a single parameter change once the node has been validated in shadow.
Modes
Shadow mode (default)
The node observes the environment, runs the full decision pipeline, and publishes its intent — but takes no action on the vehicle. Use this to validate behavior in simulation or on a real vehicle before enabling execution.
Set in param/lane_change_params.yaml:
shadow_mode: true
Execution mode
When you are ready to allow the node to actually command lane changes, set:
shadow_mode: false
In execution mode the FSM transitions through to EXECUTE_LANE_CHANGE and the downstream trajectory node (PR 2) picks up the decision from /behavior/lane_change_decision to generate and follow a quintic path. No other code changes are needed — the interface is identical between modes.
Triggering a lane change from another node
Any node in the stack can request a lane change by publishing a single string to:
/behavior/lane_change_command (std_msgs/String)
Valid values: "left", "right", "cancel"
Python example
from std_msgs.msg import String
# In your node's __init__:
self._lc_pub = self.create_publisher(String, '/behavior/lane_change_command', 10)
# Request a right lane change:
msg = String()
msg.data = 'right'
self._lc_pub.publish(msg)
# Request a left lane change:
msg.data = 'left'
self._lc_pub.publish(msg)
# Cancel / abort an in-progress lane change:
msg.data = 'cancel'
self._lc_pub.publish(msg)
Commands take priority over obstacle-triggered lane changes. A command expires automatically after 30 seconds — if the publishing node goes offline, the vehicle will not be left trying to change lanes indefinitely.
From the terminal (testing / manual override)
# Change to right lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'right'"
# Change to left lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'left'"
# Cancel
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'cancel'"
Topics
Subscribed
| Topic | Type | Description |
|---|---|---|
/gnss/odometry |
nav_msgs/Odometry |
Ego position and velocity |
/planning/path |
nav_msgs/Path |
Current planned path |
/objdet3d_tracked |
navigator_msgs/Object3DArray |
Tracked objects from perception |
/intersection_status |
navigator_msgs/IntersectionStatus |
Suppresses lane changes at intersections |
/behavior/lane_change_command |
std_msgs/String |
External lane change request (left, right, cancel) |
Published
| Topic | Type | Description |
|---|---|---|
/behavior/lane_change_state |
std_msgs/String |
Current FSM state name |
/behavior/lane_change_decision |
std_msgs/String |
JSON decision summary (consumed by trajectory node in PR 2) |
/behavior/lane_change_debug |
std_msgs/String |
JSON full debug dump — all inputs, blockers, gap values |
FSM states
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| navigator_msgs | |
| ament_copyright | |
| ament_flake8 | |
| ament_pep257 | |
| rclpy | |
| std_msgs | |
| nav_msgs | |
| geometry_msgs |
System Dependencies
| Name |
|---|
| python3-pytest |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged navigator_lane_change at Robotics Stack Exchange
Package Summary
| Version | 0.1.0 |
| License | MIT |
| Build type | AMENT_PYTHON |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/nova-utd/navigator.git |
| VCS Type | git |
| VCS Version | dev |
| Last Updated | 2026-08-07 |
| Dev Status | UNKNOWN |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Nova UTD
Authors
navigator_lane_change
Route-aware lane-change and obstacle-bypass behavior module for Navigator.
Runs in shadow mode by default — publishes decisions and debug output with zero vehicle control authority. Execution mode is enabled by a single parameter change once the node has been validated in shadow.
Modes
Shadow mode (default)
The node observes the environment, runs the full decision pipeline, and publishes its intent — but takes no action on the vehicle. Use this to validate behavior in simulation or on a real vehicle before enabling execution.
Set in param/lane_change_params.yaml:
shadow_mode: true
Execution mode
When you are ready to allow the node to actually command lane changes, set:
shadow_mode: false
In execution mode the FSM transitions through to EXECUTE_LANE_CHANGE and the downstream trajectory node (PR 2) picks up the decision from /behavior/lane_change_decision to generate and follow a quintic path. No other code changes are needed — the interface is identical between modes.
Triggering a lane change from another node
Any node in the stack can request a lane change by publishing a single string to:
/behavior/lane_change_command (std_msgs/String)
Valid values: "left", "right", "cancel"
Python example
from std_msgs.msg import String
# In your node's __init__:
self._lc_pub = self.create_publisher(String, '/behavior/lane_change_command', 10)
# Request a right lane change:
msg = String()
msg.data = 'right'
self._lc_pub.publish(msg)
# Request a left lane change:
msg.data = 'left'
self._lc_pub.publish(msg)
# Cancel / abort an in-progress lane change:
msg.data = 'cancel'
self._lc_pub.publish(msg)
Commands take priority over obstacle-triggered lane changes. A command expires automatically after 30 seconds — if the publishing node goes offline, the vehicle will not be left trying to change lanes indefinitely.
From the terminal (testing / manual override)
# Change to right lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'right'"
# Change to left lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'left'"
# Cancel
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'cancel'"
Topics
Subscribed
| Topic | Type | Description |
|---|---|---|
/gnss/odometry |
nav_msgs/Odometry |
Ego position and velocity |
/planning/path |
nav_msgs/Path |
Current planned path |
/objdet3d_tracked |
navigator_msgs/Object3DArray |
Tracked objects from perception |
/intersection_status |
navigator_msgs/IntersectionStatus |
Suppresses lane changes at intersections |
/behavior/lane_change_command |
std_msgs/String |
External lane change request (left, right, cancel) |
Published
| Topic | Type | Description |
|---|---|---|
/behavior/lane_change_state |
std_msgs/String |
Current FSM state name |
/behavior/lane_change_decision |
std_msgs/String |
JSON decision summary (consumed by trajectory node in PR 2) |
/behavior/lane_change_debug |
std_msgs/String |
JSON full debug dump — all inputs, blockers, gap values |
FSM states
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| navigator_msgs | |
| ament_copyright | |
| ament_flake8 | |
| ament_pep257 | |
| rclpy | |
| std_msgs | |
| nav_msgs | |
| geometry_msgs |
System Dependencies
| Name |
|---|
| python3-pytest |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged navigator_lane_change at Robotics Stack Exchange
Package Summary
| Version | 0.1.0 |
| License | MIT |
| Build type | AMENT_PYTHON |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/nova-utd/navigator.git |
| VCS Type | git |
| VCS Version | dev |
| Last Updated | 2026-08-07 |
| Dev Status | UNKNOWN |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Nova UTD
Authors
navigator_lane_change
Route-aware lane-change and obstacle-bypass behavior module for Navigator.
Runs in shadow mode by default — publishes decisions and debug output with zero vehicle control authority. Execution mode is enabled by a single parameter change once the node has been validated in shadow.
Modes
Shadow mode (default)
The node observes the environment, runs the full decision pipeline, and publishes its intent — but takes no action on the vehicle. Use this to validate behavior in simulation or on a real vehicle before enabling execution.
Set in param/lane_change_params.yaml:
shadow_mode: true
Execution mode
When you are ready to allow the node to actually command lane changes, set:
shadow_mode: false
In execution mode the FSM transitions through to EXECUTE_LANE_CHANGE and the downstream trajectory node (PR 2) picks up the decision from /behavior/lane_change_decision to generate and follow a quintic path. No other code changes are needed — the interface is identical between modes.
Triggering a lane change from another node
Any node in the stack can request a lane change by publishing a single string to:
/behavior/lane_change_command (std_msgs/String)
Valid values: "left", "right", "cancel"
Python example
from std_msgs.msg import String
# In your node's __init__:
self._lc_pub = self.create_publisher(String, '/behavior/lane_change_command', 10)
# Request a right lane change:
msg = String()
msg.data = 'right'
self._lc_pub.publish(msg)
# Request a left lane change:
msg.data = 'left'
self._lc_pub.publish(msg)
# Cancel / abort an in-progress lane change:
msg.data = 'cancel'
self._lc_pub.publish(msg)
Commands take priority over obstacle-triggered lane changes. A command expires automatically after 30 seconds — if the publishing node goes offline, the vehicle will not be left trying to change lanes indefinitely.
From the terminal (testing / manual override)
# Change to right lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'right'"
# Change to left lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'left'"
# Cancel
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'cancel'"
Topics
Subscribed
| Topic | Type | Description |
|---|---|---|
/gnss/odometry |
nav_msgs/Odometry |
Ego position and velocity |
/planning/path |
nav_msgs/Path |
Current planned path |
/objdet3d_tracked |
navigator_msgs/Object3DArray |
Tracked objects from perception |
/intersection_status |
navigator_msgs/IntersectionStatus |
Suppresses lane changes at intersections |
/behavior/lane_change_command |
std_msgs/String |
External lane change request (left, right, cancel) |
Published
| Topic | Type | Description |
|---|---|---|
/behavior/lane_change_state |
std_msgs/String |
Current FSM state name |
/behavior/lane_change_decision |
std_msgs/String |
JSON decision summary (consumed by trajectory node in PR 2) |
/behavior/lane_change_debug |
std_msgs/String |
JSON full debug dump — all inputs, blockers, gap values |
FSM states
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| navigator_msgs | |
| ament_copyright | |
| ament_flake8 | |
| ament_pep257 | |
| rclpy | |
| std_msgs | |
| nav_msgs | |
| geometry_msgs |
System Dependencies
| Name |
|---|
| python3-pytest |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged navigator_lane_change at Robotics Stack Exchange
Package Summary
| Version | 0.1.0 |
| License | MIT |
| Build type | AMENT_PYTHON |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/nova-utd/navigator.git |
| VCS Type | git |
| VCS Version | dev |
| Last Updated | 2026-08-07 |
| Dev Status | UNKNOWN |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Nova UTD
Authors
navigator_lane_change
Route-aware lane-change and obstacle-bypass behavior module for Navigator.
Runs in shadow mode by default — publishes decisions and debug output with zero vehicle control authority. Execution mode is enabled by a single parameter change once the node has been validated in shadow.
Modes
Shadow mode (default)
The node observes the environment, runs the full decision pipeline, and publishes its intent — but takes no action on the vehicle. Use this to validate behavior in simulation or on a real vehicle before enabling execution.
Set in param/lane_change_params.yaml:
shadow_mode: true
Execution mode
When you are ready to allow the node to actually command lane changes, set:
shadow_mode: false
In execution mode the FSM transitions through to EXECUTE_LANE_CHANGE and the downstream trajectory node (PR 2) picks up the decision from /behavior/lane_change_decision to generate and follow a quintic path. No other code changes are needed — the interface is identical between modes.
Triggering a lane change from another node
Any node in the stack can request a lane change by publishing a single string to:
/behavior/lane_change_command (std_msgs/String)
Valid values: "left", "right", "cancel"
Python example
from std_msgs.msg import String
# In your node's __init__:
self._lc_pub = self.create_publisher(String, '/behavior/lane_change_command', 10)
# Request a right lane change:
msg = String()
msg.data = 'right'
self._lc_pub.publish(msg)
# Request a left lane change:
msg.data = 'left'
self._lc_pub.publish(msg)
# Cancel / abort an in-progress lane change:
msg.data = 'cancel'
self._lc_pub.publish(msg)
Commands take priority over obstacle-triggered lane changes. A command expires automatically after 30 seconds — if the publishing node goes offline, the vehicle will not be left trying to change lanes indefinitely.
From the terminal (testing / manual override)
# Change to right lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'right'"
# Change to left lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'left'"
# Cancel
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'cancel'"
Topics
Subscribed
| Topic | Type | Description |
|---|---|---|
/gnss/odometry |
nav_msgs/Odometry |
Ego position and velocity |
/planning/path |
nav_msgs/Path |
Current planned path |
/objdet3d_tracked |
navigator_msgs/Object3DArray |
Tracked objects from perception |
/intersection_status |
navigator_msgs/IntersectionStatus |
Suppresses lane changes at intersections |
/behavior/lane_change_command |
std_msgs/String |
External lane change request (left, right, cancel) |
Published
| Topic | Type | Description |
|---|---|---|
/behavior/lane_change_state |
std_msgs/String |
Current FSM state name |
/behavior/lane_change_decision |
std_msgs/String |
JSON decision summary (consumed by trajectory node in PR 2) |
/behavior/lane_change_debug |
std_msgs/String |
JSON full debug dump — all inputs, blockers, gap values |
FSM states
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| navigator_msgs | |
| ament_copyright | |
| ament_flake8 | |
| ament_pep257 | |
| rclpy | |
| std_msgs | |
| nav_msgs | |
| geometry_msgs |
System Dependencies
| Name |
|---|
| python3-pytest |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged navigator_lane_change at Robotics Stack Exchange
Package Summary
| Version | 0.1.0 |
| License | MIT |
| Build type | AMENT_PYTHON |
| Use | RECOMMENDED |
Repository Summary
| Description | |
| Checkout URI | https://github.com/nova-utd/navigator.git |
| VCS Type | git |
| VCS Version | dev |
| Last Updated | 2026-08-07 |
| Dev Status | UNKNOWN |
| Released | UNRELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Nova UTD
Authors
navigator_lane_change
Route-aware lane-change and obstacle-bypass behavior module for Navigator.
Runs in shadow mode by default — publishes decisions and debug output with zero vehicle control authority. Execution mode is enabled by a single parameter change once the node has been validated in shadow.
Modes
Shadow mode (default)
The node observes the environment, runs the full decision pipeline, and publishes its intent — but takes no action on the vehicle. Use this to validate behavior in simulation or on a real vehicle before enabling execution.
Set in param/lane_change_params.yaml:
shadow_mode: true
Execution mode
When you are ready to allow the node to actually command lane changes, set:
shadow_mode: false
In execution mode the FSM transitions through to EXECUTE_LANE_CHANGE and the downstream trajectory node (PR 2) picks up the decision from /behavior/lane_change_decision to generate and follow a quintic path. No other code changes are needed — the interface is identical between modes.
Triggering a lane change from another node
Any node in the stack can request a lane change by publishing a single string to:
/behavior/lane_change_command (std_msgs/String)
Valid values: "left", "right", "cancel"
Python example
from std_msgs.msg import String
# In your node's __init__:
self._lc_pub = self.create_publisher(String, '/behavior/lane_change_command', 10)
# Request a right lane change:
msg = String()
msg.data = 'right'
self._lc_pub.publish(msg)
# Request a left lane change:
msg.data = 'left'
self._lc_pub.publish(msg)
# Cancel / abort an in-progress lane change:
msg.data = 'cancel'
self._lc_pub.publish(msg)
Commands take priority over obstacle-triggered lane changes. A command expires automatically after 30 seconds — if the publishing node goes offline, the vehicle will not be left trying to change lanes indefinitely.
From the terminal (testing / manual override)
# Change to right lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'right'"
# Change to left lane
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'left'"
# Cancel
ros2 topic pub --once /behavior/lane_change_command std_msgs/msg/String "data: 'cancel'"
Topics
Subscribed
| Topic | Type | Description |
|---|---|---|
/gnss/odometry |
nav_msgs/Odometry |
Ego position and velocity |
/planning/path |
nav_msgs/Path |
Current planned path |
/objdet3d_tracked |
navigator_msgs/Object3DArray |
Tracked objects from perception |
/intersection_status |
navigator_msgs/IntersectionStatus |
Suppresses lane changes at intersections |
/behavior/lane_change_command |
std_msgs/String |
External lane change request (left, right, cancel) |
Published
| Topic | Type | Description |
|---|---|---|
/behavior/lane_change_state |
std_msgs/String |
Current FSM state name |
/behavior/lane_change_decision |
std_msgs/String |
JSON decision summary (consumed by trajectory node in PR 2) |
/behavior/lane_change_debug |
std_msgs/String |
JSON full debug dump — all inputs, blockers, gap values |
FSM states
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| navigator_msgs | |
| ament_copyright | |
| ament_flake8 | |
| ament_pep257 | |
| rclpy | |
| std_msgs | |
| nav_msgs | |
| geometry_msgs |
System Dependencies
| Name |
|---|
| python3-pytest |