{"id":109,"date":"2026-02-19T01:08:43","date_gmt":"2026-02-19T01:08:43","guid":{"rendered":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/?page_id=109"},"modified":"2026-03-03T23:27:17","modified_gmt":"2026-03-03T23:27:17","slug":"f1tenth","status":"publish","type":"page","link":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/f1tenth\/","title":{"rendered":"F1TENTH"},"content":{"rendered":"\n<div class=\"wp-block-buttons alignwide is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-a89b3969 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"#mapping\">Mapping<\/a><\/div>\n\n\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"#ppa\">Path Planning Algorithm<\/a><\/div>\n\n\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"#pure-pursuit\">Pure Pursuit<\/a><\/div>\n\n\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"#uiux\">User Interface<\/a><\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"401\" src=\"http:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/f1tenth_NX_padded-768x735-1-e1771564474641.png\" alt=\"f1tenth\" class=\"wp-image-196\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/f1tenth_NX_padded-768x735-1-e1771564474641.png 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/f1tenth_NX_padded-768x735-1-e1771564474641-300x157.png 300w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"mapping\">Mapping<\/h4>\n\n\n\n<p>Implement a collision-free map converter that takes the built occupancy grid map from slam_toolbox as input. It generates an occupancy grid cost map to avoid possible obstacle collision in the mission planning process. It also labels the map grid outside the drivable area for the user interface so that waypoints are added correctly in the interface.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"192\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-5-1024x192.png\" alt=\"\" class=\"wp-image-116\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-5-1024x192.png 1024w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-5-300x56.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-5-768x144.png 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-5.png 1063w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Figure: Correct dataflow shown in rqt_graph<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"472\" height=\"314\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-13.png\" alt=\"\" class=\"wp-image-124\" style=\"width:570px;height:auto\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-13.png 472w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-13-300x200.png 300w\" sizes=\"auto, (max-width: 472px) 100vw, 472px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"472\" height=\"316\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-14.png\" alt=\"\" class=\"wp-image-125\" style=\"width:562px;height:auto\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-14.png 472w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-14-300x201.png 300w\" sizes=\"auto, (max-width: 472px) 100vw, 472px\" \/><figcaption class=\"wp-element-caption\">Figure: Map after Map Editing Tool<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"472\" height=\"314\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-12.png\" alt=\"\" class=\"wp-image-123\" style=\"aspect-ratio:1.5032326704312955;width:570px;height:auto\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-12.png 472w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-12-300x200.png 300w\" sizes=\"auto, (max-width: 472px) 100vw, 472px\" \/><figcaption class=\"wp-element-caption\">Map inflation results: robot_radius:0.2m, inflation_radius: 0.5m<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ppa\">Path Planning Algorithm<\/h2>\n\n\n\n<p><strong>Map Inflator<\/strong><\/p>\n\n\n\n<p><strong>Motivation:<\/strong><\/p>\n\n\n\n<p>Instead of relying on Nav2 as done previously in the map_converter module, we aimed to implement a custom map inflation method. This approach removes the need to launch multiple redundant Nav2 nodes and allows tighter integration with our custom planning pipeline.<\/p>\n\n\n\n<p><strong>Methodology:<\/strong><\/p>\n\n\n\n<p>This work introduces a map_inflator ROS 2 node that inflates obstacles in an OccupancyGrid to improve navigation safety. The node expands occupied cells to create a buffer zone that accounts for the robot\u2019s physical footprint, ensuring the global planner maintains safe clearance from obstacles and walls.<\/p>\n\n\n\n<p><strong>Key Features<\/strong><\/p>\n\n\n\n<p>Obstacle Inflation: Transforms a standard occupancy grid into a &#8220;cost map&#8221; where obstacles are thickened based on a configurable radius in meters.<\/p>\n\n\n\n<p>Configurable Safety Buffer: Uses the inflation_radius_m parameter to automatically calculate the required number of grid cells based on the map&#8217;s resolution.<\/p>\n\n\n\n<p>Customizable Thresholds: Allows users to define what constitutes an &#8220;occupied&#8221; cell and toggle whether unknown territory (v &lt; 0) should be treated as a lethal obstacle.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Topic<\/th><th>Type<\/th><th>Description<\/th><\/tr><tr><td>\/map<\/td><td>nav_msgs\/msg\/OccupancyGrid<\/td><td>Input: The raw static map from a map server or SLAM node.<\/td><\/tr><tr><td>\/cost_map<\/td><td>nav_msgs\/msg\/OccupancyGrid<\/td><td>Output: Current robot state from Localization (Particle Filter).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"402\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Non-Inflated-Map-1024x402.png\" alt=\"\" class=\"wp-image-248\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Non-Inflated-Map-1024x402.png 1024w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Non-Inflated-Map-300x118.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Non-Inflated-Map-768x301.png 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Non-Inflated-Map-1536x603.png 1536w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Non-Inflated-Map.png 1917w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Figure: Map in Rviz2 before Inflation<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"422\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Inflated-Map-1024x422.png\" alt=\"\" class=\"wp-image-249\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Inflated-Map-1024x422.png 1024w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Inflated-Map-300x124.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Inflated-Map-768x316.png 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Inflated-Map-1536x633.png 1536w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/03\/Inflated-Map.png 1918w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Figure: Map in Rviz2 after Inflation<\/figcaption><\/figure>\n\n\n\n<p><strong>Path Planning<\/strong>:<\/p>\n\n\n\n<p><strong>Motivation<\/strong>:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Methodology:<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Key Features:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Topic<\/th><th>Type<\/th><th>Description<\/th><\/tr><tr><td>\/map<\/td><td>nav_msgs\/msg\/OccupancyGrid<\/td><td>Input: The raw static map from a map server or SLAM node.<\/td><\/tr><tr><td>\/cost_map<\/td><td>nav_msgs\/msg\/OccupancyGrid<\/td><td>Output: Current robot state from Localization (Particle Filter).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Smoothing<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Motivation:<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Methodology:<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Key Features:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Topic<\/th><th>Type<\/th><th>Description<\/th><\/tr><tr><td>\/map<\/td><td>nav_msgs\/msg\/OccupancyGrid<\/td><td>Input: The raw static map from a map server or SLAM node.<\/td><\/tr><tr><td>\/cost_map<\/td><td>nav_msgs\/msg\/OccupancyGrid<\/td><td>Output: Current robot state from Localization (Particle Filter).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Replaced the initial brute-force search (O(n!)) which was computationally<\/li>\n\n\n\n<li>prohibitive for n &gt; 10.<\/li>\n\n\n\n<li>o Implemented a bitmasking approach to optimize the storage of the DP table,<\/li>\n\n\n\n<li>reducing time complexity to O(n^2 2^n).<\/li>\n\n\n\n<li>o Result: Capable of finding the mathematically optimal tour for small-to-medium<\/li>\n\n\n\n<li>waypoint sets.<\/li>\n<\/ul>\n\n\n\n<p><strong>Held-Karp Algorithm (Dynamic Programming)<\/strong><\/p>\n\n\n\n<p><strong>Nearest Neighbor (Greedy Heuristic):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>o Implemented as a fallback for high-density waypoint scenarios (n &gt; 20).<\/li>\n\n\n\n<li>o Utilizes Dijkstra\u2019s algorithm for cost estimation between nodes.<\/li>\n\n\n\n<li>o Result: Provides rapid solutions with minimal memory overhead, ensuring<\/li>\n\n\n\n<li>system responsiveness when optimality is secondary to speed.<\/li>\n<\/ul>\n\n\n\n<p>Implemented one-to-all Dijkstra from the start to compute true grid-based travel costs to every target waypoint. And ensures costs reflect feasible paths around static obstacles, rather than relying on Euclidean distance.<br>\u25cf Built a TSP solver for waypoint ordering, which use Nearest neighbor as the first stage as an initial greedy tour, then apply 2-opt (swap edges) refinement to reduce crossings and lower total cost iteratively<br>\u25cf After determining the waypoint visiting order, used Hybrid A* to generate the<br>kinematically feasible path connecting the ordered waypoints.<br>\u25cf Packaged the Python implementation into a ROS2 package: path_planning<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-15-1024x1024.png\" alt=\"\" class=\"wp-image-127\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-15-1024x1024.png 1024w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-15-300x300.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-15-150x150.png 150w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-15-768x768.png 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-15.png 1184w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Figure: Hybrid A* output path for traversing 30 waypoints in a grid map of 200&#215;200<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"345\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-19-1024x345.png\" alt=\"\" class=\"wp-image-133\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-19-1024x345.png 1024w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-19-300x101.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-19-768x259.png 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/image-19.png 1355w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Figure: TSP without smoothing (left), Dijkstra (middle), Dijkstra + NN (right)<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pure-pursuit\">Local Planning (Pure Pursuit)<\/h2>\n\n\n\n<p>Implemented a pure-pursuit local planning module that takes the planned path and current vehicle state as input, computes a steering command, and publishes it to the vehicle control module. This enables the robot to follow smooth trajectories generated by the planning unit.<\/p>\n\n\n\n<p>Pure Pursuit Algorithm:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>\u03ba<\/mi><mo>=<\/mo><mn>2<\/mn><mrow><mspace width=\"0.1667em\"><\/mspace><mi>sin<\/mi><mo>\u2061<\/mo><\/mrow><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b1<\/mi><mi>\/<\/mi><mi>L<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">\\kappa = 2 \\sin(\\alpha \/ L)\n<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p>Bicycle Model Integration:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>\u03b4<\/mi><mo>=<\/mo><mrow><mi>arctan<\/mi><mo>\u2061<\/mo><\/mrow><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>L<\/mi><mi>\/<\/mi><mi>\u03ba<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">\\delta = \\arctan(L \/ \\kappa)<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th class=\"has-text-align-left\" data-align=\"left\">Topic<\/th><th class=\"has-text-align-left\" data-align=\"left\">Type<\/th><th class=\"has-text-align-left\" data-align=\"left\">Description<\/th><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>\/planning\/path<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">nav_msgs\/Path<\/td><td class=\"has-text-align-left\" data-align=\"left\">Input: Sequence of waypoints from the Planning unit.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>\/pf\/pose\/odom<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">nav_msgs\/Odometry<\/td><td class=\"has-text-align-left\" data-align=\"left\">Input: Current robot state from Localization (Particle Filter).<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>\/drive<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">ackermann_msgs\/AckermannDriveStamped<\/td><td class=\"has-text-align-left\" data-align=\"left\">Output: Target steering angle and velocity for the vehicle.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\" style=\"margin-right:0;margin-left:0\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"433\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Pure_pursuit-Standalone-Visualization.gif\" alt=\"\" class=\"wp-image-111\" style=\"aspect-ratio:0.9237901243239447;width:393px;height:auto\" \/><figcaption class=\"wp-element-caption\">Figure: Visualization of Standalone Pure Pursuit Test<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"1056\" style=\"aspect-ratio: 1912 \/ 1056;\" width=\"1912\" controls src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Pure_pursuit-in-simulator-1-1-1.mp4\"><\/video><figcaption class=\"wp-element-caption\">Video: Pure Pursuit Test in ROS2 Envrionment Visualized in Rviz2<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">UI\/UX<\/h2>\n\n\n\n<p>Implemented a web-based user interface to visualize the map and robot pose, manage waypoints (add\/drag\/delete), publish missions, and render subscribed paths on the map.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-22-53-32-1024x640.png\" alt=\"\" class=\"wp-image-182\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-22-53-32-1024x640.png 1024w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-22-53-32-300x188.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-22-53-32-768x480.png 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-22-53-32-1536x960.png 1536w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-22-53-32.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"511\" src=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-01-51-12-1024x511.png\" alt=\"\" class=\"wp-image-184\" srcset=\"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-01-51-12-1024x511.png 1024w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-01-51-12-300x150.png 300w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-01-51-12-768x383.png 768w, https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-content\/uploads\/sites\/96\/2026\/02\/Screenshot-from-2026-02-12-01-51-12.png 1347w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>After the robot is launched, start the frontend application and open it in a browser. The application subscribes to the map and robot position from ROS2 topics and renders them in the interface. Users can click directly on the map to create new waypoints or drag existing waypoints to modify their positions. In delete mode, users can click an existing waypoint to remove it (a button will be provided to switch between waypoint editing modes). Once all mission waypoints are set, users can click a button to publish them back to ROS2 as a <code>PoseArray<\/code> topic. The planner node then generates a path topic as expected, which the application subscribes to and renders in the interface.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mapping Implement a collision-free map converter that takes the built occupancy grid map from slam_toolbox as input. It generates an occupancy grid cost map to avoid possible obstacle collision in the mission planning process. It also labels the map grid outside the drivable area for the user interface so that waypoints are added correctly in [&hellip;]<\/p>\n","protected":false},"author":451,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-109","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-json\/wp\/v2\/pages\/109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-json\/wp\/v2\/users\/451"}],"replies":[{"embeddable":true,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-json\/wp\/v2\/comments?post=109"}],"version-history":[{"count":24,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-json\/wp\/v2\/pages\/109\/revisions"}],"predecessor-version":[{"id":257,"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-json\/wp\/v2\/pages\/109\/revisions\/257"}],"wp:attachment":[{"href":"https:\/\/mrsdprojects.ri.cmu.edu\/2026teame\/wp-json\/wp\/v2\/media?parent=109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}