yahboom
HomeTutorialsProduct
Solution
Blog
Online Store
About Us
EN/中文
Store
ROSMASTER A1 PRO📖
00.Configuration and Operation Guide
  • 0. Unboxing and Review
  • 1.Assembly Videos
  • 2.User Manual
  • 3.Enter Docker (For Raspberry Pi)
  • 4.A1Pro Front Wheel Servo Calibration
  • 5.USB Camera Calibration
  • 6.Depth Camera Calibration
  • 7.FAQ
  • 8.Desktop Configuration Center and Remote Control Guide
01.Chassis Control Course
  • 1.Robot Information Publishing
  • 2.Robot Handle Control
  • 3.Robot Keyboard Control
  • 4.Linear Velocity Calibration
  • 5.Angular Velocity Calibration
  • 6.Robot URDF Model
  • 7.Robot EKF State Estimation
02.Lidar Course
  • 1.Lidar Introduction and Use
  • 2.Lidar Obstacle Avoidance
  • 3.Lidar Following
  • 4.Lidar Patrol
  • 5.GMapping-SLAM Mapping
  • 6.Cartographer-SLAM Mapping
  • 7.Slam-Toolbox Mapping
  • 8.Lifelong Mode Mapping
  • 9.Navigation2 Single Point Navigation
  • 10.Navigation2 Multi Point Navigation
  • 11.Cartographer Relocalization Navigation
  • 12.Slam-Toolbox Localization Navigation
  • 13.Synchronous Mapping And Navigation
  • 14.Aruco Visual Relocalization Navigation
  • 15.Mobile App Mapping And Navigation
  • 16.AprilTag Transport
  • 17.Color Block Transport
03.USB Camera-Depth Camera Course
  • 1.USB Camera Introduction
  • 2.USB Camera Intrinsic Calibration
  • 3.Nuwa-HP60C Camera Introduction (Depth Camera Only)
  • 4.Depth Camera Distance Measurement (Depth Camera Only)
  • 5.Depth Pseudo Color Image (Depth Camera Only)
  • 6.Block Volume Calculation (Depth Camera Only)
  • 7.Edge Detection (Depth Camera Only)
  • 8.RTAB-Map SLAM Mapping (Depth Camera Only)
  • 9.RTAB-Map Navigation (Depth Camera Only)
04.Robotic Arm and 3D Space Gripping Course
  • 0.Robotic Arm Basic Usage
  • 1.Robotic Arm Kinematics
  • 2.Robotic Arm Chassis Coordination Control
  • 3.AprilTag ID Sorting
  • 4.AprilTag Height Anomaly Sorting
  • 5.AprilTag Tracking and Grasping
  • 6.Color Block Sorting
  • 7.Color Block Height Anomaly Sorting
  • 8.Color Block Tracking and Grasping
  • 9.Wood Block Shape Sorting
  • 10.KCF Tracking and Grasping Objects
  • 11.Mediapipe Gesture ID Sorting AprilTag
  • 12.Mediapipe Gesture Height Sorting AprilTag
  • 13.Desktop Tracking and Grasping AprilTag
  • 14.3D Spatial Tracking AprilTag
  • 15.Line Following Obstacle Clearing
  • 16.Transformer Model Tracking Algorithm
05.Road Network Planning and Navigation
  • 1.Introduction To Road Network Planning
  • 2.Road Network Annotation
  • 3.Planning And Navigation Between Waypoints
  • 4.Road Network Navigation In Any Pose
  • 5.Path Re-planning
06.OpenClaw Basic Course
  • 1.Introduction to OpenClaw
  • 2.OpenClaw Core Concepts
  • 3.OpenClaw API-KEY Configuration
  • 4.OpenClaw Switch Models
  • 5.OpenClaw System Prompt Words
  • 6.OpenClaw Common CLI Commands
07.OpenClaw Interaction Method
  • 1.OpenClaw Webchat Interaction
  • 2.OpenClaw Tui Interaction
  • 3.OpenClaw Voice Dialogue Interaction
  • 4.OpenClaw WhatsApp Interaction
08.OpenClaw Development
  • 1.OpenClaw Connecting to Robot MCP Service
  • 2.Robot CLI Command Tool
  • 3.robot-control plugin tool
  • 4.reply-bridge plugin tool
  • 5.OpenClaw Multimodal Vision
  • 6.OpenClaw Chassis Control
  • 7.OpenClaw Robotic Arm Control
  • 8.OpenClaw Skills Development
  • 9.OpenClaw Scheduled Tasks
  • 10.OpenClaw Multi-Agent Intelligent Agent
  • 11.OpenClaw Active Interaction
  • 12.OpenClaw Vector Memory
09.OpenClaw Embodied Intelligent Application
  • 1.OpenClaw Target Tracking
  • 2.OpenClaw Arm Tracking And Grasping
  • 3.OpenClaw Arm Fixed-point Placement
  • 4.OpenClaw Waste Sorting
  • 5.OpenClaw SLAM Mapping And Navigation
  • 6.OpenClaw Navigation Transport
  • 7.OpenClaw AprilTag Grasping
  • 8.OpenClaw Color Line Patrol
  • 9.OpenClaw Visual Distance Measurement
10.OpenClaw Scenario Sandbox
  • 1.Map Description and Prop Placement
  • 2.Build Sand Table Map
  • 3.Visual Relocation Markers
  • 4.Map Mapping Markers
  • 5.OpenClaw Scenario Sandbox Comprehensive Case
11.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
12.AI Model Development
  • 1.Register a Model Service Provider Aaccount
  • 2.Configuring API-KEY
  • 3.Introduction to Dify
  • 4.Basic Dify Features
  • 5.AI Large Model Development - chatbot
  • 6.Deploy the RAG Knowledge Base
  • 7.RAG Knowledge Base + chatbot
  • 8.AI Agent Workflow
  • 9.Custom Wake-up Response
13.AI Model - Text Version
  • 1.Semantic Understand and Command Follow
  • 2.Multimodal Visual Understand
  • 3.Multimodal Visual Understand + Robotic Arm Gripping
  • 4.Multimodal Visual Understand+SLAM Navigation
  • 5.Robotic Arm Gripping+Multimodal Visual Understand+SLAM Navigation
  • 6.Intention Estimation
14.AI Model - Voice Version
  • 1.Semantic Understand and Command Follow
  • 2.Multimodal Visual Understand
  • 3. Multimodal Large Model+Robotic Arm Gripping
  • 4.Multimodal Visual Understand+SLAM Navigation
  • 5.Robotic Arm Gripping+Multimodal Visual Understand+SLAM Navigation
  • 6.Intention Estimation
15.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.Palm Target Positioning
  • 11.Fingertip Trajectory Recognition
  • 12.Fingertip Gesture Control Cobotic Arm
  • 13.Gesture Grabbing and Releasing Objects
  • 14.Finger Control Robotic Arm
  • 15.Medipipe Gesture Control Robotic arm Cction Group
16.MoveIt2 Simulation Course
  • 1.MovelT2 Configuration
  • 2.MovelT2 Simulation-Reality Linkage
  • 3.Random Movement
  • 4.Forward Kinematics Design
  • 5.Inverse Kinematics Design
  • 6.Cartesian Path
  • 7.Scene Design
  • 8.Trajectory Planning
  • 9.Collision Detection
  • 10.3D Perception Obstacle‑Avoidance
17.Multi-vehicle Course
  • 1.Multi-vehicle Control
  • 2.Multi-vehicle Navigation
  • 3.Multi-vehicle Formation
18.YOLO26 Development
  • 1.CLI Use
  • 2.Object Detection
  • 3.Instance Segmentation
  • 4.Pose Estimation
  • 5.Image Classification
  • 6.Oriented Object Detection
  • 7.YOLOv26 + DeepSORT Tracking
  • 8.Monocular Depth Estimation
19.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.1 Kinematic Analysis of Mecanum Wheel
  • 14.2 Kinematic Analysis of Ackerman
  • 14.3 Kinematic Analysis of 4WD
  • 15.PID Control Robot Movement
20.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
21.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
22.Linux 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
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.Main Control Course
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
RDKX5
  • 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
  • 18. Controlling RGB Cooling Fans
Download
  • SystemFile
  • Code
  • 3D_Model_File
  • Software_Tools
  • Hardware_Info
  • Introduction_Manual
  • Script_File
  • Dify AI Agent
Download ZIP

Welcome to ROSMASTER A1 PRO repository

3.Multi-vehicle Formation

Multi-Vehicle Formation

Preface: Multi-robot formation is one of the core applications of swarm robotics. This course is based on the "Leader-Follower" architecture: the leader vehicle (robot1) broadcasts the navigation path and the relative-position TF transforms globally, while the follower vehicles (robot2, robot3) listen to the coordinates in real time, compute the formation goal points they should reach, and follow autonomously. The course presets three formations: "Column", "Row", and "Left/Right Convoy", and supports online switching via dynamic parameters.


1. Content Description and Formation Design

1.1 Formation Definitions

The system supports three preset formation layouts (using the center reference frame of the leader vehicle robot1 as the reference):

Formation NameParameter Value (queue_name)Formation Spatial GeometryApplicable Operation Scenarios
ColumncolumnThe follower vehicles are directly behind the leader, arranged in a single-file line:
robot2: x = -dist, y = 0
robot3: x = -2*dist, y = 0
Narrow corridors, single-lane passage
RowrowThe follower vehicles are distributed directly to the left and right of the leader, in a single horizontal row:
robot2: x = 0, y = -dist
robot3: x = 0, y = +dist
Large-area floor cleaning, lateral joint inspection
Left/Right Convoyconvoy (default)The follower vehicles are positioned at the left-rear and right-rear of the leader, forming a V-shape/triangle escort formation:
robot2: x = -dist, y = -dist
robot3: x = -2*dist, y = +dist
Key material escort, coordinated defense patrol

[!NOTE] For teaching convenience, this tutorial focuses on two vehicles (leader robot1 + follower robot2). The program itself is fully compatible with three-vehicle formation (robot3).

1.2 Formation Coordination Implementation Principle

  1. Map and localization reference alignment: All vehicles access the same LAN and global map service, and establish their own poses under the unified global coordinate system (map) through their respective AMCL nodes;
  2. Leader vehicle TF broadcasting: The leader vehicle (robot1) runs the pub_follower_goal node. As the leader moves in the map, it continuously broadcasts the expected follower positions (point2 and point3) relative to robot1/base_link to the TF tree;
  3. Follower listening and navigation: The follower vehicle (robot2) runs the get_follower_point node, which resolves the local goal point point2 into the global goal pose under the map coordinates in real time through TF transform listening, and continuously sends goal points to /robot2/goal_pose, driving the follower's Nav2 navigation module to move and follow with obstacle avoidance.

2. Startup and Operation Steps

2.1 Environment Preparation and Chassis Startup

Start the chassis and LiDAR fusion nodes of both vehicles:

Run the following command in the terminal of Vehicle 1 (robot1):

ros2 launch yahboomcar_multi A1p_laser_bringup_multi_launch.xml robot_name:=robot1

Run the following command in the terminal of Vehicle 2 (robot2):

xxxxxxxxxx
ros2 launch yahboomcar_multi A1p_laser_bringup_multi_launch.xml robot_name:=robot2

2.2 Start RViz Visualization and the Map Service

Open a terminal on the control terminal (virtual machine/PC) and start the multi-vehicle integrated visualization interface:

xxxxxxxxxx
ros2 launch yahboomcar_multi display_multi_nav_launch.py

After startup, the RViz interface presents the multi-vehicle configuration view:

image-20260905170420329

Open another terminal on the control terminal and start the global map broadcasting service:

xxxxxxxxxx
ros2 launch yahboomcar_multi map_server_launch.py

image-20260905170432472

The pre-built 2D site grid map will be displayed in the RViz interface:

image-20250814191212430

2.3 Start AMCL Localization for Both Vehicles and Calibrate Initial Poses

Open two terminals on the control terminal to start localization:

​x
# Terminal 1: Start localization for robot1
ros2 launch yahboomcar_multi A1p_amcl_robot1_launch.py
​
# Terminal 2: Start localization for robot2
ros2 launch yahboomcar_multi A1p_amcl_robot2_launch.py

The terminal prints the initial-pose waiting prompt:

image-20260905170447185

At the top of RViz, use the first 【2D Pose Estimate】tool (drag the arrow aligned with robot1's actual position and orientation) and then the second 【2D Pose Estimate】tool (drag the arrow aligned with robot2's actual position and orientation) in order, so that the LiDAR point clouds of both vehicles (red for robot1, blue for robot2) perfectly coincide with the black obstacle boundaries of the map:

image-20250822143329519

2.4 Start the Nav2 Navigation System for Both Vehicles

Open two terminals on the control terminal to start the Nav2 navigation stacks:

xxxxxxxxxx
# Terminal 1: Start navigation for robot1
ros2 launch yahboomcar_multi A1p_nav_robot1_launch.py
​
# Terminal 2: Start navigation for robot2
ros2 launch yahboomcar_multi A1p_nav_robot2_launch.py

After startup, the costmap inflation layers of both vehicles appear in the RViz view:

image-20250822143601339

2.5 Start the Multi-Vehicle Formation Coordination Nodes

Step 1: Start the Leader Vehicle Formation TF Broadcast Node

Open a terminal on the control terminal and run the leader navigation formation node:

xxxxxxxxxx
ros2 run yahboomcar_multi pub_follower_goal

After startup, the terminal prints the status of waiting for waypoints and broadcasting TF:

image-20250822144315915

[!TIP] The default formation and spacing (in meters) can be specified via ROS 2 parameters at startup:

xxxxxxxxxx
ros2 run yahboomcar_multi pub_follower_goal --ros-args -p queue_name:=convoy -p dist:=0.6
Step 2: Start the Follower Goal Listening and Following Node

Open another terminal on the control terminal and run the follower following computation node:

xxxxxxxxxx
ros2 run yahboomcar_multi get_follower_point --ros-args -p robot_id:=robot2

At this point, the follower continuously listens to the point2 relative coordinate published by the leader, and initiates navigation planning toward /robot2/goal_pose based on its absolute position on the map.

2.6 Online Dynamic Parameter Adjustment for Formation Switching (rqt_reconfigure)

Open another terminal on the control terminal and start the dynamic parameter tuning GUI tool:

xxxxxxxxxx
ros2 run rqt_reconfigure rqt_reconfigure

Find the navigation_client node on the left side of the interface, as shown below:

image-20250822144624331

Parameter Adjustment Instructions:

  • queue_name: Formation name. It can be changed to column (column), row (row), or convoy (left/right convoy);
  • dist: The set spacing between the follower and the leader (recommended between 0.5m and 0.8m to avoid obstacle conflicts from the inflation layer when too small).
  • After modifying the parameters in the input box, click on a blank area of the panel to apply the changes immediately.

For example, after switching the formation to row row, the spatial position of point2 in RViz immediately shifts to the flank of the leader, and the follower autonomously re-plans its route to move toward the new formation while maintaining coordinated travel:

image-20250822144808554


3. Core Code In-Depth Analysis

3.1 Leader TF Broadcast and Multi-Waypoint Client (pub_follower_goal.py)

Source code path: ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_multi/yahboomcar_multi/pub_follower_goal.py

pub_follower_goal.py implements multi-waypoint path navigation for the leader vehicle and continuously broadcasts the expected follower positions in the current vehicle-body coordinate frame:

xxxxxxxxxx
import rclpy
from rclpy.node import Node
from rclpy.action import ActionClient
from geometry_msgs.msg import PoseStamped, TransformStamped
from nav2_msgs.action import NavigateThroughPoses
from visualization_msgs.msg import MarkerArray
from tf2_ros.static_transform_broadcaster import StaticTransformBroadcaster
​
class NavigationClient(Node):
    def __init__(self):
        super().__init__('navigation_client')
        # 1. Create the multi-waypoint continuous navigation Action client
        self._client = ActionClient(self, NavigateThroughPoses, '/navigate_through_poses')
        # 2. Subscribe to the RViz path waypoint markers
        self.get_waypoints = self.create_subscription(
            MarkerArray, "/waypoints", self.get_waypointsPoseCallBack, 1
        )
        
        # 3. Create static TF broadcasters to publish the relative coordinates from the leader to the follower goal points
        self.robot1_to_point2_broadcaster = StaticTransformBroadcaster(self)
        self.robot1_to_point3_broadcaster = StaticTransformBroadcaster(self)
        
        # 4. Declare formation and vehicle spacing parameters
        self.declare_parameter("queue_name", "convoy")  # row, convoy, column
        self.declare_parameter("dist", 0.6)
        
        # 5. Timer that polls whether the parameters have been dynamically updated
        self.timer = self.create_timer(0.5, self.on_timer)

Formation Mathematical Geometry Resolution (update_tf):

xxxxxxxxxx
    def update_tf(self, queue_type, dist):
        self.queue = queue_type
        self.dist = dist
        robot2_transform = TransformStamped()
        robot3_transform = TransformStamped()
        
        # The reference frame is the leader chassis coordinate frame
        robot2_transform.header.frame_id = "robot1/base_link"
        robot2_transform.child_frame_id = "point2"
        robot3_transform.header.frame_id = "robot1/base_link"
        robot3_transform.child_frame_id = "point3"
​
        if self.queue == "column":
            # Column: the follower is directly behind the leader along the negative x-axis
            robot2_transform.transform.translation.x = -self.dist
            robot2_transform.transform.translation.y = 0.0
            robot3_transform.transform.translation.x = -self.dist * 2
            robot3_transform.transform.translation.y = 0.0
        elif self.queue == "row":
            # Row: the followers are on the left and right sides of the leader along the y-axis
            robot2_transform.transform.translation.x = 0.0
            robot2_transform.transform.translation.y = -self.dist
            robot3_transform.transform.translation.x = 0.0
            robot3_transform.transform.translation.y = self.dist
        else:  # convoy (left/right escort formation)
            # Left/right convoy: followers form a triangular array at the leader's left-rear and right-rear
            robot2_transform.transform.translation.x = -self.dist
            robot2_transform.transform.translation.y = -self.dist
            robot3_transform.transform.translation.x = -self.dist
            robot3_transform.transform.translation.y = self.dist
            robot2_transform.transform.rotation.w = 1.0
            robot3_transform.transform.rotation.w = 1.0
​
        # Broadcast the relative transforms globally
        self.robot1_to_point2_broadcaster.sendTransform(robot2_transform)
        self.robot1_to_point3_broadcaster.sendTransform(robot3_transform)
  • This design decouples the complex formation geometry constraints into local rigid-body poses relative to the leader chassis robot1/base_link, greatly simplifying the algorithm computation.

3.2 Follower Coordinate Resolution and Goal Publishing (get_follower_point.py)

Source code path: ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_multi/yahboomcar_multi/get_follower_point.py

get_follower_point.py is responsible for back-projecting the local expected point to the global map and delivering it smoothly via dead-zone filtering:

xxxxxxxxxx
import rclpy
from rclpy.node import Node
import tf2_ros
from geometry_msgs.msg import PoseStamped
from scipy.spatial.transform import Rotation as R
​
class TfListenerNode(Node):
    def __init__(self):
        super().__init__('tf_listener_node')
        # 1. Declare the robot identifier (default is robot2)
        self.declare_parameter('robot_id', 'robot2')
        self.robot_id = self.get_parameter('robot_id').get_parameter_value().string_value
        
        # 2. Build the TF2 listening buffer
        self.tf_buffer = tf2_ros.Buffer()
        self.tf_listener = tf2_ros.TransformListener(self.tf_buffer, self)
        
        # 3. Dynamically bind the feature point to be listened to and the topic to publish to
        if self.robot_id == 'robot2':
            self.target_point = 'point2'
        elif self.robot_id == 'robot3':
            self.target_point = 'point3'
        self.pub_topic = f"/{self.robot_id}/goal_pose"
        self.pub_robot_pose = self.create_publisher(PoseStamped, self.pub_topic, 10)
​
        # 4. Periodic query timer (10Hz)
        self.timer = self.create_timer(0.1, self.timer_callback)

Spatial Coordinate Transformation and Dead-Zone Update (get_point):

xxxxxxxxxx
    def get_point(self):
        try:
            # Query the composite transform from the global map to the current follower goal point point2
            transform = self.tf_buffer.lookup_transform('map', self.target_point, rclpy.time.Time())
            
            current_x = transform.transform.translation.x
            current_y = transform.transform.translation.y
            current_z = transform.transform.rotation.z
            current_w = transform.transform.rotation.w
​
            # Dead-zone anti-flicker filtering: trigger a new navigation goal only when the displacement change is > 1cm or the orientation changes
            if (current_z != self.prev_z or current_w != self.prev_w or 
                abs(current_x - self.prev_x) > 0.01 or abs(current_y - self.prev_y) > 0.01):
                
                self.goal_pose.pose.position.x = current_x
                self.goal_pose.pose.position.y = current_y
                self.goal_pose.pose.orientation.z = current_z
                self.goal_pose.pose.orientation.w = current_w
                # Publish the navigation goal to the Nav2 navigation input topic of the follower vehicle
                self.pub_robot_pose.publish(self.goal_pose)
​
                self.prev_z = current_z
                self.prev_w = current_w
                self.prev_x = current_x
                self.prev_y = current_y
​
        except (tf2_ros.TransformException, KeyError) as e:
            self.get_logger().warn(f"坐标变换异常: {e}")
  • Dead-Zone Filtering Protection: A displacement threshold of 0.01m (1cm) is set to avoid frequent Nav2 global re-planning caused by tiny TF jitter, ensuring smooth and steady follower motion;
  • Fully Autonomous Dynamic Following: When the leader turns during driving, point2 rotates with the leader and changes continuously in map. The follower dynamically refreshes the goal point accordingly, achieving a highly realistic formation-following effect.
Multi-vehicle Navigation
CLI Use

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/中文