Repository files navigation

[[Monika Nagarajarao]https://github.com/Monika3106/Localization.git)

📌 Table of Contents

🎯 User Stories

  • US-1 – Scenario-Based Feature Validation and Gap Identification in Model City
    Link: Miro – US-1
  • US-2 – OptiTrack Freeze Detection and Fallback Localization
    Link: Miro – US-2
  • US-3 – EKF Prediction and Dead-Reckoning Using Wheel Speed During Fallback
    Link: Miro – US-3
  • US-4 – Wheel-Speed-Based EKF Prediction During OptiTrack Fallback
    Link: Miro – US-4

📖 Overview

The Localization Node helps the shuttle know its current position, direction, velocity and acceleration.

It does this by:

  • Reading motion capture data from /pose_modelcars (OptiTrack, mocap4r2_msgs/msg/RigidBodies).
  • Running an Extended Kalman Filter (CTRA model) to estimate pose, velocity, acceleration and yaw rate.
  • Publishing the filtered state as odometry on /odom.
  • Publishing estimated acceleration on /odom_accel. In case OptiTrack pose data becomes frozen while the vehicle is moving, the node switches to a fallback localization mode. During fallback, wheel speed is used for dead reckoning and EKF prediction-only operation, ensuring continuous odometry output for other modules.

Other modules like Path Planning, Perception Fusion, and V2X use this data to plan routes and share the vehicle state.

🏗️ Component Architecture

Localization Architecture

🧍 Responsible

  • **Component:Localization(localization_kf/localization)
  • Responsible: Monika Nagarajarao

⚙️ Functional Description

  • Implements an Extended Kalman Filter (EKF) with a Constant Turn Rate and Acceleration (CTRA) motion model.

  • State vector: [x, y, yaw, velocity, acceleration, yaw rate].

  • Prediction: integrates the CTRA model (straight and turning cases) using the mocap timestamps.

  • Update: corrects [x, y, yaw] from /pose_modelcars when OptiTrack pose data is valid.

  • OptiTrack Freeze Detection and Fallback Mode
    Detects frozen OptiTrack poses by comparing consecutive /pose_modelcars messages.
    If the pose is frozen while the vehicle is moving, the node switches to fallback localization.

  • Wheel-Speed Dead Reckoning
    During fallback, wheel speed from /ackermann_drive_feedback is used to estimate vehicle motion starting from the last valid OptiTrack pose.

  • Prediction-Only EKF Operation
    While in fallback mode, the EKF runs in prediction-only mode without OptiTrack position updates to maintain internal state continuity.

  • Link: Kalman Filter Design

🔌 ROS 2 Topics

IN/OutTopic NameMessage TypeDescription
Input/pose_modelcarsmocap4r2_msgs/msg/RigidBodiesReal-time pose and orientation data of tracked objects from the OptiTrack system.
Input/ackermann_drive_feedbackAckermannDrive.msgWheel speed input used for EKF prediction and dead-reckoning during OptiTrack fallback.
Output/odomnav_msgs/msg/OdometryVehicle's current position, orientation, velocity and yaw rate.
Output/odom_accelgeometry_msgs/msg/AccelWithCovarianceStampedEstimated linear acceleration (x, y) in the map/base_link frame.

⚙️ Component Functionalities

The Localization Node is responsible for determining the real-time state of the autonomous vehicle using motion capture data.

It performs the following key functions:

  • Subscribes to /pose_modelcars
    Receives motion capture data from the OptiTrack system as mocap4r2_msgs/msg/RigidBodies and selects the configured rigid body (e.g. ID "6") as the ego vehicle.

  • Runs an EKF (CTRA model)
    Estimates the state [x, y, yaw, velocity, acceleration, yaw_rate] using an Extended Kalman Filter.
    This smooths noisy mocap data while keeping the motion physically consistent.

  • Publishes to /odom
    Sends the vehicle’s pose and velocity as nav_msgs/msg/Odometry.
    The pose matches /pose_modelcars (when passthrough is enabled), while velocity and yaw rate come from the EKF + finite differences.

  • Publishes to /odom_accel
    Sends the estimated linear acceleration (x, y) as geometry_msgs/msg/AccelWithCovarianceStamped
    for further analysis and evaluation .

    🚀 Module 6 Improvements

The following improvements were introduced in Module 6:

  • Filtered Acceleration Estimation
    Acceleration is now computed from wheel speed feedback and passed through a low-pass filter to reduce noise and sudden spikes.

  • Velocity Consistency During Fallback Localization
    Vehicle velocity is refined by blending wheel-speed feedback with measured displacement, improving motion consistency during OptiTrack outages.

  • Robust Fallback Localization Handling
    When OptiTrack pose data becomes frozen, the system continues localization using EKF prediction and dead-reckoning without interrupting odometry output.

These improvements increase localization robustness and motion stability during short tracking outages.

📥 Installation & Setup

🔧 Clone the repository

git clone https://git.hs-coburg.de/voyagex/vx_localization.git

Build the package

cd loc_ws
colcon build
source install/setup.bash

Run the node

ros2 run localization_kf localization

🧪 Interface Test Procedure

This section explains how to verify that the **Localization ** works as intended subscribing to OptiTrack mocap data and publishing filtered EKF outputs.

Step-by-Step Test Procedure

  1. Launch the Localization Node

    ros2 run localization_kf localization
  2. Play the Recorded Rosbag File

    ros2 bag play ros2_bag_local_fixed
  3. Verify Incoming MoCap Data

    ros2 topic echo /pose_modelcars
  4. Verify Published Odometry Output

    ros2 topic echo /odom
  5. Verify Wheel Speed Input

    ros2 topic echo /ackermann_drive_feedback
  6. evaluate using plotjuggler

    ros2 run plotjuggler plotjuggler
    

🧪 Feature Test Strategy

The localization feature is validated using a scenario-based test strategy focusing on normal operation, degraded localization, and recovery behavior.

The following scenarios are covered:

  • Normal localization operation using OptiTrack
  • OptiTrack localization loss while the vehicle is moving
  • OptiTrack localization loss while the vehicle is stationary
  • Recovery after OptiTrack localization becomes available again

The tests verify that odometry, velocity, and acceleration outputs remain continuous and stable throughout all scenarios, and that the system automatically switches between normal and fallback localization modes without user intervention.

Detailed test design, scenarios, and KPIs are documented in the Feature Test Strategy.

🧪 Unit and Coverage Testing

This section describes how to run unit tests and measure code coverage for the Localization (EKF).

  1. Run Unit Tests

    cd~/loc_ws/src/localization_kf
    python3 -m pytest -v test/
  2. Run Tests with Coverage

    python3 -m coverage run --source=localization_kf.localization -m pytest test/
    
  3. Show Coverage Report

    python3 -m coverage report -m
  4. Generate HTML Coverage Report

    python3 -m coverage html --directory=src/vx_localization/test/htmlcov

📊 PlotJuggler Evaluation

The EKF localization performance was evaluated under User Story 4.3 using PlotJuggler. Both ideal (stationary) and moving states were tested to analyze smoothness and accuracy of position, velocity, acceleration, and yaw estimation.


1. Position X–Y Comparison

a. Ideal (Stationary)Position Ideal
b. MovingPosition Moving

Comparison between raw mocap data /pose_modelcars and filtered /odom position outputs.
The EKF output (in moving state) is smoother and maintains accurate position alignment.


2. Acceleration X–Y

a. Ideal (Stationary)Acceleration Ideal
b. MovingAcceleration Moving

Shows the estimated acceleration components from /odom_accel.
In ideal state, acceleration remains near zero; in motion, the EKF captures smooth longitudinal and lateral acceleration changes.


3. Odometry Linear Velocity & Orientation (Yaw)

a. Ideal (Stationary)Odom Ideal
b. MovingOdom Moving

Plots /odom.twist.twist.linear.x/y and /odom.pose.pose.orientation.z (yaw ).


About

ROS 2 EKF-based vehicle localization using a CTRA motion model with OptiTrack integration and fallback dead-reckoning.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

[[Monika Nagarajarao]https://github.com/Monika3106/Localization.git)

📌 Table of Contents

🎯 User Stories

  • US-1 – Scenario-Based Feature Validation and Gap Identification in Model City
    Link: Miro – US-1
  • US-2 – OptiTrack Freeze Detection and Fallback Localization
    Link: Miro – US-2
  • US-3 – EKF Prediction and Dead-Reckoning Using Wheel Speed During Fallback
    Link: Miro – US-3
  • US-4 – Wheel-Speed-Based EKF Prediction During OptiTrack Fallback
    Link: Miro – US-4

📖 Overview

The Localization Node helps the shuttle know its current position, direction, velocity and acceleration.

It does this by:

  • Reading motion capture data from /pose_modelcars (OptiTrack, mocap4r2_msgs/msg/RigidBodies).
  • Running an Extended Kalman Filter (CTRA model) to estimate pose, velocity, acceleration and yaw rate.
  • Publishing the filtered state as odometry on /odom.
  • Publishing estimated acceleration on /odom_accel. In case OptiTrack pose data becomes frozen while the vehicle is moving, the node switches to a fallback localization mode. During fallback, wheel speed is used for dead reckoning and EKF prediction-only operation, ensuring continuous odometry output for other modules.

Other modules like Path Planning, Perception Fusion, and V2X use this data to plan routes and share the vehicle state.

🏗️ Component Architecture

Localization Architecture

🧍 Responsible

  • **Component:Localization(localization_kf/localization)
  • Responsible: Monika Nagarajarao

⚙️ Functional Description

  • Implements an Extended Kalman Filter (EKF) with a Constant Turn Rate and Acceleration (CTRA) motion model.

  • State vector: [x, y, yaw, velocity, acceleration, yaw rate].

  • Prediction: integrates the CTRA model (straight and turning cases) using the mocap timestamps.

  • Update: corrects [x, y, yaw] from /pose_modelcars when OptiTrack pose data is valid.

  • OptiTrack Freeze Detection and Fallback Mode
    Detects frozen OptiTrack poses by comparing consecutive /pose_modelcars messages.
    If the pose is frozen while the vehicle is moving, the node switches to fallback localization.

  • Wheel-Speed Dead Reckoning
    During fallback, wheel speed from /ackermann_drive_feedback is used to estimate vehicle motion starting from the last valid OptiTrack pose.

  • Prediction-Only EKF Operation
    While in fallback mode, the EKF runs in prediction-only mode without OptiTrack position updates to maintain internal state continuity.

  • Link: Kalman Filter Design

🔌 ROS 2 Topics

IN/OutTopic NameMessage TypeDescription
Input/pose_modelcarsmocap4r2_msgs/msg/RigidBodiesReal-time pose and orientation data of tracked objects from the OptiTrack system.
Input/ackermann_drive_feedbackAckermannDrive.msgWheel speed input used for EKF prediction and dead-reckoning during OptiTrack fallback.
Output/odomnav_msgs/msg/OdometryVehicle's current position, orientation, velocity and yaw rate.
Output/odom_accelgeometry_msgs/msg/AccelWithCovarianceStampedEstimated linear acceleration (x, y) in the map/base_link frame.

⚙️ Component Functionalities

The Localization Node is responsible for determining the real-time state of the autonomous vehicle using motion capture data.

It performs the following key functions:

  • Subscribes to /pose_modelcars
    Receives motion capture data from the OptiTrack system as mocap4r2_msgs/msg/RigidBodies and selects the configured rigid body (e.g. ID "6") as the ego vehicle.

  • Runs an EKF (CTRA model)
    Estimates the state [x, y, yaw, velocity, acceleration, yaw_rate] using an Extended Kalman Filter.
    This smooths noisy mocap data while keeping the motion physically consistent.

  • Publishes to /odom
    Sends the vehicle’s pose and velocity as nav_msgs/msg/Odometry.
    The pose matches /pose_modelcars (when passthrough is enabled), while velocity and yaw rate come from the EKF + finite differences.

  • Publishes to /odom_accel
    Sends the estimated linear acceleration (x, y) as geometry_msgs/msg/AccelWithCovarianceStamped
    for further analysis and evaluation .

    🚀 Module 6 Improvements

The following improvements were introduced in Module 6:

  • Filtered Acceleration Estimation
    Acceleration is now computed from wheel speed feedback and passed through a low-pass filter to reduce noise and sudden spikes.

  • Velocity Consistency During Fallback Localization
    Vehicle velocity is refined by blending wheel-speed feedback with measured displacement, improving motion consistency during OptiTrack outages.

  • Robust Fallback Localization Handling
    When OptiTrack pose data becomes frozen, the system continues localization using EKF prediction and dead-reckoning without interrupting odometry output.

These improvements increase localization robustness and motion stability during short tracking outages.

📥 Installation & Setup

🔧 Clone the repository

git clone https://git.hs-coburg.de/voyagex/vx_localization.git

Build the package

cd loc_ws
colcon build
source install/setup.bash

Run the node

ros2 run localization_kf localization

🧪 Interface Test Procedure

This section explains how to verify that the **Localization ** works as intended subscribing to OptiTrack mocap data and publishing filtered EKF outputs.

Step-by-Step Test Procedure

  1. Launch the Localization Node

    ros2 run localization_kf localization
  2. Play the Recorded Rosbag File

    ros2 bag play ros2_bag_local_fixed
  3. Verify Incoming MoCap Data

    ros2 topic echo /pose_modelcars
  4. Verify Published Odometry Output

    ros2 topic echo /odom
  5. Verify Wheel Speed Input

    ros2 topic echo /ackermann_drive_feedback
  6. evaluate using plotjuggler

    ros2 run plotjuggler plotjuggler
    

🧪 Feature Test Strategy

The localization feature is validated using a scenario-based test strategy focusing on normal operation, degraded localization, and recovery behavior.

The following scenarios are covered:

  • Normal localization operation using OptiTrack
  • OptiTrack localization loss while the vehicle is moving
  • OptiTrack localization loss while the vehicle is stationary
  • Recovery after OptiTrack localization becomes available again

The tests verify that odometry, velocity, and acceleration outputs remain continuous and stable throughout all scenarios, and that the system automatically switches between normal and fallback localization modes without user intervention.

Detailed test design, scenarios, and KPIs are documented in the Feature Test Strategy.

🧪 Unit and Coverage Testing

This section describes how to run unit tests and measure code coverage for the Localization (EKF).

  1. Run Unit Tests

    cd~/loc_ws/src/localization_kf
    python3 -m pytest -v test/
  2. Run Tests with Coverage

    python3 -m coverage run --source=localization_kf.localization -m pytest test/
    
  3. Show Coverage Report

    python3 -m coverage report -m
  4. Generate HTML Coverage Report

    python3 -m coverage html --directory=src/vx_localization/test/htmlcov

📊 PlotJuggler Evaluation

The EKF localization performance was evaluated under User Story 4.3 using PlotJuggler. Both ideal (stationary) and moving states were tested to analyze smoothness and accuracy of position, velocity, acceleration, and yaw estimation.


1. Position X–Y Comparison

a. Ideal (Stationary)Position Ideal
b. MovingPosition Moving

Comparison between raw mocap data /pose_modelcars and filtered /odom position outputs.
The EKF output (in moving state) is smoother and maintains accurate position alignment.


2. Acceleration X–Y

a. Ideal (Stationary)Acceleration Ideal
b. MovingAcceleration Moving

Shows the estimated acceleration components from /odom_accel.
In ideal state, acceleration remains near zero; in motion, the EKF captures smooth longitudinal and lateral acceleration changes.


3. Odometry Linear Velocity & Orientation (Yaw)

a. Ideal (Stationary)Odom Ideal
b. MovingOdom Moving

Plots /odom.twist.twist.linear.x/y and /odom.pose.pose.orientation.z (yaw ).


About

ROS 2 EKF-based vehicle localization using a CTRA motion model with OptiTrack integration and fallback dead-reckoning.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

[[Monika Nagarajarao]https://github.com/Monika3106/Localization.git)

📌 Table of Contents

🎯 User Stories

  • US-1 – Scenario-Based Feature Validation and Gap Identification in Model City
    Link: Miro – US-1
  • US-2 – OptiTrack Freeze Detection and Fallback Localization
    Link: Miro – US-2
  • US-3 – EKF Prediction and Dead-Reckoning Using Wheel Speed During Fallback
    Link: Miro – US-3
  • US-4 – Wheel-Speed-Based EKF Prediction During OptiTrack Fallback
    Link: Miro – US-4

📖 Overview

The Localization Node helps the shuttle know its current position, direction, velocity and acceleration.

It does this by:

  • Reading motion capture data from /pose_modelcars (OptiTrack, mocap4r2_msgs/msg/RigidBodies).
  • Running an Extended Kalman Filter (CTRA model) to estimate pose, velocity, acceleration and yaw rate.
  • Publishing the filtered state as odometry on /odom.
  • Publishing estimated acceleration on /odom_accel. In case OptiTrack pose data becomes frozen while the vehicle is moving, the node switches to a fallback localization mode. During fallback, wheel speed is used for dead reckoning and EKF prediction-only operation, ensuring continuous odometry output for other modules.

Other modules like Path Planning, Perception Fusion, and V2X use this data to plan routes and share the vehicle state.

🏗️ Component Architecture

Localization Architecture

🧍 Responsible

  • **Component:Localization(localization_kf/localization)
  • Responsible: Monika Nagarajarao

⚙️ Functional Description

  • Implements an Extended Kalman Filter (EKF) with a Constant Turn Rate and Acceleration (CTRA) motion model.

  • State vector: [x, y, yaw, velocity, acceleration, yaw rate].

  • Prediction: integrates the CTRA model (straight and turning cases) using the mocap timestamps.

  • Update: corrects [x, y, yaw] from /pose_modelcars when OptiTrack pose data is valid.

  • OptiTrack Freeze Detection and Fallback Mode
    Detects frozen OptiTrack poses by comparing consecutive /pose_modelcars messages.
    If the pose is frozen while the vehicle is moving, the node switches to fallback localization.

  • Wheel-Speed Dead Reckoning
    During fallback, wheel speed from /ackermann_drive_feedback is used to estimate vehicle motion starting from the last valid OptiTrack pose.

  • Prediction-Only EKF Operation
    While in fallback mode, the EKF runs in prediction-only mode without OptiTrack position updates to maintain internal state continuity.

  • Link: Kalman Filter Design

🔌 ROS 2 Topics

IN/OutTopic NameMessage TypeDescription
Input/pose_modelcarsmocap4r2_msgs/msg/RigidBodiesReal-time pose and orientation data of tracked objects from the OptiTrack system.
Input/ackermann_drive_feedbackAckermannDrive.msgWheel speed input used for EKF prediction and dead-reckoning during OptiTrack fallback.
Output/odomnav_msgs/msg/OdometryVehicle's current position, orientation, velocity and yaw rate.
Output/odom_accelgeometry_msgs/msg/AccelWithCovarianceStampedEstimated linear acceleration (x, y) in the map/base_link frame.

⚙️ Component Functionalities

The Localization Node is responsible for determining the real-time state of the autonomous vehicle using motion capture data.

It performs the following key functions:

  • Subscribes to /pose_modelcars
    Receives motion capture data from the OptiTrack system as mocap4r2_msgs/msg/RigidBodies and selects the configured rigid body (e.g. ID "6") as the ego vehicle.

  • Runs an EKF (CTRA model)
    Estimates the state [x, y, yaw, velocity, acceleration, yaw_rate] using an Extended Kalman Filter.
    This smooths noisy mocap data while keeping the motion physically consistent.

  • Publishes to /odom
    Sends the vehicle’s pose and velocity as nav_msgs/msg/Odometry.
    The pose matches /pose_modelcars (when passthrough is enabled), while velocity and yaw rate come from the EKF + finite differences.

  • Publishes to /odom_accel
    Sends the estimated linear acceleration (x, y) as geometry_msgs/msg/AccelWithCovarianceStamped
    for further analysis and evaluation .

    🚀 Module 6 Improvements

The following improvements were introduced in Module 6:

  • Filtered Acceleration Estimation
    Acceleration is now computed from wheel speed feedback and passed through a low-pass filter to reduce noise and sudden spikes.

  • Velocity Consistency During Fallback Localization
    Vehicle velocity is refined by blending wheel-speed feedback with measured displacement, improving motion consistency during OptiTrack outages.

  • Robust Fallback Localization Handling
    When OptiTrack pose data becomes frozen, the system continues localization using EKF prediction and dead-reckoning without interrupting odometry output.

These improvements increase localization robustness and motion stability during short tracking outages.

📥 Installation & Setup

🔧 Clone the repository

git clone https://git.hs-coburg.de/voyagex/vx_localization.git

Build the package

cd loc_ws
colcon build
source install/setup.bash

Run the node

ros2 run localization_kf localization

🧪 Interface Test Procedure

This section explains how to verify that the **Localization ** works as intended subscribing to OptiTrack mocap data and publishing filtered EKF outputs.

Step-by-Step Test Procedure

  1. Launch the Localization Node

    ros2 run localization_kf localization
  2. Play the Recorded Rosbag File

    ros2 bag play ros2_bag_local_fixed
  3. Verify Incoming MoCap Data

    ros2 topic echo /pose_modelcars
  4. Verify Published Odometry Output

    ros2 topic echo /odom
  5. Verify Wheel Speed Input

    ros2 topic echo /ackermann_drive_feedback
  6. evaluate using plotjuggler

    ros2 run plotjuggler plotjuggler
    

🧪 Feature Test Strategy

The localization feature is validated using a scenario-based test strategy focusing on normal operation, degraded localization, and recovery behavior.

The following scenarios are covered:

  • Normal localization operation using OptiTrack
  • OptiTrack localization loss while the vehicle is moving
  • OptiTrack localization loss while the vehicle is stationary
  • Recovery after OptiTrack localization becomes available again

The tests verify that odometry, velocity, and acceleration outputs remain continuous and stable throughout all scenarios, and that the system automatically switches between normal and fallback localization modes without user intervention.

Detailed test design, scenarios, and KPIs are documented in the Feature Test Strategy.

🧪 Unit and Coverage Testing

This section describes how to run unit tests and measure code coverage for the Localization (EKF).

  1. Run Unit Tests

    cd~/loc_ws/src/localization_kf
    python3 -m pytest -v test/
  2. Run Tests with Coverage

    python3 -m coverage run --source=localization_kf.localization -m pytest test/
    
  3. Show Coverage Report

    python3 -m coverage report -m
  4. Generate HTML Coverage Report

    python3 -m coverage html --directory=src/vx_localization/test/htmlcov

📊 PlotJuggler Evaluation

The EKF localization performance was evaluated under User Story 4.3 using PlotJuggler. Both ideal (stationary) and moving states were tested to analyze smoothness and accuracy of position, velocity, acceleration, and yaw estimation.


1. Position X–Y Comparison

a. Ideal (Stationary)Position Ideal
b. MovingPosition Moving

Comparison between raw mocap data /pose_modelcars and filtered /odom position outputs.
The EKF output (in moving state) is smoother and maintains accurate position alignment.


2. Acceleration X–Y

a. Ideal (Stationary)Acceleration Ideal
b. MovingAcceleration Moving

Shows the estimated acceleration components from /odom_accel.
In ideal state, acceleration remains near zero; in motion, the EKF captures smooth longitudinal and lateral acceleration changes.


3. Odometry Linear Velocity & Orientation (Yaw)

a. Ideal (Stationary)Odom Ideal
b. MovingOdom Moving

Plots /odom.twist.twist.linear.x/y and /odom.pose.pose.orientation.z (yaw ).


About

ROS 2 EKF-based vehicle localization using a CTRA motion model with OptiTrack integration and fallback dead-reckoning.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

[[Monika Nagarajarao]https://github.com/Monika3106/Localization.git)

📌 Table of Contents

🎯 User Stories

  • US-1 – Scenario-Based Feature Validation and Gap Identification in Model City
    Link: Miro – US-1
  • US-2 – OptiTrack Freeze Detection and Fallback Localization
    Link: Miro – US-2
  • US-3 – EKF Prediction and Dead-Reckoning Using Wheel Speed During Fallback
    Link: Miro – US-3
  • US-4 – Wheel-Speed-Based EKF Prediction During OptiTrack Fallback
    Link: Miro – US-4

📖 Overview

The Localization Node helps the shuttle know its current position, direction, velocity and acceleration.

It does this by:

  • Reading motion capture data from /pose_modelcars (OptiTrack, mocap4r2_msgs/msg/RigidBodies).
  • Running an Extended Kalman Filter (CTRA model) to estimate pose, velocity, acceleration and yaw rate.
  • Publishing the filtered state as odometry on /odom.
  • Publishing estimated acceleration on /odom_accel. In case OptiTrack pose data becomes frozen while the vehicle is moving, the node switches to a fallback localization mode. During fallback, wheel speed is used for dead reckoning and EKF prediction-only operation, ensuring continuous odometry output for other modules.

Other modules like Path Planning, Perception Fusion, and V2X use this data to plan routes and share the vehicle state.

🏗️ Component Architecture

Localization Architecture

🧍 Responsible

  • **Component:Localization(localization_kf/localization)
  • Responsible: Monika Nagarajarao

⚙️ Functional Description

  • Implements an Extended Kalman Filter (EKF) with a Constant Turn Rate and Acceleration (CTRA) motion model.

  • State vector: [x, y, yaw, velocity, acceleration, yaw rate].

  • Prediction: integrates the CTRA model (straight and turning cases) using the mocap timestamps.

  • Update: corrects [x, y, yaw] from /pose_modelcars when OptiTrack pose data is valid.

  • OptiTrack Freeze Detection and Fallback Mode
    Detects frozen OptiTrack poses by comparing consecutive /pose_modelcars messages.
    If the pose is frozen while the vehicle is moving, the node switches to fallback localization.

  • Wheel-Speed Dead Reckoning
    During fallback, wheel speed from /ackermann_drive_feedback is used to estimate vehicle motion starting from the last valid OptiTrack pose.

  • Prediction-Only EKF Operation
    While in fallback mode, the EKF runs in prediction-only mode without OptiTrack position updates to maintain internal state continuity.

  • Link: Kalman Filter Design

🔌 ROS 2 Topics

IN/OutTopic NameMessage TypeDescription
Input/pose_modelcarsmocap4r2_msgs/msg/RigidBodiesReal-time pose and orientation data of tracked objects from the OptiTrack system.
Input/ackermann_drive_feedbackAckermannDrive.msgWheel speed input used for EKF prediction and dead-reckoning during OptiTrack fallback.
Output/odomnav_msgs/msg/OdometryVehicle's current position, orientation, velocity and yaw rate.
Output/odom_accelgeometry_msgs/msg/AccelWithCovarianceStampedEstimated linear acceleration (x, y) in the map/base_link frame.

⚙️ Component Functionalities

The Localization Node is responsible for determining the real-time state of the autonomous vehicle using motion capture data.

It performs the following key functions:

  • Subscribes to /pose_modelcars
    Receives motion capture data from the OptiTrack system as mocap4r2_msgs/msg/RigidBodies and selects the configured rigid body (e.g. ID "6") as the ego vehicle.

  • Runs an EKF (CTRA model)
    Estimates the state [x, y, yaw, velocity, acceleration, yaw_rate] using an Extended Kalman Filter.
    This smooths noisy mocap data while keeping the motion physically consistent.

  • Publishes to /odom
    Sends the vehicle’s pose and velocity as nav_msgs/msg/Odometry.
    The pose matches /pose_modelcars (when passthrough is enabled), while velocity and yaw rate come from the EKF + finite differences.

  • Publishes to /odom_accel
    Sends the estimated linear acceleration (x, y) as geometry_msgs/msg/AccelWithCovarianceStamped
    for further analysis and evaluation .

    🚀 Module 6 Improvements

The following improvements were introduced in Module 6:

  • Filtered Acceleration Estimation
    Acceleration is now computed from wheel speed feedback and passed through a low-pass filter to reduce noise and sudden spikes.

  • Velocity Consistency During Fallback Localization
    Vehicle velocity is refined by blending wheel-speed feedback with measured displacement, improving motion consistency during OptiTrack outages.

  • Robust Fallback Localization Handling
    When OptiTrack pose data becomes frozen, the system continues localization using EKF prediction and dead-reckoning without interrupting odometry output.

These improvements increase localization robustness and motion stability during short tracking outages.

📥 Installation & Setup

🔧 Clone the repository

git clone https://git.hs-coburg.de/voyagex/vx_localization.git

Build the package

cd loc_ws
colcon build
source install/setup.bash

Run the node

ros2 run localization_kf localization

🧪 Interface Test Procedure

This section explains how to verify that the **Localization ** works as intended subscribing to OptiTrack mocap data and publishing filtered EKF outputs.

Step-by-Step Test Procedure

  1. Launch the Localization Node

    ros2 run localization_kf localization
  2. Play the Recorded Rosbag File

    ros2 bag play ros2_bag_local_fixed
  3. Verify Incoming MoCap Data

    ros2 topic echo /pose_modelcars
  4. Verify Published Odometry Output

    ros2 topic echo /odom
  5. Verify Wheel Speed Input

    ros2 topic echo /ackermann_drive_feedback
  6. evaluate using plotjuggler

    ros2 run plotjuggler plotjuggler
    

🧪 Feature Test Strategy

The localization feature is validated using a scenario-based test strategy focusing on normal operation, degraded localization, and recovery behavior.

The following scenarios are covered:

  • Normal localization operation using OptiTrack
  • OptiTrack localization loss while the vehicle is moving
  • OptiTrack localization loss while the vehicle is stationary
  • Recovery after OptiTrack localization becomes available again

The tests verify that odometry, velocity, and acceleration outputs remain continuous and stable throughout all scenarios, and that the system automatically switches between normal and fallback localization modes without user intervention.

Detailed test design, scenarios, and KPIs are documented in the Feature Test Strategy.

🧪 Unit and Coverage Testing

This section describes how to run unit tests and measure code coverage for the Localization (EKF).

  1. Run Unit Tests

    cd~/loc_ws/src/localization_kf
    python3 -m pytest -v test/
  2. Run Tests with Coverage

    python3 -m coverage run --source=localization_kf.localization -m pytest test/
    
  3. Show Coverage Report

    python3 -m coverage report -m
  4. Generate HTML Coverage Report

    python3 -m coverage html --directory=src/vx_localization/test/htmlcov

📊 PlotJuggler Evaluation

The EKF localization performance was evaluated under User Story 4.3 using PlotJuggler. Both ideal (stationary) and moving states were tested to analyze smoothness and accuracy of position, velocity, acceleration, and yaw estimation.


1. Position X–Y Comparison

a. Ideal (Stationary)Position Ideal
b. MovingPosition Moving

Comparison between raw mocap data /pose_modelcars and filtered /odom position outputs.
The EKF output (in moving state) is smoother and maintains accurate position alignment.


2. Acceleration X–Y

a. Ideal (Stationary)Acceleration Ideal
b. MovingAcceleration Moving

Shows the estimated acceleration components from /odom_accel.
In ideal state, acceleration remains near zero; in motion, the EKF captures smooth longitudinal and lateral acceleration changes.


3. Odometry Linear Velocity & Orientation (Yaw)

a. Ideal (Stationary)Odom Ideal
b. MovingOdom Moving

Plots /odom.twist.twist.linear.x/y and /odom.pose.pose.orientation.z (yaw ).


About

ROS 2 EKF-based vehicle localization using a CTRA motion model with OptiTrack integration and fallback dead-reckoning.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

[[Monika Nagarajarao]https://github.com/Monika3106/Localization.git)

📌 Table of Contents

🎯 User Stories

  • US-1 – Scenario-Based Feature Validation and Gap Identification in Model City
    Link: Miro – US-1
  • US-2 – OptiTrack Freeze Detection and Fallback Localization
    Link: Miro – US-2
  • US-3 – EKF Prediction and Dead-Reckoning Using Wheel Speed During Fallback
    Link: Miro – US-3
  • US-4 – Wheel-Speed-Based EKF Prediction During OptiTrack Fallback
    Link: Miro – US-4

📖 Overview

The Localization Node helps the shuttle know its current position, direction, velocity and acceleration.

It does this by:

  • Reading motion capture data from /pose_modelcars (OptiTrack, mocap4r2_msgs/msg/RigidBodies).
  • Running an Extended Kalman Filter (CTRA model) to estimate pose, velocity, acceleration and yaw rate.
  • Publishing the filtered state as odometry on /odom.
  • Publishing estimated acceleration on /odom_accel. In case OptiTrack pose data becomes frozen while the vehicle is moving, the node switches to a fallback localization mode. During fallback, wheel speed is used for dead reckoning and EKF prediction-only operation, ensuring continuous odometry output for other modules.

Other modules like Path Planning, Perception Fusion, and V2X use this data to plan routes and share the vehicle state.

🏗️ Component Architecture

Localization Architecture

🧍 Responsible

  • **Component:Localization(localization_kf/localization)
  • Responsible: Monika Nagarajarao

⚙️ Functional Description

  • Implements an Extended Kalman Filter (EKF) with a Constant Turn Rate and Acceleration (CTRA) motion model.

  • State vector: [x, y, yaw, velocity, acceleration, yaw rate].

  • Prediction: integrates the CTRA model (straight and turning cases) using the mocap timestamps.

  • Update: corrects [x, y, yaw] from /pose_modelcars when OptiTrack pose data is valid.

  • OptiTrack Freeze Detection and Fallback Mode
    Detects frozen OptiTrack poses by comparing consecutive /pose_modelcars messages.
    If the pose is frozen while the vehicle is moving, the node switches to fallback localization.

  • Wheel-Speed Dead Reckoning
    During fallback, wheel speed from /ackermann_drive_feedback is used to estimate vehicle motion starting from the last valid OptiTrack pose.

  • Prediction-Only EKF Operation
    While in fallback mode, the EKF runs in prediction-only mode without OptiTrack position updates to maintain internal state continuity.

  • Link: Kalman Filter Design

🔌 ROS 2 Topics

IN/OutTopic NameMessage TypeDescription
Input/pose_modelcarsmocap4r2_msgs/msg/RigidBodiesReal-time pose and orientation data of tracked objects from the OptiTrack system.
Input/ackermann_drive_feedbackAckermannDrive.msgWheel speed input used for EKF prediction and dead-reckoning during OptiTrack fallback.
Output/odomnav_msgs/msg/OdometryVehicle's current position, orientation, velocity and yaw rate.
Output/odom_accelgeometry_msgs/msg/AccelWithCovarianceStampedEstimated linear acceleration (x, y) in the map/base_link frame.

⚙️ Component Functionalities

The Localization Node is responsible for determining the real-time state of the autonomous vehicle using motion capture data.

It performs the following key functions:

  • Subscribes to /pose_modelcars
    Receives motion capture data from the OptiTrack system as mocap4r2_msgs/msg/RigidBodies and selects the configured rigid body (e.g. ID "6") as the ego vehicle.

  • Runs an EKF (CTRA model)
    Estimates the state [x, y, yaw, velocity, acceleration, yaw_rate] using an Extended Kalman Filter.
    This smooths noisy mocap data while keeping the motion physically consistent.

  • Publishes to /odom
    Sends the vehicle’s pose and velocity as nav_msgs/msg/Odometry.
    The pose matches /pose_modelcars (when passthrough is enabled), while velocity and yaw rate come from the EKF + finite differences.

  • Publishes to /odom_accel
    Sends the estimated linear acceleration (x, y) as geometry_msgs/msg/AccelWithCovarianceStamped
    for further analysis and evaluation .

    🚀 Module 6 Improvements

The following improvements were introduced in Module 6:

  • Filtered Acceleration Estimation
    Acceleration is now computed from wheel speed feedback and passed through a low-pass filter to reduce noise and sudden spikes.

  • Velocity Consistency During Fallback Localization
    Vehicle velocity is refined by blending wheel-speed feedback with measured displacement, improving motion consistency during OptiTrack outages.

  • Robust Fallback Localization Handling
    When OptiTrack pose data becomes frozen, the system continues localization using EKF prediction and dead-reckoning without interrupting odometry output.

These improvements increase localization robustness and motion stability during short tracking outages.

📥 Installation & Setup

🔧 Clone the repository

git clone https://git.hs-coburg.de/voyagex/vx_localization.git

Build the package

cd loc_ws
colcon build
source install/setup.bash

Run the node

ros2 run localization_kf localization

🧪 Interface Test Procedure

This section explains how to verify that the **Localization ** works as intended subscribing to OptiTrack mocap data and publishing filtered EKF outputs.

Step-by-Step Test Procedure

  1. Launch the Localization Node

    ros2 run localization_kf localization
  2. Play the Recorded Rosbag File

    ros2 bag play ros2_bag_local_fixed
  3. Verify Incoming MoCap Data

    ros2 topic echo /pose_modelcars
  4. Verify Published Odometry Output

    ros2 topic echo /odom
  5. Verify Wheel Speed Input

    ros2 topic echo /ackermann_drive_feedback
  6. evaluate using plotjuggler

    ros2 run plotjuggler plotjuggler
    

🧪 Feature Test Strategy

The localization feature is validated using a scenario-based test strategy focusing on normal operation, degraded localization, and recovery behavior.

The following scenarios are covered:

  • Normal localization operation using OptiTrack
  • OptiTrack localization loss while the vehicle is moving
  • OptiTrack localization loss while the vehicle is stationary
  • Recovery after OptiTrack localization becomes available again

The tests verify that odometry, velocity, and acceleration outputs remain continuous and stable throughout all scenarios, and that the system automatically switches between normal and fallback localization modes without user intervention.

Detailed test design, scenarios, and KPIs are documented in the Feature Test Strategy.

🧪 Unit and Coverage Testing

This section describes how to run unit tests and measure code coverage for the Localization (EKF).

  1. Run Unit Tests

    cd~/loc_ws/src/localization_kf
    python3 -m pytest -v test/
  2. Run Tests with Coverage

    python3 -m coverage run --source=localization_kf.localization -m pytest test/
    
  3. Show Coverage Report

    python3 -m coverage report -m
  4. Generate HTML Coverage Report

    python3 -m coverage html --directory=src/vx_localization/test/htmlcov

📊 PlotJuggler Evaluation

The EKF localization performance was evaluated under User Story 4.3 using PlotJuggler. Both ideal (stationary) and moving states were tested to analyze smoothness and accuracy of position, velocity, acceleration, and yaw estimation.


1. Position X–Y Comparison

a. Ideal (Stationary)Position Ideal
b. MovingPosition Moving

Comparison between raw mocap data /pose_modelcars and filtered /odom position outputs.
The EKF output (in moving state) is smoother and maintains accurate position alignment.


2. Acceleration X–Y

a. Ideal (Stationary)Acceleration Ideal
b. MovingAcceleration Moving

Shows the estimated acceleration components from /odom_accel.
In ideal state, acceleration remains near zero; in motion, the EKF captures smooth longitudinal and lateral acceleration changes.


3. Odometry Linear Velocity & Orientation (Yaw)

a. Ideal (Stationary)Odom Ideal
b. MovingOdom Moving

Plots /odom.twist.twist.linear.x/y and /odom.pose.pose.orientation.z (yaw ).


About

ROS 2 EKF-based vehicle localization using a CTRA motion model with OptiTrack integration and fallback dead-reckoning.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

[[Monika Nagarajarao]https://github.com/Monika3106/Localization.git)

📌 Table of Contents

🎯 User Stories

  • US-1 – Scenario-Based Feature Validation and Gap Identification in Model City
    Link: Miro – US-1
  • US-2 – OptiTrack Freeze Detection and Fallback Localization
    Link: Miro – US-2
  • US-3 – EKF Prediction and Dead-Reckoning Using Wheel Speed During Fallback
    Link: Miro – US-3
  • US-4 – Wheel-Speed-Based EKF Prediction During OptiTrack Fallback
    Link: Miro – US-4

📖 Overview

The Localization Node helps the shuttle know its current position, direction, velocity and acceleration.

It does this by:

  • Reading motion capture data from /pose_modelcars (OptiTrack, mocap4r2_msgs/msg/RigidBodies).
  • Running an Extended Kalman Filter (CTRA model) to estimate pose, velocity, acceleration and yaw rate.
  • Publishing the filtered state as odometry on /odom.
  • Publishing estimated acceleration on /odom_accel. In case OptiTrack pose data becomes frozen while the vehicle is moving, the node switches to a fallback localization mode. During fallback, wheel speed is used for dead reckoning and EKF prediction-only operation, ensuring continuous odometry output for other modules.

Other modules like Path Planning, Perception Fusion, and V2X use this data to plan routes and share the vehicle state.

🏗️ Component Architecture

Localization Architecture

🧍 Responsible

  • **Component:Localization(localization_kf/localization)
  • Responsible: Monika Nagarajarao

⚙️ Functional Description

  • Implements an Extended Kalman Filter (EKF) with a Constant Turn Rate and Acceleration (CTRA) motion model.

  • State vector: [x, y, yaw, velocity, acceleration, yaw rate].

  • Prediction: integrates the CTRA model (straight and turning cases) using the mocap timestamps.

  • Update: corrects [x, y, yaw] from /pose_modelcars when OptiTrack pose data is valid.

  • OptiTrack Freeze Detection and Fallback Mode
    Detects frozen OptiTrack poses by comparing consecutive /pose_modelcars messages.
    If the pose is frozen while the vehicle is moving, the node switches to fallback localization.

  • Wheel-Speed Dead Reckoning
    During fallback, wheel speed from /ackermann_drive_feedback is used to estimate vehicle motion starting from the last valid OptiTrack pose.

  • Prediction-Only EKF Operation
    While in fallback mode, the EKF runs in prediction-only mode without OptiTrack position updates to maintain internal state continuity.

  • Link: Kalman Filter Design

🔌 ROS 2 Topics

IN/OutTopic NameMessage TypeDescription
Input/pose_modelcarsmocap4r2_msgs/msg/RigidBodiesReal-time pose and orientation data of tracked objects from the OptiTrack system.
Input/ackermann_drive_feedbackAckermannDrive.msgWheel speed input used for EKF prediction and dead-reckoning during OptiTrack fallback.
Output/odomnav_msgs/msg/OdometryVehicle's current position, orientation, velocity and yaw rate.
Output/odom_accelgeometry_msgs/msg/AccelWithCovarianceStampedEstimated linear acceleration (x, y) in the map/base_link frame.

⚙️ Component Functionalities

The Localization Node is responsible for determining the real-time state of the autonomous vehicle using motion capture data.

It performs the following key functions:

  • Subscribes to /pose_modelcars
    Receives motion capture data from the OptiTrack system as mocap4r2_msgs/msg/RigidBodies and selects the configured rigid body (e.g. ID "6") as the ego vehicle.

  • Runs an EKF (CTRA model)
    Estimates the state [x, y, yaw, velocity, acceleration, yaw_rate] using an Extended Kalman Filter.
    This smooths noisy mocap data while keeping the motion physically consistent.

  • Publishes to /odom
    Sends the vehicle’s pose and velocity as nav_msgs/msg/Odometry.
    The pose matches /pose_modelcars (when passthrough is enabled), while velocity and yaw rate come from the EKF + finite differences.

  • Publishes to /odom_accel
    Sends the estimated linear acceleration (x, y) as geometry_msgs/msg/AccelWithCovarianceStamped
    for further analysis and evaluation .

    🚀 Module 6 Improvements

The following improvements were introduced in Module 6:

  • Filtered Acceleration Estimation
    Acceleration is now computed from wheel speed feedback and passed through a low-pass filter to reduce noise and sudden spikes.

  • Velocity Consistency During Fallback Localization
    Vehicle velocity is refined by blending wheel-speed feedback with measured displacement, improving motion consistency during OptiTrack outages.

  • Robust Fallback Localization Handling
    When OptiTrack pose data becomes frozen, the system continues localization using EKF prediction and dead-reckoning without interrupting odometry output.

These improvements increase localization robustness and motion stability during short tracking outages.

📥 Installation & Setup

🔧 Clone the repository

git clone https://git.hs-coburg.de/voyagex/vx_localization.git

Build the package

cd loc_ws
colcon build
source install/setup.bash

Run the node

ros2 run localization_kf localization

🧪 Interface Test Procedure

This section explains how to verify that the **Localization ** works as intended subscribing to OptiTrack mocap data and publishing filtered EKF outputs.

Step-by-Step Test Procedure

  1. Launch the Localization Node

    ros2 run localization_kf localization
  2. Play the Recorded Rosbag File

    ros2 bag play ros2_bag_local_fixed
  3. Verify Incoming MoCap Data

    ros2 topic echo /pose_modelcars
  4. Verify Published Odometry Output

    ros2 topic echo /odom
  5. Verify Wheel Speed Input

    ros2 topic echo /ackermann_drive_feedback
  6. evaluate using plotjuggler

    ros2 run plotjuggler plotjuggler
    

🧪 Feature Test Strategy

The localization feature is validated using a scenario-based test strategy focusing on normal operation, degraded localization, and recovery behavior.

The following scenarios are covered:

  • Normal localization operation using OptiTrack
  • OptiTrack localization loss while the vehicle is moving
  • OptiTrack localization loss while the vehicle is stationary
  • Recovery after OptiTrack localization becomes available again

The tests verify that odometry, velocity, and acceleration outputs remain continuous and stable throughout all scenarios, and that the system automatically switches between normal and fallback localization modes without user intervention.

Detailed test design, scenarios, and KPIs are documented in the Feature Test Strategy.

🧪 Unit and Coverage Testing

This section describes how to run unit tests and measure code coverage for the Localization (EKF).

  1. Run Unit Tests

    cd~/loc_ws/src/localization_kf
    python3 -m pytest -v test/
  2. Run Tests with Coverage

    python3 -m coverage run --source=localization_kf.localization -m pytest test/
    
  3. Show Coverage Report

    python3 -m coverage report -m
  4. Generate HTML Coverage Report

    python3 -m coverage html --directory=src/vx_localization/test/htmlcov

📊 PlotJuggler Evaluation

The EKF localization performance was evaluated under User Story 4.3 using PlotJuggler. Both ideal (stationary) and moving states were tested to analyze smoothness and accuracy of position, velocity, acceleration, and yaw estimation.


1. Position X–Y Comparison

a. Ideal (Stationary)Position Ideal
b. MovingPosition Moving

Comparison between raw mocap data /pose_modelcars and filtered /odom position outputs.
The EKF output (in moving state) is smoother and maintains accurate position alignment.


2. Acceleration X–Y

a. Ideal (Stationary)Acceleration Ideal
b. MovingAcceleration Moving

Shows the estimated acceleration components from /odom_accel.
In ideal state, acceleration remains near zero; in motion, the EKF captures smooth longitudinal and lateral acceleration changes.


3. Odometry Linear Velocity & Orientation (Yaw)

a. Ideal (Stationary)Odom Ideal
b. MovingOdom Moving

Plots /odom.twist.twist.linear.x/y and /odom.pose.pose.orientation.z (yaw ).


About

ROS 2 EKF-based vehicle localization using a CTRA motion model with OptiTrack integration and fallback dead-reckoning.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

[[Monika Nagarajarao]https://github.com/Monika3106/Localization.git)

📌 Table of Contents

🎯 User Stories

  • US-1 – Scenario-Based Feature Validation and Gap Identification in Model City
    Link: Miro – US-1
  • US-2 – OptiTrack Freeze Detection and Fallback Localization
    Link: Miro – US-2
  • US-3 – EKF Prediction and Dead-Reckoning Using Wheel Speed During Fallback
    Link: Miro – US-3
  • US-4 – Wheel-Speed-Based EKF Prediction During OptiTrack Fallback
    Link: Miro – US-4

📖 Overview

The Localization Node helps the shuttle know its current position, direction, velocity and acceleration.

It does this by:

  • Reading motion capture data from /pose_modelcars (OptiTrack, mocap4r2_msgs/msg/RigidBodies).
  • Running an Extended Kalman Filter (CTRA model) to estimate pose, velocity, acceleration and yaw rate.
  • Publishing the filtered state as odometry on /odom.
  • Publishing estimated acceleration on /odom_accel. In case OptiTrack pose data becomes frozen while the vehicle is moving, the node switches to a fallback localization mode. During fallback, wheel speed is used for dead reckoning and EKF prediction-only operation, ensuring continuous odometry output for other modules.

Other modules like Path Planning, Perception Fusion, and V2X use this data to plan routes and share the vehicle state.

🏗️ Component Architecture

Localization Architecture

🧍 Responsible

  • **Component:Localization(localization_kf/localization)
  • Responsible: Monika Nagarajarao

⚙️ Functional Description

  • Implements an Extended Kalman Filter (EKF) with a Constant Turn Rate and Acceleration (CTRA) motion model.

  • State vector: [x, y, yaw, velocity, acceleration, yaw rate].

  • Prediction: integrates the CTRA model (straight and turning cases) using the mocap timestamps.

  • Update: corrects [x, y, yaw] from /pose_modelcars when OptiTrack pose data is valid.

  • OptiTrack Freeze Detection and Fallback Mode
    Detects frozen OptiTrack poses by comparing consecutive /pose_modelcars messages.
    If the pose is frozen while the vehicle is moving, the node switches to fallback localization.

  • Wheel-Speed Dead Reckoning
    During fallback, wheel speed from /ackermann_drive_feedback is used to estimate vehicle motion starting from the last valid OptiTrack pose.

  • Prediction-Only EKF Operation
    While in fallback mode, the EKF runs in prediction-only mode without OptiTrack position updates to maintain internal state continuity.

  • Link: Kalman Filter Design

🔌 ROS 2 Topics

IN/OutTopic NameMessage TypeDescription
Input/pose_modelcarsmocap4r2_msgs/msg/RigidBodiesReal-time pose and orientation data of tracked objects from the OptiTrack system.
Input/ackermann_drive_feedbackAckermannDrive.msgWheel speed input used for EKF prediction and dead-reckoning during OptiTrack fallback.
Output/odomnav_msgs/msg/OdometryVehicle's current position, orientation, velocity and yaw rate.
Output/odom_accelgeometry_msgs/msg/AccelWithCovarianceStampedEstimated linear acceleration (x, y) in the map/base_link frame.

⚙️ Component Functionalities

The Localization Node is responsible for determining the real-time state of the autonomous vehicle using motion capture data.

It performs the following key functions:

  • Subscribes to /pose_modelcars
    Receives motion capture data from the OptiTrack system as mocap4r2_msgs/msg/RigidBodies and selects the configured rigid body (e.g. ID "6") as the ego vehicle.

  • Runs an EKF (CTRA model)
    Estimates the state [x, y, yaw, velocity, acceleration, yaw_rate] using an Extended Kalman Filter.
    This smooths noisy mocap data while keeping the motion physically consistent.

  • Publishes to /odom
    Sends the vehicle’s pose and velocity as nav_msgs/msg/Odometry.
    The pose matches /pose_modelcars (when passthrough is enabled), while velocity and yaw rate come from the EKF + finite differences.

  • Publishes to /odom_accel
    Sends the estimated linear acceleration (x, y) as geometry_msgs/msg/AccelWithCovarianceStamped
    for further analysis and evaluation .

    🚀 Module 6 Improvements

The following improvements were introduced in Module 6:

  • Filtered Acceleration Estimation
    Acceleration is now computed from wheel speed feedback and passed through a low-pass filter to reduce noise and sudden spikes.

  • Velocity Consistency During Fallback Localization
    Vehicle velocity is refined by blending wheel-speed feedback with measured displacement, improving motion consistency during OptiTrack outages.

  • Robust Fallback Localization Handling
    When OptiTrack pose data becomes frozen, the system continues localization using EKF prediction and dead-reckoning without interrupting odometry output.

These improvements increase localization robustness and motion stability during short tracking outages.

📥 Installation & Setup

🔧 Clone the repository

git clone https://git.hs-coburg.de/voyagex/vx_localization.git

Build the package

cd loc_ws
colcon build
source install/setup.bash

Run the node

ros2 run localization_kf localization

🧪 Interface Test Procedure

This section explains how to verify that the **Localization ** works as intended subscribing to OptiTrack mocap data and publishing filtered EKF outputs.

Step-by-Step Test Procedure

  1. Launch the Localization Node

    ros2 run localization_kf localization
  2. Play the Recorded Rosbag File

    ros2 bag play ros2_bag_local_fixed
  3. Verify Incoming MoCap Data

    ros2 topic echo /pose_modelcars
  4. Verify Published Odometry Output

    ros2 topic echo /odom
  5. Verify Wheel Speed Input

    ros2 topic echo /ackermann_drive_feedback
  6. evaluate using plotjuggler

    ros2 run plotjuggler plotjuggler
    

🧪 Feature Test Strategy

The localization feature is validated using a scenario-based test strategy focusing on normal operation, degraded localization, and recovery behavior.

The following scenarios are covered:

  • Normal localization operation using OptiTrack
  • OptiTrack localization loss while the vehicle is moving
  • OptiTrack localization loss while the vehicle is stationary
  • Recovery after OptiTrack localization becomes available again

The tests verify that odometry, velocity, and acceleration outputs remain continuous and stable throughout all scenarios, and that the system automatically switches between normal and fallback localization modes without user intervention.

Detailed test design, scenarios, and KPIs are documented in the Feature Test Strategy.

🧪 Unit and Coverage Testing

This section describes how to run unit tests and measure code coverage for the Localization (EKF).

  1. Run Unit Tests

    cd~/loc_ws/src/localization_kf
    python3 -m pytest -v test/
  2. Run Tests with Coverage

    python3 -m coverage run --source=localization_kf.localization -m pytest test/
    
  3. Show Coverage Report

    python3 -m coverage report -m
  4. Generate HTML Coverage Report

    python3 -m coverage html --directory=src/vx_localization/test/htmlcov

📊 PlotJuggler Evaluation

The EKF localization performance was evaluated under User Story 4.3 using PlotJuggler. Both ideal (stationary) and moving states were tested to analyze smoothness and accuracy of position, velocity, acceleration, and yaw estimation.


1. Position X–Y Comparison

a. Ideal (Stationary)Position Ideal
b. MovingPosition Moving

Comparison between raw mocap data /pose_modelcars and filtered /odom position outputs.
The EKF output (in moving state) is smoother and maintains accurate position alignment.


2. Acceleration X–Y

a. Ideal (Stationary)Acceleration Ideal
b. MovingAcceleration Moving

Shows the estimated acceleration components from /odom_accel.
In ideal state, acceleration remains near zero; in motion, the EKF captures smooth longitudinal and lateral acceleration changes.


3. Odometry Linear Velocity & Orientation (Yaw)

a. Ideal (Stationary)Odom Ideal
b. MovingOdom Moving

Plots /odom.twist.twist.linear.x/y and /odom.pose.pose.orientation.z (yaw ).


About

ROS 2 EKF-based vehicle localization using a CTRA motion model with OptiTrack integration and fallback dead-reckoning.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

[[Monika Nagarajarao]https://github.com/Monika3106/Localization.git)

📌 Table of Contents

🎯 User Stories

  • US-1 – Scenario-Based Feature Validation and Gap Identification in Model City
    Link: Miro – US-1
  • US-2 – OptiTrack Freeze Detection and Fallback Localization
    Link: Miro – US-2
  • US-3 – EKF Prediction and Dead-Reckoning Using Wheel Speed During Fallback
    Link: Miro – US-3
  • US-4 – Wheel-Speed-Based EKF Prediction During OptiTrack Fallback
    Link: Miro – US-4

📖 Overview

The Localization Node helps the shuttle know its current position, direction, velocity and acceleration.

It does this by:

  • Reading motion capture data from /pose_modelcars (OptiTrack, mocap4r2_msgs/msg/RigidBodies).
  • Running an Extended Kalman Filter (CTRA model) to estimate pose, velocity, acceleration and yaw rate.
  • Publishing the filtered state as odometry on /odom.
  • Publishing estimated acceleration on /odom_accel. In case OptiTrack pose data becomes frozen while the vehicle is moving, the node switches to a fallback localization mode. During fallback, wheel speed is used for dead reckoning and EKF prediction-only operation, ensuring continuous odometry output for other modules.

Other modules like Path Planning, Perception Fusion, and V2X use this data to plan routes and share the vehicle state.

🏗️ Component Architecture

Localization Architecture

🧍 Responsible

  • **Component:Localization(localization_kf/localization)
  • Responsible: Monika Nagarajarao

⚙️ Functional Description

  • Implements an Extended Kalman Filter (EKF) with a Constant Turn Rate and Acceleration (CTRA) motion model.

  • State vector: [x, y, yaw, velocity, acceleration, yaw rate].

  • Prediction: integrates the CTRA model (straight and turning cases) using the mocap timestamps.

  • Update: corrects [x, y, yaw] from /pose_modelcars when OptiTrack pose data is valid.

  • OptiTrack Freeze Detection and Fallback Mode
    Detects frozen OptiTrack poses by comparing consecutive /pose_modelcars messages.
    If the pose is frozen while the vehicle is moving, the node switches to fallback localization.

  • Wheel-Speed Dead Reckoning
    During fallback, wheel speed from /ackermann_drive_feedback is used to estimate vehicle motion starting from the last valid OptiTrack pose.

  • Prediction-Only EKF Operation
    While in fallback mode, the EKF runs in prediction-only mode without OptiTrack position updates to maintain internal state continuity.

  • Link: Kalman Filter Design

🔌 ROS 2 Topics

IN/OutTopic NameMessage TypeDescription
Input/pose_modelcarsmocap4r2_msgs/msg/RigidBodiesReal-time pose and orientation data of tracked objects from the OptiTrack system.
Input/ackermann_drive_feedbackAckermannDrive.msgWheel speed input used for EKF prediction and dead-reckoning during OptiTrack fallback.
Output/odomnav_msgs/msg/OdometryVehicle's current position, orientation, velocity and yaw rate.
Output/odom_accelgeometry_msgs/msg/AccelWithCovarianceStampedEstimated linear acceleration (x, y) in the map/base_link frame.

⚙️ Component Functionalities

The Localization Node is responsible for determining the real-time state of the autonomous vehicle using motion capture data.

It performs the following key functions:

  • Subscribes to /pose_modelcars
    Receives motion capture data from the OptiTrack system as mocap4r2_msgs/msg/RigidBodies and selects the configured rigid body (e.g. ID "6") as the ego vehicle.

  • Runs an EKF (CTRA model)
    Estimates the state [x, y, yaw, velocity, acceleration, yaw_rate] using an Extended Kalman Filter.
    This smooths noisy mocap data while keeping the motion physically consistent.

  • Publishes to /odom
    Sends the vehicle’s pose and velocity as nav_msgs/msg/Odometry.
    The pose matches /pose_modelcars (when passthrough is enabled), while velocity and yaw rate come from the EKF + finite differences.

  • Publishes to /odom_accel
    Sends the estimated linear acceleration (x, y) as geometry_msgs/msg/AccelWithCovarianceStamped
    for further analysis and evaluation .

    🚀 Module 6 Improvements

The following improvements were introduced in Module 6:

  • Filtered Acceleration Estimation
    Acceleration is now computed from wheel speed feedback and passed through a low-pass filter to reduce noise and sudden spikes.

  • Velocity Consistency During Fallback Localization
    Vehicle velocity is refined by blending wheel-speed feedback with measured displacement, improving motion consistency during OptiTrack outages.

  • Robust Fallback Localization Handling
    When OptiTrack pose data becomes frozen, the system continues localization using EKF prediction and dead-reckoning without interrupting odometry output.

These improvements increase localization robustness and motion stability during short tracking outages.

📥 Installation & Setup

🔧 Clone the repository

git clone https://git.hs-coburg.de/voyagex/vx_localization.git

Build the package

cd loc_ws
colcon build
source install/setup.bash

Run the node

ros2 run localization_kf localization

🧪 Interface Test Procedure

This section explains how to verify that the **Localization ** works as intended subscribing to OptiTrack mocap data and publishing filtered EKF outputs.

Step-by-Step Test Procedure

  1. Launch the Localization Node

    ros2 run localization_kf localization
  2. Play the Recorded Rosbag File

    ros2 bag play ros2_bag_local_fixed
  3. Verify Incoming MoCap Data

    ros2 topic echo /pose_modelcars
  4. Verify Published Odometry Output

    ros2 topic echo /odom
  5. Verify Wheel Speed Input

    ros2 topic echo /ackermann_drive_feedback
  6. evaluate using plotjuggler

    ros2 run plotjuggler plotjuggler
    

🧪 Feature Test Strategy

The localization feature is validated using a scenario-based test strategy focusing on normal operation, degraded localization, and recovery behavior.

The following scenarios are covered:

  • Normal localization operation using OptiTrack
  • OptiTrack localization loss while the vehicle is moving
  • OptiTrack localization loss while the vehicle is stationary
  • Recovery after OptiTrack localization becomes available again

The tests verify that odometry, velocity, and acceleration outputs remain continuous and stable throughout all scenarios, and that the system automatically switches between normal and fallback localization modes without user intervention.

Detailed test design, scenarios, and KPIs are documented in the Feature Test Strategy.

🧪 Unit and Coverage Testing

This section describes how to run unit tests and measure code coverage for the Localization (EKF).

  1. Run Unit Tests

    cd~/loc_ws/src/localization_kf
    python3 -m pytest -v test/
  2. Run Tests with Coverage

    python3 -m coverage run --source=localization_kf.localization -m pytest test/
    
  3. Show Coverage Report

    python3 -m coverage report -m
  4. Generate HTML Coverage Report

    python3 -m coverage html --directory=src/vx_localization/test/htmlcov

📊 PlotJuggler Evaluation

The EKF localization performance was evaluated under User Story 4.3 using PlotJuggler. Both ideal (stationary) and moving states were tested to analyze smoothness and accuracy of position, velocity, acceleration, and yaw estimation.


1. Position X–Y Comparison

a. Ideal (Stationary)Position Ideal
b. MovingPosition Moving

Comparison between raw mocap data /pose_modelcars and filtered /odom position outputs.
The EKF output (in moving state) is smoother and maintains accurate position alignment.


2. Acceleration X–Y

a. Ideal (Stationary)Acceleration Ideal
b. MovingAcceleration Moving

Shows the estimated acceleration components from /odom_accel.
In ideal state, acceleration remains near zero; in motion, the EKF captures smooth longitudinal and lateral acceleration changes.


3. Odometry Linear Velocity & Orientation (Yaw)

a. Ideal (Stationary)Odom Ideal
b. MovingOdom Moving

Plots /odom.twist.twist.linear.x/y and /odom.pose.pose.orientation.z (yaw ).


About

ROS 2 EKF-based vehicle localization using a CTRA motion model with OptiTrack integration and fallback dead-reckoning.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages