yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
ROSMASTER A1📖
01.Robot Configuration and Operation Guide
  • 0.Unboxing & Reviewing
  • 0.Assembly video
  • 1.Standard kit readme
  • 2.Quick start guide
  • 3.First trial
  • 4.Calibrate front wheel servo
  • 5.Enter Docker (For JETSON Nano and RPi 5)
02.AI Model Preparation
  • 1.AI Model Preparation
03.AI Model Basics
  • 1.AI large model types and principles
  • 2.RAG retrieval enhancement and model training samples
  • 3.Embodied intelligent robot system architecture
  • 4.Embodied intelligent functions core source code
04.AI Model Developmentnew
  • 1.Register a model service provider account
  • 2. Configuring API-KEY
  • 3. Introduction to Dify
  • 4. Basic Dify Features
  • 5. Deploy the RAG knowledge base
  • 6. AI Large Model Development - chatbot
  • 7. RAG knowledge base + chatbot
  • 8. AI agent workflow
  • 9. Custom wake-up response
  • 10. Core module testing tools
05.AI Model - Text Version
  • 1.Semantic understand and command follow
  • 2.Multimodal visual understand
  • 3.Multimodal visual understand + PTZ tracking
  • 4.Multimodal visual understand + visual following
  • 5.Multimodal visual understand + visual line patroling
  • 6.Multimodal visual understand + Depth Camera Distance Question Answering
  • 7.Multimodal visual understand+SLAM navigation
  • 8.Multimodal visual understand+SLAM navigation + visual line patroling
  • 9.Intention estimation + Multimodal visual understand + SLAM navigation + visual functions
06.AI Model - Voice Version
  • 1.Semantic understand and command follow
  • 2.Multimodal visual understand
  • 3.Multimodal visual understand + PTZ tracking
  • 4.Multimodal visual understand + visual following
  • 5.Multimodal visual understand + visual line patroling
  • 6.Multimodal visual understand + Depth Camera Distance Question Answering
  • 7.Multimodal visual understand+SLAM navigation
  • 8.Multimodal visual understand+SLAM navigation + visual line patroling
  • 9.Intention estimation + Multimodal visual understand + SLAM navigation + visual functions
07.Chassis Control Course
  • 1.ROS control
  • 2.Handle control
  • 3.Keyboard control
  • 4.Linear velocity calibration
  • 5.Angular velocity calibration
  • 6.URDF Model
08.Mediapipe Visual Course
  • 1.Hand detection
  • 2.Posture detection
  • 3.Overall detection
  • 4.Facial Landmark Detection
  • 5.Face detection
  • 6.Face special effects
  • 7.3D object recognition
  • 8.Brush
  • 9.Finger control
  • 10.Gesture Recognition
  • 11.Palm Targeting
  • 12.Fingertip trajectory recognition
09.Advanced Visual Course
  • 1.QR code
  • 2.Human Pose Estimation
  • 3.Object Detection
  • 4.AR Vision
  • 5.ROS+Opencv Basics
  • 6.Yolov8 Object Detection (ORIN)
  • 7.Deep Learning Object Tracking (ORIN)
10.USB Camera Vision Course
  • 01.Color tracking
  • 02.Face Tracking
  • 03.AprilTag machine code tracking
  • 04.KCF Object Tracking
  • 05.QR code tracking
  • 06.Mediapipe gesture tracking
  • 07.Meidpipe human posture tracking
  • 08.Color Follow
  • 09.Face Following
  • 10.AprilTag machine code following
  • 11.QR code follow
  • 12.Mediapipe gesture recognition and following
  • 13.Meidpipe human posture following
  • 14.Visual tracking autonomous driving
  • 15.QR code motion control
  • 16.Gesture motion control
11.Depth Camera Vision Course
  • 1.Basic use of depth camera
  • 2.Deep pseudo-color image
  • 3.Depth camera ranging
  • 4.Color block volume measurement
  • 5.Color Following
  • 6.Face Following
  • 7.QR code follow
  • 8.Machine code following
  • 9.KCF Object Following
  • 10.Mediapipe gesture following
  • 11.Mediapipe Posture Following
  • 12.Visual tracking autonomous driving
  • 13.Edge Detection
12.LiDAR Course
  • 1.Basic use of Lidar
  • 2.Lidar obstacle avoidance
  • 3.Lidar following
  • 4.Lidar patrol
  • 5.Gmapping-SLAM mapping
  • 6.Cartographer-SLAM mapping
  • 7.slam_toolbox mapping
  • 8.Navigation2 single-point navigation avoid
  • 9.Navigation2 multi-point navigation avoid
  • 10.Cartographer Repositioning navigation
  • 11.RTAB-Map mapping
  • 12.RTAB-Map navigation
  • 13.APP mapping navigation
13.Multi-vehicle Course
  • 1.Multi-vehicle control
  • 2.Multi-vehicle navigation
  • 3.Multi-vehicle platoon
14.Autonomous Driving expand(Need purchase track map)new
Multimodal visual understand+SLAM navigation
  • 1. Multimodal visual understand+SLAM navigation
Orin&RDKX5-Autonomous driving
  • 1. Venue placement and precautions
  • 2. Start testing
  • 3. Identify and debug
  • 4. Lane keeping
  • 5. Road sign detection
  • 6. Traffic light recognition
  • 7. Fixed point parking
  • 8. Steering decision
  • 9. Horn sounding
  • 10. Deceleration
  • 11. Speed limit
  • 12. Autonomous parking
  • 13. Comprehensive application
  • 14. Unmanned driving integrated AI large model
Jetson Nano-Autonomous driving
  • 1. Venue placement and precautions
  • 2. Start testing
  • 3. Identify and debug
  • 4. Lane keeping
  • 5. Road sign detection
  • 6. Traffic light recognition
  • 7. Fixed point parking
  • 8. Steering decision
  • 9. Horn sounding
  • 10. Deceleration
  • 11. Speed limit
  • 12. Autonomous parking
  • 13. Comprehensive application
Road network planning
  • 1. Introduction to Road Network Planning and Navigation
  • 2. Constructing a Pose Map
  • 3. Road Network Labelling
  • 4. Road Network Planning Combined with Sand Table Map Case Study
  • 5. Path Replanning
Model Training
  • 1. Data Collection
  • 2. Dataset Annotation
  • 3. YOLOv11 Model Training
  • 4. Model Format Conversion
15.YOLOv11 Development (ORIN)
  • 1.YOLO environment construction
  • 2.CLI use
  • 3.Object detection
  • 4.Instance segmentation
  • 5.Pose estimation
  • 6.Image classification
  • 7.Oriented object detection
  • 8.Model conversion
  • 9.Dataset annotation
  • 10.Model training conversion
  • 11.Model prediction
16.YOLOv11 Development (Raspberry Pi & Jetson Nano)
  • 1.YOLO environment construction
  • 2.CLI use
  • 3.Object detection
  • 4.Instance segmentation
  • 5.Pose estimation
  • 6.Image classification
  • 7.Oriented object detection
  • 8.Model conversion
  • 9.Model prediction
17.YOLOV11 development course(RDK X5)
  • 1.YOLO environment construction
  • 2.CLI use
  • 3.Object detection
  • 4.Instance segmentation
  • 5.Pose estimation
  • 6.Image classification
  • 7.Oriented object detection
  • 8.Model prediction
  • 9.Model Quantization
18.Main control board course
Jetson Nano B01
  • 1. Introduction to the Jetson Nano B01 SUB Board
  • 2. Burn the system image
  • 3. Re-read the memory card or USB drive that has been burned
  • 4. Startup system
  • 5. Jetson Nano B01 System and Desktop Introduction
  • 6. Memory card or USB flash drive expansion
  • 7. Network Configuration
  • 8. SSH remote login & file transfer
  • 9. VNC Remote Login
  • 10. Jetson Nano B01 system backup
  • 11. Jetson Nano Swap space increased
  • 12. Installation and use of Jtop
  • 13. Third-party board + USB drive to start the car
Jetson Orin Nano_NX
  • 1.Jetson Orin board introduction
  • 2.Restore the factory image system
  • 3.Backup SSD system
  • 4.SSD expansion
  • 5.Network configuration
  • 6.SSH remote login
  • 7.VNC remote control
  • 8.Remote file transfer
  • 9.Jtop tool
  • 10.Exchange space expansion
Raspberry Pi
  • 1. Introduction to Raspberry PI 5
  • 2. Raspberry PI system installation and backup
  • 3. Powering the Raspberry PI 5
  • 4. Startup of Raspberry PI 5
  • 5. Update and upgrade operating system
  • 6. Introduction to raspi-config tool
  • 7. config.txt file description
  • 8. Network Configuration
  • 9. remote access
  • 10. Transfer files remotely
  • 11. Set display resolution and rotation
  • 12. Set screen to sleep
  • 13. Play audio and video
  • 14. Using USB camera
  • 15. Using MIPI camera
  • 16. Get real-time temperature of Raspberry Pi
RDK X5
  • 1.Introduction to RDK X5 board
  • 2.Write system file
  • 3.Hardware interface description
  • 4.Install case and other accessories
  • 5.Network configuration
  • 6.Remote login
  • 7.Update system
  • 8.srpi-config user guide
  • 9.config. txt configuration file
  • 10.Self-startup setting
  • 11.RDK exclusive command usage
  • 12.Linux command usage
  • 13.GPIO readwrite operation
  • 14.Image classification algorithm
  • 15.Use USB camera
  • 16.Use MIPI camera
  • 17.Binocular camera depth algorithm
19.AI large model course(ORIN-Pi-RDK X5)
Offline large model (Text Interaction)
  • 0. AI Large Model Mirroring Explanation
  • 1. Deployment of large-scale AI models
  • 2.Installation of the large-scale model dialogue platform
  • 3. Meta AI Llama 3.2 model
  • 4. Alibaba Cloud Qwen3 Model
  • 5. Microsoft Phi-4 mini model
  • 6. DeepSeek DeepSeek-R1 model
  • 7. Alibaba Cloud Qwen2.5vl Visual Multimodal Large Model
  • 8. Google Gemma3 Visual Multimodal Large Model
  • 9. Llava Visual Multimodal Large Model
  • 10.MiniCPM-V Visual Multimodal Large Model
  • 11. Multimodal Visual Understanding Applications
  • 12. Multimodal Text-Based Image Application
  • 13. Multimodal Video Analysis Application
  • 14. Multimodal visual positioning applications
  • 15. Multimodal table scanning application
  • 16. Multimodal Autonomous Agent Application
Offline large model (Voice Interaction)
  • 0. Voice Interaction Hardware Connection (Must Read)
  • 1. Offline speech-to-text (ASR)
  • 2. Offline Text-to-Speech (TTS)
  • 3. AI large model voice interaction
  • 4. Multimodal visual understanding and voice interaction
  • 5. Multimodal Text-Based Image Application
  • 6. Multimodal Video Analysis Application
  • 7. Multimodal visual positioning applications
  • 8. Multimodal table scanning application
  • 9. Multimodal Autonomous Agent Applications
  • 10. AI large model offline voice assistant
Online large model (Text Interaction)
  • 1. OpenRouter Large Model API Aggregation Platform
  • 2. Multimodal visual understanding applications
  • 3. Multimodal visual positioning applications
  • 4. Multimodal table scanning application
  • 5. Multimodal Autonomous Agent Applications
Online large model (Voice Interaction)
  • 0. Voice Interaction Hardware Connection (Must Read)
  • 1. Online speech-to-text (ASR)
  • 2. Online Text-to-Speech (TTS)
  • 3. AI large model voice interaction
  • 4. Multimodal visual and voice interaction
  • 5. Multimodal visual positioning applications
  • 6. Multimodal table scanning application
  • 7. Multimodal Autonomous Agent Applications
  • 8. AI large model online voice assistant
20.AI large model course(Jetson NANO)
Offline large model (Text Interaction)
  • 4.Multimodal visual understand speech interaction
  • 0.AI large model system image instructions
  • 1.AI large model environment deployment
  • 2.Install large model dialogue platform
  • 3.Meta AI llama 3.2 model
  • 4.Alibaba Cloud Qwen2 model
  • 5.Alibaba Cloud Qwen3 model
  • 6.SUTD TinyLlama
  • 7.DeepSeek DeepSeek-R1 model
  • 8.Microsoft Phi-3
  • 9.Microsoft Orca Mini
  • 10.NVIDIA StarCoder2
  • 11.Google Gemma3 Visual Multimodal Large Model
  • 12.Offline Text to Speech (TTS)
  • 13.Offline Speech to Text (ASR)
Online large model (Text Interaction)
  • 1.OpenRouter large model API aggregation platform
  • 2.Multimodal visual understand application
  • 3.Multimodal visual localization application
  • 4.Multimodal table scanning application
  • 5.Multimodal autonomous proxy application
Online large model (Voice Interaction)
  • 0.Voice interaction hardware connection (ReadMe)
  • 1.Online speech-to-text (ASR)
  • 2.Online Text-to-Speech (TTS)
  • 3.AI large model voice interaction
  • 5.Multimodal visual position application
  • 6.Multimodal table scanning application
  • 7.Multimodal autonomous proxy application
  • 8.AI large model online voice assistant
21.Linux operating system course
  • 1.Introduction to Linux system
  • 2.Ubuntu file system
  • 3.Ubuntu common commands
  • 4.Ubuntu common editors
  • 5.Ubuntu software operation commands
  • 6.Virtual machine installation
  • 7.SSH remote control
  • 8.VNC remote control
  • 9.Transfer files remotely
  • 10.Driver library and communication
  • 11.Static IP and hotspot mode
  • 12.Bind device ID
  • 13.Capacity expansion and resource allocation
  • 14.Update system software sources
  • 15.Set root user password
  • 16.sudo free password
  • 17.Connect to WiFi network
  • 18.View system version
  • 19.Customized service management
  • 20.Back up system image
22.Docker Course
  • 1.Docker Introduction and Installation
  • 2.Docker basic commands
  • 3.Docker Submission and Multi-Terminal Access
  • 4.Docker Startup Script
  • 5.Docker-Vscode environment construction
23.ROS2 Basic Course
  • 1.Introduction to ROS2
  • 2.ROS2 install Humble
  • 3.ROS2 development environment
  • 4.ROS2 workspace
  • 5.ROS2 function package
  • 6.ROS2 node
  • 7.ROS2 topic communication
  • 8.ROS2 service communication
  • 9.ROS2 action communication
  • 10.ROS2 custom interface message
  • 11.ROS2 parameter service case
  • 12.ROS2 meta-function package
  • 13.ROS2 distributed communication
  • 14.ROS2 DDS
  • 15.ROS2 time related API
  • 16.ROS2 common command tools
  • 17.ROS2 rviz2 use
  • 18.ROS2 rqt toolbox
  • 19.ROS2 Launch startup file configuration
  • 20.ROS2 recording and playback tool
  • 21.ROS2 URDF model
  • 22.ROS2 Gazebo simulation platform
  • 23.ROS2 TF2 coordinate transformation
24.Image Processing Basics Course
  • 1. Introduction to Open Source CV
  • 2. Image reading and display
  • 3. Image writing
  • 4. Image quality
  • 5. Pixel Operation
  • 6. Image zoom
  • 7. Image cutting
  • 8. Image translation
  • 9. Image Mirroring
  • 10. Affine Transformation
  • 11. Image Rotation
  • 12. Perspective Transformation
  • 13. Grayscale processing
  • 14. Image Binarization
  • 15. Edge Detection
  • 16. Line drawing
  • 17. Rectangle and circle drawing
  • 18. Drawing text and pictures
25.Control Board STM32 Driver Course
  • 0. Notes (must read)
  • 1. About expansion board
  • 2. STM32 Development environment
  • 3. Button control
  • 4. FreeRTOS application
  • 5. Serial communication
  • 6. SBUS model aircraft remote control
  • 7. CAN bus communication
  • 8. RGB colorful light bar
  • 9. Timer interrupt to control PWM servo
  • 10. Control serial port servos
  • 11. Nine-axis attitude sensor to obtain data
  • 12. Control motor
  • 13. Timer captures the encoder data
  • 14. Robot kinematics analysis theory
  • 15. PID control robot movement
26.Control Board Main Control Communication Course
  • 1. Update the expansion board firmware
  • 2. Install Rosmaster driver library
  • 3. Jupyter lab basic usage tutorial
  • 4. Buzzer whistle
  • 5. Control PWM servo
  • 6. RGB colorful light bar special effects display
  • 7. Control motor
  • 8. Control robot movement
  • 9. Control Serial Servo
Download
  • MainBoard_AI_Pure_System
  • Mapping_APP(iOS_Android)
  • Robot_Image_System_File
  • Code-Firmware
  • VM-File
  • 3D Model File
  • Instruction Manual
  • Software_File
  • Hardware-Info
  • Other_Annex_File
Download ZIP

Welcome to ROSMASTER A1 repository

5. Path Replanning

Path Replanning

Path Replanning1. Course Content2. Edit Road Network2. Run Replanning Example2.1 Launch Road Network Planning Navigation Node3. Query Obstacle Cost Threshold3.1 View Obstacle Cost Values3.2 Modify Replanning Trigger Threshold4. Source Code Analysis4.1 Obstacle Detection and Replanning Strategy4.2 Map Cost Value Query Implementation Method

1. Course Content

Important

  • Basics

Run the example program. Based on road network planning and navigation, if obstacles are detected blocking the planned path during travel, it will enter replanning mode to find a new path in the road network.

  • Advanced

1. Understand the implementation method of replanning and how to modify replanning strategies (strategies are not unique and can be implemented according to requirements)

2. Debug and modify obstacle detection thresholds based on queried cost values

2. Edit Road Network

  • To demonstrate the replanning functionality, we add some edges to a new road network. For instructions on opening and editing road networks, refer to: 03-Road Network Annotation, Section 4: Loading and Modifying Road Network Description

image-20251127193445946

  • We add bidirectional edges between waypoint 1 and waypoint 6

image-20251127201258423

 

  • All operations will have corresponding records in the terminal

image-20251127201344877

  • Then save the file

image-20251127201843407

 

2. Run Replanning Example

2.1 Launch Road Network Planning Navigation Node

  • (Host side) Chassis LiDAR driver

ros2 launch yahboomcar_nav laser_bringup_launch.py
  • (虚拟机端)启动可视化

xxxxxxxxxx
ros2 launch road_net_route rviz_only.launch.py
  • (Host side) Start the visualization and open a terminal inside a container.

xxxxxxxxxx
# If the ros2_kilted docker container is not started, you need to start the container first
bringup_ros2kilted
# Enter the container
exec_ros2kilted

image-20251119150930513

Launch road network planning navigation node

xxxxxxxxxx
ros2 launch road_net_route roadnet_nav2.launch.py map:=map.yaml pose_map:=map roadnet_file:=/root/map/map.geojson
  • (Host side) Start cartograph for fast localization

x
#orin
ros2 launch yahboomcar_nav localization_imu_odom.launch.py use_rviz:=false load_state_filename:=/home/jetson/map/map.pbstream
#rdk
ros2 launch yahboomcar_nav localization_imu_odom.launch.py use_rviz:=false load_state_filename:=/home/sunrise/map/map.pbstream

Tip

Optional launch parameter descriptions

map The grid map file name to be loaded, default value is map.yaml

load_state_filename The pose map file to be loaded. When using cartograph pure localization for global positioning, the pose map must be passed

roadnet_file Road network description file, must be a complete file path

params_file Navigation parameter file, default value is os.path.join(get_package_share_directory('road_net_route'), 'config', 'nav2_kilted.yaml')

localization_mode Global positioning method, default is cartograph

Parameter NameInputFinal Actual Path
mapmap.yaml/root/map/map.yaml
pose_mapmap/root/map/map
roadnet_fileAbsolute Path/root/map/map.geojson

image-20251127202710855

 

  • The test scenario here is: travel from waypoint 8 to waypoint 6 along the road network, then place obstacles on the road network planned path to trigger the replanning strategy

xxxxxxxxxx
ros2 topic pub -1 /road_net_nav_id std_msgs/msg/Int16MultiArray "{data: [8, 6]}"

image-20251127205025067

 

 

  • Here you can see the terminal will prompt that obstacles exist on the path, then trigger replanningimage-20251127205611749

 

  • When obstacles are detected on the path and the path is not passable, it retreats to the last passed waypoint 8

image-20251127205823822

 

 

  • Then retry planning a drivable path from waypoint 8, and finally reach the target waypoint 6

image-20251127205147761

 

 

3. Query Obstacle Cost Threshold

  • Path obstacle detection here is determined by checking the cost values on the global path and the number of high-cost value points in the global path. The threshold for triggering replanning can be set by yourself

Note

  • The obstacle detection threshold can generally use the factory default!!! If there are special scenario requirements, you can refer to this part of the tutorial to adjust the threshold for triggering replanning

  • Cost values are values used in the cost map to describe the occupied range of obstacles. The closer to the obstacle, the higher the cost value.

3.1 View Obstacle Cost Values

  • Click the Publish Point tool, then left-click on the map where you want to view the map cost value to view the cost value of the specified location

image-20251127211505111

 

  • You can see that places without obstacles have a cost value of 0, and the center of obstacles has a cost value of 99-100

image-20251127212112982

 

3.2 Modify Replanning Trigger Threshold

  • Configuration file path

xxxxxxxxxx
~/ros2_kilted/volumes/code_ws/src/road_net_route/config/nav2_kilted.yaml
  • Find the route_bridge node configuration parameters in the configuration file, where COST_THRESHOLD and PATH_OBSTACLES_THRESHOLD together determine the trigger threshold

xxxxxxxxxx
route_bridge:
  ros__parameters:
    roadnet_file: '/root/map/map.geojson'
    COST_THRESHOLD: 60
    replace2id: True
    PATH_OBSTACLES_THRESHOLD: 5
    max_consecutive_obstacles: 5
  • Specific obstacle detection logic is as follows

  • The global path planned by the road network function is of the ROS nav_msgs/msg/Path message type, which is a path composed of multiple pose points. During road network navigation, it checks whether all pose points on the global path have high-cost value points in the global cost map.

    • If it exceeds the COST_THRESHOLD threshold, mark that point on the path as a high-cost value pose point

    • Finally calculate how many pose points on the global are cost value pose points

    • If the total number of high-cost value pose points is greater than PATH_OBSTACLES_THRESHOLD, the path is considered not passable and needs replanning

    • The max_consecutive_obstacles parameter specifies the minimum number of consecutive detections required to identify something as an obstacle, preventing false positives.

Tip

If obstacle detection is not sensitive enough, you can reduce COST_THRESHOLD and PATH_OBSTACLES_THRESHOLD. If it's too sensitive, you can reduce these two values or adjust the obstacle inflation radius (for modifying obstacle inflation radius, refer to 04-Road Network Planning Navigation, 4.1 Navigation Controller Debugging)

image-20251127214205383

 

 

 

 

4. Source Code Analysis

  • Implementation program source code path:

xxxxxxxxxx
~/ros2_kilted/volumes/code_ws/src/road_net_route/road_net_route/route_bridge.py

 

4.1 Obstacle Detection and Replanning Strategy

  • Iterate through each pose point of the global path, check if there are obstacles exceeding the threshold on the path through the global cost map, and return a boolean value indicating whether the path is blocked by obstacles.

  • World coordinates to map coordinates: Call the cost map's worldToMapValidated method to convert world coordinates (wx, wy) to the cost map's grid coordinates (mx, my) (the cost map is a 2D grid map, each grid corresponds to a cost value).

  • Coordinate validity check: If the converted grid coordinates are None, it means this path point is outside the global cost map range, print a warning log and skip this point.

  • Parameters: path:Path → ROS2's nav_msgs/msg/Path message type, stores the robot's global planned path, containing a series of poses (poses).

  • Return value: bool → True means the number of obstacles on the path exceeds the threshold, False means the path is passable.

​x
def __check_path_obstacles(self, path:Path)->bool:
    """Check for obstacles on the global path."""
    pose_array=[]
    for pose in path.poses:
        wx=pose.pose.position.x
        wy=pose.pose.position.y

        mx, my = self.global_costmap.worldToMapValidated(wx,wy )
        if mx is None or my is None:
            self.get_logger().warn(f"Path point ({wx}, {wy}) is outside global costmap")
            continue

        cost = self.global_costmap.getCostXY(int(mx),int(my))

        if cost > self.COST_THRESHOLD:
            pose_array.append(pose)
    if len(pose_array) >self.PATH_OBSTACLES_THRESHOLD:
        self.get_logger().info(f"Path contains {len(pose_array)} potential obstacles.")
        return True
    return False

 

  • When obstacles are detected on the global path, make the robot retreat to the previous waypoint and replan the path.

xxxxxxxxxx
def __reroute_strategy_1(self,last_id):
    '''Replanning Strategy 1: Go back to the previous waypoint and replan the drivable path.'''
    navigator= BasicNavigator()
    goal_x,goal_y=self.__get_node_coordinates(last_id)
    if goal_x is not None and goal_y is not None:
        goal_pose = PoseStamped()
        goal_pose.header.frame_id = "map"
        goal_pose.pose.position.x = goal_x
        goal_pose.pose.position.y = goal_y
        back_lastid = navigator.goToPose(goal_pose)
        while not navigator.isTaskComplete(task=back_lastid):
            time.sleep(0.1)
        if navigator.getResult() == TaskResult.SUCCEEDED:
            self.get_logger().info("back to last id  success.")
        else:
            self.get_logger().info("back to last id  failed.")

 

 

  • handle_id_navigation and handle_pose_navigation are the core code responsible for road network planning navigation. The following parts in these two functions are the logic for detecting paths and triggering replanning

    When the path is detected as unfeasible, call Replanning Strategy 1: Make the robot retreat to the previous waypoint (coordinates corresponding to last_node_id). The core logic of this method has been explained before: initialize navigator → get coordinates of last_node_id → send navigation task to "retreat to this waypoint" → wait for task completion and print results. Move the robot from the current obstacle area back to a safe predefined waypoint, providing a stable starting point for subsequent path replanning.

    Complete process is as follows:

    1. Robot normally executes path tracking, continuously gets navigation feedback feedback.

    2. Check if there are obstacles on the path in feedback:

      • If no obstacles: continue executing the original path, no processing needed.

      • If there are obstacles: trigger replanning logic.

    3. Robot retreats to the previous safe waypoint (last_node_id).

    4. Use this waypoint as the starting point to replan the path to the target waypoint (goal_id).

    5. Get feedback of the new path, make the robot track the new path and continue moving.

xxxxxxxxxx
if feedback is not None and self.__check_path_obstacles(feedback.path):
    self.__reroute_strategy_1(last_node_id)
    route_task = self.navigator.getAndTrackRoute(last_node_id, goal_id)
    feedback = self.navigator.getFeedback(task=route_task)
    follow_path_task = self.navigator.followPath(feedback.path)

 

xxxxxxxxxx
    def handle_id_navigation(self, start_id:int, goal_id:int):
        '''Road network ID navigation'''
        
        route_task = self.navigator.getAndTrackRoute(start_id, goal_id)
        feedback=None
        follow_path_task=RunningTask.NONE
        last_feedback = None
        last_node_id =999 
        while not self.navigator.isTaskComplete(task=route_task):
            feedback = self.navigator.getFeedback(task=route_task)
            if feedback is not None and self.__check_path_obstacles(feedback.path):
                self.__reroute_strategy_1(last_node_id)
                route_task = self.navigator.getAndTrackRoute(last_node_id, goal_id)
                feedback = self.navigator.getFeedback(task=route_task)
                follow_path_task = self.navigator.followPath(feedback.path)
            while feedback is not None:
                if  last_feedback is not None and (feedback.last_node_id != last_feedback.last_node_id or feedback.next_node_id != last_feedback.next_node_id):
                    self.get_logger().info(f'id:{feedback.last_node_id} ------> id:{feedback.next_node_id} edge:{feedback.current_edge_id}')
                last_feedback = feedback
                last_node_id=feedback.last_node_id
                if feedback.rerouted : 
                    self.get_logger().info('reroute a new path to follow!')
                    follow_path_task = self.navigator.followPath(feedback.path)
                feedback = self.navigator.getFeedback(task=route_task)

            if self.navigator.isTaskComplete(task=follow_path_task):
                print(follow_path_task)
                self.get_logger().info('Controller completed its task!')
                if follow_path_task != RunningTask.NONE :
                    self.navigator.cancelTask()

        result = self.navigator.getResult()
        if result == TaskResult.SUCCEEDED:
            self.get_logger().info(Fore.GREEN+"navigation task completed."+Fore.RESET)
            self.action_feedback_pub.publish(String(data="road_net_nav_succeeded"))
        elif result == TaskResult.CANCELED:
            self.get_logger().warn("Navigation task canceled.")
        elif result == TaskResult.FAILED:
            self.get_logger().error("Navigation task failed.")
            self.action_feedback_pub.publish(String(data="road_net_nav_failed"))

    def handle_pose_navigation(self, goal_pose:PoseStamped):
        '''Arbitrary pose navigation'''
        transform = self.tf_buffer.lookup_transform("map", "base_footprint", rclpy.time.Time(),rclpy.duration.Duration(seconds=5.0))
        if transform is None:
            self.get_logger().info(Fore.RED+"Failed to get TF transform "+Fore.RESET)
            return

        else:
            start_pose = PoseStamped()
            start_pose.header = transform.header
            start_pose.pose.position.x = transform.transform.translation.x
            start_pose.pose.position.y = transform.transform.translation.y
            start_pose.pose.orientation = transform.transform.rotation
            self.get_logger().info(Fore.CYAN + f"current:{transform.transform.translation}"+Fore.RESET)
            nearest_start_node_id, nearest_start_distance = self.__find_nearest_node(start_pose.pose.position.x, start_pose.pose.position.y)
            nearest_goal_node_id, nearest_goal_distance = self.__find_nearest_node(goal_pose.pose.position.x, goal_pose.pose.position.y)
            if self.replace2id:
                self.get_logger().info(Fore.CYAN + f"nearest_start_node_id:{nearest_start_node_id}, distance:{nearest_start_distance}"
                                    f"\nnearest_goal_node_id:{nearest_goal_node_id}, distance:{nearest_goal_distance}"+Fore.RESET)
                route_task = self.navigator.getAndTrackRoute(start=nearest_start_node_id,goal=nearest_goal_node_id)
            else:
                route_task = self.navigator.getAndTrackRoute(start=start_pose,goal=goal_pose,use_start=True)
                
            feedback=None
            follow_path_task=RunningTask.NONE
            last_feedback = None
            last_node_id =999 
            while not self.navigator.isTaskComplete(task=route_task):
                feedback = self.navigator.getFeedback(task=route_task)
                if feedback is not None and self.__check_path_obstacles(feedback.path):
                    self.__reroute_strategy_1(last_node_id)
                    route_task = self.navigator.getAndTrackRoute(last_node_id, nearest_goal_node_id)
                    feedback = self.navigator.getFeedback(task=route_task)
                    follow_path_task = self.navigator.followPath(feedback.path)
                while feedback is not None:
                    if  last_feedback is not None and (feedback.last_node_id != last_feedback.last_node_id or feedback.next_node_id != last_feedback.next_node_id):
                        self.get_logger().info(f'id:{feedback.last_node_id} ------> id:{feedback.next_node_id} edge:{feedback.current_edge_id}')
                    last_feedback = feedback
                    last_node_id=feedback.last_node_id
                    if feedback.rerouted :  
                        self.get_logger().info('reroute a new path to follow!')
                        follow_path_task = self.navigator.followPath(feedback.path)
                    feedback = self.navigator.getFeedback(task=route_task)

                if self.navigator.isTaskComplete(task=follow_path_task):
                    self.get_logger().info('Controller completed its task!')
                    if follow_path_task != RunningTask.NONE :
                        self.navigator.cancelTask()

            result = self.navigator.getResult()
            if result == TaskResult.SUCCEEDED:
                if self.__adjust_pose(goal_pose):
                    self.get_logger().info(Fore.GREEN+"navigation task completed."+Fore.RESET)
                    self.action_feedback_pub.publish(String(data="road_net_nav_succeeded"))

            elif result == TaskResult.CANCELED:
                self.get_logger().info(Fore.YELLOW+"navigation task canceled."+Fore.RESET)

            elif result == TaskResult.FAILED:
                self.get_logger().info(Fore.RED+"navigation task failed."+Fore.RESET)
                self.action_feedback_pub.publish(String(data="road_net_nav_failed"))

 

4.2 Map Cost Value Query Implementation Method

  • Call the global cost map's worldToMapValidated method to convert world coordinates (x, y) to the cost map's grid coordinates (mx, my).

  • The cost map is a 2D grid map (each grid corresponds to a small area in the real world, 0.05m×0.05m), worldToMapValidated is a safe conversion method: if coordinates exceed the cost map range, it returns None, avoiding out-of-bounds errors caused by direct conversion.

  • Get cost value: Call the cost map's getCostXY method, pass the integer form of grid coordinates (grid coordinates are discrete integers, avoid errors caused by passing floating-point types), to get the cost value cost of this grid.

xxxxxxxxxx
    def get_costmap_value(self, msg:PointStamped):
        '''In RViz, you can click to view the cost of a point on the global cost map.'''
        x=msg.point.x
        y=msg.point.y
        mx, my = self.global_costmap.worldToMapValidated(x, y)
        if mx is None or my is None:
            self.get_logger().warn(f"Path point ({x}, {y}) is outside global costmap")
            return
        cost = self.global_costmap.getCostXY(int(mx),int(my))
        self.get_logger().info(f"clicked_point in global_costmap cost:{cost}")

 

 

Road Network Planning Combined with Sand Table Map Case Study
Data Collection

COMPANY

  • About us
  • Team Style
  • Blog

LEARNING & EXPLORATION

  • Tutorials
  • Edge AI hardware
  • Educational robots
  • Embedded intelligent hardware

WHERE TO BUY

  • Yahboom Online Store
  • Amazon
  • Alibaba
  • AliExpress
  • Mercado

TECHNOLOGY SUPPORT

  • Email: support@yahboom.com

BE A DISTRIBUTOR

  • Email: sales@yahboom.com
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文