yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
MicroROS V2 Robot Car📖
01.Introduction
  • 0.Unboxing Video
  • 1. Readme Learning Route
  • 2. Must Read Before Use
  • 3. Introduction to MicroROS V2 Control Board
  • 4. Introduction to LiDAR
  • 5. Introduction to ESP32 Camera Module
  • 6. FAQ
  • 7. About Charging
02.Assembly course
  • Assembly Video
03.Preparation
  • 1. Quickly Start
  • 2. Write Firmware
  • 3. Install VM and Start System
  • 4. Configure VM and Connect Robot
  • 5. Connect to MicroROS Agent
04.Quick start control course
  • 1. VM Keyboard Remote Control
  • 2. VM Handle Remote Control
  • 3. USB Handle Control
05.Robot control course
  • 1. Robot Information Release
  • 2. Robot Keyboard Control
  • 3. Robot Handle Control
  • 4. Robot State Estimation
  • 5. Linear Speed Calibration
  • 6. Angular Velocity Calibration
  • 7. Robot URDF Model
06.Lidar course
  • 1. Precautions for LiDAR Mapping and Navigation
  • 2. Lidar Avoid
  • 3. Lidar Following
  • 4. Lidar Guard
  • 5. Lidar Patrol
  • 6. Gmapping Mapping
  • 7. Cartographer Mapping
  • 8. Cartographer Quickly Repositioning Navigation
  • 9. Slam Toolx Mapping
  • 10. Navigation2 Single Point Navigation
  • 11. Navigation2 Multi Point Navigation
  • 12. Ros Robot App Mapping And Navigation
07.Road network planning
  • 1. Introduction to Road Network Planning and Quick Start
  • 2. Build a Pose Map
  • 3. Road Network Annotation
  • 4. Planning and Navigation Between Road Networks
  • 5. Road Network Navigation in Any Pose
  • 6. Path Replanning
08.Vision basic course
OpenCV Image Processing
  • 1. Introduction to OpenCV Source CV
  • 2. Open Source CV Geometric Transformation
  • 3. Open Source CV Image Processing and Drawing Text Line Segments
  • 4. Open Source CV Image Beautification
09.Visual General Course (For Standard&Superior version)
4. Yolov11&26 Visual Recognition
  • 1. YOLO Environment Setup
  • 2. CLI Usage
  • 3. Object Detection
  • 4. Instance Segmentation
  • 5. Pose Estimation
  • 6. Image Classification
  • 7. Oriented Bounding Boxes Object Detection
  • 8. Model Prediction
1. ESP32 Visual Recognition Module Configuration
  • 1. Serial Port Configuration WiFi Instructions
  • 2. Use ESP32 Camera Module in Robot Car
  • 3. Servo PTZ Calibration
2. OpenCV Visual Recognition
  • 1. Human Pose Estimation
  • 2. Object Detection
  • 3. AR Vision
  • 4. QR Code
  • 5. Color Recognition
  • 6. Facial Recognition
  • 7. AprilTag Machine Code Recognition
3. Mediapipe Visual Recognition
  • 1. Hand Detection
  • 2. Pose Detection
  • 3. Holistic Detection
  • 4. Facial Detection
  • 5. Facial Recognition
  • 6. Facial Special Effects
  • 7. 3D Object Recognition
  • 8. Brush
  • 9. Gesture Recognition
  • 10. Palm Target Localization
  • 11. Fingertip Trajectory Recognition
10.Visual Advanced Course (Just for Standard version)
1. Visual Control
  • 1. QR Code Recognition Control Action
  • 2. AprilTag Control Car Action Group
  • 3. Gesture Control Car Action Group
  • 4. Visual Line Tracking
2. Visual Tracking
  • 1. Color Tracking
  • 2. Facial Tracking
  • 3. QR Code Tracking
  • 4. Object Recognition And Tracking
  • 5. Mediapipe Palm Tracking
  • 6. Mediapipe Gesture Tracking
  • 7. Mediapipe Human Pose Tracking
  • 8. KCF Object Tracking
  • 9. AprilTag Machine Code Tracking
3. Visual Following
  • 1. Color Follow
  • 2. Face Follow
  • 3. QR Code Follow
  • 4. Mediapipe Palm Follow
  • 5. Mediapipe Gesture Follow
  • 6. Mediapipe Human Posture Follow
  • 7. AprilTag Machine Code Follow
  • 8. Object Follow
11.Visual Advanced Course (Just for Superior version)
1. Visual Control
  • 1. QR Code Recognition Control Action
  • 2. AprilTag Control Car Action Group
  • 3. Gesture Control Car Action Group
  • 4. Visual Line Tracking
2. Visual Tracking
  • 1. Color Tracking
  • 2. Facial Tracking
  • 3. QR Code Tracking
  • 4. YOLO Object Recognition and Tracking
  • 5. Mediapipe Palm Tracking
  • 6. Mediapipe Gesture Tracking
  • 7. Mediapipe Human Pose Tracking
  • 8. KCF Object Tracking
  • 9. AprilTag Machine Code Tracking
3. Visual Follow
  • 1. Color Follow
  • 2. Face Follow
  • 3. QR Code Follow
  • 4. Mediapipe Palm Follow
  • 5. Mediapipe Gesture Follow
  • 6. Mediapipe Human Pose Follow
  • 7. AprilTag Machine Code Follow
  • 8. Object Follow
12.AI Large Model Basic and Applications Course
1. AI Large Model Preparation
  • 1.AI Large Model Preparation
2. AI Large Model Basic Course
  • 1. AI Large Model Types and Principles
  • 2. RAG Retrieval Augmented and Training Samples
  • 3. Embodied Intelligent System Architecture
  • 4. Embodied Intelligence Core Source Code
3. AI Large Model Development
  • 1. Register Model Service Account
  • 2. Configure API KEY
  • 3. Dify Introduction
  • 4. Dify Basic Features
  • 5. RAG Knowledge Base Deployment
  • 6. AI Application Development Chatbot
  • 7. RAG Knowledge Base and Chatbot
  • 8. AI Agent Workflow
4. AI Large Model (Text Version)
  • 1. Semantic Understanding and Instruction Following
  • 2. Multimodal Visual Understanding
  • 3. Multimodal Visual Understanding + Basic Control
  • 4. Multimodal Visual Understanding + Object Following
  • 5. Multimodal Visual Understanding + Visual Line Following
  • 6. Multimodal Visual Understanding + SLAM Navigation
  • 7. Multimodal Visual Understanding + SLAM Navigation + Visual Line Following
  • 8. Multimodal Visual Understanding + SLAM Navigation + Object Following
  • 9. Intent Inference + Multimodal Visual Understanding + SLAM Navigation
13.Openclaw Basics Course
  • 1. Openclaw Introduction
  • 2. Openclaw Core Concepts
  • 3. Openclaw Api-Key Configuration
  • 4. Openclaw Switching Models
  • 5. Openclaw System Prompt
  • 6. Openclaw Common CLI Command
14. Openclaw Interaction Course
  • 1. Openclaw Webchat Interaction
  • 2. Openclaw Tui Interaction
  • 3. Openclaw Whatsapp Interaction
15.Openclaw Development Course
  • 1. Openclaw Robot Mcp Service Integration
  • 2. Robot CLI Command Tools
  • 3. Robot-Control Plugin Tools
  • 4. Openclaw Skills Development
  • 5. Openclaw Scheduled Tasks
  • 6. Openclaw Multi Agent System
  • 7. Openclaw Proactive Interaction
  • 8. Openclaw Vector Memory
16.Openclaw Embodied Intelligence Course
  • 1. OpenClaw Natural Interaction + Basic Control
  • 2. OpenClaw Natural Interaction + Slam Navigation
  • 3. OpenClaw Natural Interaction + Multimodal Visual Understand
  • 4. OpenClaw Natural Interaction + Multimodal Visual Understand + Slam Navigation + Visual Follow
  • 5. OpenClaw Natural Interaction + Multimodal Visual Understand + Slam Navigation + Visual Track
17.Multi-machine Course
  • 1. Multi Machine Handle Control
  • 2. Multi Machine Keyboard Control
  • 3. Multi Machine Navigation
18.MicroROS-V2 Control Board Development Environment
  • 1. Set Up the ESP32-IDF Development Environment
  • 2. ESP32-IDF Configuration Tool
  • 3. ESP Flash Tool Flashing Firmware
  • 4. Install ESP32 Microros Components
  • 5. Install And Start Microros Agent
19.MicroROS-V2 Control Board ESP32 Basic Course
  • 1. Led Light Up
  • 2. Button Function
  • 3. Drive Buzzer
  • 4. Oled
  • 5. Usb Host Function
  • 6. Serial Communication
  • 7. Battery Voltage Detection
  • 8. Drive Pwm Servo
  • 9. Drive Motors
  • 10. Read Motor Encoder Data
  • 11. Pid Motor Speed Control
  • 12. Robot Kinematics Analysis Theory
  • 13. Read Imu Data
  • 14. Read Lidar Data
  • 15. Flash Data Storage
  • 16. Custom Partition Table
  • 17. Bluetooth Communication
  • 18. Wifi Connection
  • 19. ESP32 Visual Recognition Module
20.MicroROS-V2 Control Board Micro_ros Basic Course
  • 1. Publish Topics
  • 2. Subscribe To Topics
  • 3. Multi Topic Subscription And Publishing
  • 4. Subscribe To Buzzer Topic
  • 5. Subscribe To Pwm Servo Topic
  • 6. Subscribe To Speed Control Topic
  • 7. Publish Odometry Topic
  • 8. Publish Imu Data Topic
  • 9. Publish Lidar Data Topic
21. 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
22.Docker Course
  • 1.Docker overview and docker installation
  • 2.Common commands for docker image containers
  • 3.Docker images deeply understand and publish images
23.ROS 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
Download
  • Mapping_APP(iOS_Android)
  • Code
  • Software_Tools
  • VM_System_File
  • 3D_Model_File
  • ESP32_Firmware
  • Dify LLM Base
  • Instruction_Manual
  • VMware
Download ZIP

Welcome to MicroROS V2 Robot Car repository

4. Object Recognition And Tracking

Object Recognition And Tracking

YOLO Object Recognition and Tracking (No-PTZ)

1. Experiment Objective

Click any object detected by YOLO with the mouse, and the car rotates to keep tracking it.

2. Model and Configuration Check

The YOLO ONNX follow node reads the configuration file by default:

~/microros_ws/src/yolo_onnx_follow_pkg/config/yolo_onnx_follow_config.yaml

Pay special attention to the following parameters:

xxxxxxxxxx
YOLO_ONNX_FOLLOW:
  model_path: "/home/yahboom/MODELS/yolo/yolo11n.onnx"
  image_topic: "/camera/image_raw"
  input_width: 640
  input_height: 640
  conf_threshold: 0.2
  nms_threshold: 0.45
  max_detections: 3

If the model path on your machine is different (you can replace it with your own trained model), modify model_path, or override it at launch time with model_path:=:

xxxxxxxxxx
ros2 launch yolo_onnx_follow_pkg yolo_onnx_follow.launch.py model_path:=/home/yahboom/MODELS/yolo/yolo11n.onnx

Replacing It with a Custom Model: What Needs to Be Changed in the Program

In general, when switching to a standard YOLOv8/YOLOv11 ONNX model, you do not need to modify the Python source code — only the configuration file:

  • model_path: change it to the path of your own .onnx model.
  • class_names_path: change it to the path of your own class-name file.
  • input_width, input_height: change them to the input size used when exporting the ONNX model.
  • target_class or target_class_id: if you want to automatically follow a certain class of targets, set it here.
  • conf_threshold: lower it when your self-trained model misses detections; raise it when there are many false detections.

There are mainly two cases where you need to modify the source code.

First case: you want to hardcode the class names directly in the program instead of using class_names_path. You can modify COCO_CLASS_NAMES at the top of yolo_onnx_follow_pkg/yolo_onnx_follow_node.py:

xxxxxxxxxx
COCO_CLASS_NAMES = [
    "person",
    "cup",
    "bottle",
]

Using class_names_path is recommended, so you do not have to modify the source code when switching models.

3. Experiment Steps

1. Hardware Preparation

HardwareRequirement
PTZ version❌
No-PTZ version✅
Required peripheralESP32 camera (bracket-mounted)

You need to change the vehicle model to the corresponding one in the .bashrc file:

xxxxxxxxxx
gedit .bashrc

image-20260728162726910

After modifying, save and exit, then run the following command to make it take effect:

xxxxxxxxxx
source ~/.bashrc

2. Start the Agent + Camera + Joint Model (Terminal 1)

xxxxxxxxxx
ros2 launch microros_v2_bringup car_base.launch.py

image-20260728161615714

3. Start YOLO Object Recognition and Tracking (Terminal 2)

xxxxxxxxxx
ros2 launch yolo_onnx_follow_pkg yolo_onnx_follow.launch.py

image-20260728162514724

Click the object to follow with the mouse once it is detected:

image-20260728162603578

Operation Method

After the program starts, an OpenCV window pops up showing the detection boxes, class names, tracking IDs, and confidence scores.

  • Left-click a target box: select it and start following that target.
  • r: clear the current target, stop chassis steering, and re-select a target.
  • q or Esc: exit the program; on exit it publishes a stop velocity and returns the PTZ gimbal to its initial angle.

Normal behavior:

  • Green detection boxes appear in the window.
  • The target box turns yellow after being clicked.
  • When the target deviates from the frame center, the PTZ gimbal rotates first to correct it.
  • When the PTZ horizontal angle deviation is large, the chassis publishes angular.z to turn in place.
  • When the target has been lost for longer than the threshold, the chassis stops steering; if a target of the same class reappears near its previous position within a short time, the program attempts to reacquire it.

At this point, slowly move the detected object, and the PTZ gimbal and the car chassis will track it.

4. Source Code Explanation

4.1 File Structure

xxxxxxxxxx
yolo_onnx_follow_pkg/
├── launch/
│   └── yolo_onnx_follow.launch.py
├── config/
│   └── yolo_onnx_follow_config.yaml
├── yolo_onnx_follow_pkg/
│   ├── yolo_onnx_follow_node.py
│   └── ptz_controller.py
├── setup.py
└── package.xml

4.2 Configuration File

config/yolo_onnx_follow_config.yaml is divided into three main sections:

  • SYSTEM: configures the chassis velocity topic, default /cmd_vel.
  • PTZ: configures the PTZ angle topic, servo limits, initial angle, publish count, and whether to return to center after stopping.
  • YOLO_ONNX_FOLLOW: configures the model path, image topic, detection thresholds, window display, target selection, tracking reacquisition, and control parameters.

Commonly tuned parameters:

ParameterDescription
conf_thresholdDetection confidence threshold; the lower it is, the easier detections are, but also the more false detections
max_detectionsMaximum number of high-confidence detection boxes kept per frame
max_inference_rate_hzMaximum inference rate; lower it if performance is insufficient
follow_rate_hzFollow control rate
pixel_toleranceWhen the target center error is smaller than this pixel value, the PTZ is not corrected
kp_x, kd_xPTZ horizontal control parameters
kp_y, kd_yPTZ tilt control parameters
max_step_xyMaximum PTZ angle step per control cycle
enable_body_turn_followWhether to allow the chassis to turn following the PTZ horizontal deflection
body_kp, body_kdChassis steering control parameters
max_angular_zMaximum chassis angular velocity

4.3 Core Source Code Explanation

The main program file is:

xxxxxxxxxx
yolo_onnx_follow_pkg/yolo_onnx_follow_node.py

Its core workflow can be summarized as:

xxxxxxxxxx
Read configuration -> initialize ROS topics -> load ONNX model -> receive camera images
-> YOLO inference -> NMS filtering -> assign tracking IDs -> select/reacquire target
-> compute PTZ angles -> compute chassis angular velocity -> publish control commands

4.3.1 Detection Data Structure

Detection is used to store the information of each detection box:

xxxxxxxxxx
@dataclass
class Detection:
    bbox: tuple[float, float, float, float]
    score: float
    class_id: int
    class_name: str
    track_id: int = -1

Where:

  • bbox: detection box coordinates in the format (x1, y1, x2, y2).
  • score: confidence score.
  • class_id: class ID.
  • class_name: class name.
  • track_id: a temporary tracking ID assigned to the target internally by the program.

cx, cy, width, and height are property functions used to quickly get the target center point and box size; the subsequent PTZ control mainly uses cx and cy.

4.3.2 SimpleIouTracker Tracking ID Assignment

SimpleIouTracker is a lightweight local tracker that does not depend on additional tracking libraries. It ensures that the same object in consecutive frames keeps the same ID as much as possible.

The core logic is in update():

xxxxxxxxxx
tracked = self.tracker.update(
    detections, image_width=frame.shape[1], image_height=frame.shape[0]
)

Matching order:

  1. First compute the IoU for targets of the same class; when the IoU is greater than track_iou_threshold, the old ID is inherited.
  2. If IoU matching fails, fall back to matching by the center-point distance of targets of the same class.
  3. If it still cannot be matched, assign a new track_id.

The purpose is to reduce tracking jitter when objects of the same class move quickly, when detection boxes suddenly grow or shrink, or when IDs temporarily jump.

Related configuration:

xxxxxxxxxx
track_iou_threshold: 0.2
track_center_threshold_ratio: 0.12
track_max_lost_frames: 30

The larger track_center_threshold_ratio is, the easier it is to merge nearby targets of the same class into the same ID; however, if several same-class targets are very close together in the frame, a value that is too large may cause incorrect matching.

4.3.3 Model Loading _load_model()

_load_model() is responsible for checking the model path and loading the ONNX model:

xxxxxxxxxx
model_path = str(self.demo_config.get("model_path", "") or "")
if not model_path or not os.path.exists(model_path):
    raise FileNotFoundError(...)
self.net = cv2.dnn.readNetFromONNX(model_path)

If use_cuda is true, the program tries to use the CUDA backend of OpenCV DNN:

xxxxxxxxxx
self.net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
self.net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA_FP16)

If the current OpenCV has no CUDA support, keep this in the configuration:

xxxxxxxxxx
use_cuda: false

4.3.4 Image Callback _image_callback()

After a camera image enters the program, it is first converted to an OpenCV image via cv_bridge:

xxxxxxxxxx
frame = self.bridge.imgmsg_to_cv2(msg, "bgr8")

Then max_inference_rate_hz is used to limit the maximum inference rate, avoiding running inference on every frame and saturating the CPU:

xxxxxxxxxx
if now - self.last_inference_time < 1.0 / max_rate:
    return

The actual recognition and tracking workflow is:

xxxxxxxxxx
detections = self._run_yolo(frame)
tracked = self.tracker.update(detections, image_width=frame.shape[1], image_height=frame.shape[0])
self._update_selected_target(tracked, frame.shape[1], frame.shape[0])

That is, first YOLO detection, then ID assignment, and finally updating the target currently being followed.

4.3.5 YOLO Inference _run_yolo() and Result Parsing _decode_outputs()

_run_yolo() first letterboxes the original image to the model input size:

xxxxxxxxxx
letterboxed, scale, pad_x, pad_y = self._letterbox(frame, input_w, input_h)

Then it constructs a blob and runs the ONNX forward inference:

xxxxxxxxxx
blob = cv2.dnn.blobFromImage(letterboxed, 1.0 / 255.0, (input_w, input_h), swapRB=True, crop=False)
self.net.setInput(blob)
outputs = self.net.forward()

_decode_outputs() does four things:

  1. Calls _parse_yolo_row() to parse each output row.
  2. Uses conf_threshold to filter out low-confidence results.
  3. Uses cv2.dnn.NMSBoxes() to remove duplicate boxes.
  4. Sorts by confidence and keeps only max_detections targets.

The current default configuration is:

xxxxxxxxxx
conf_threshold: 0.2
max_detections: 3

Therefore, the window displays at most the 3 targets with the highest confidence, reducing the interference of cluttered detection boxes on selection and tracking.

4.3.6 Target Selection and Reacquisition

There are mainly two entry points for target selection:

  • _on_mouse(): after clicking a detection box in the window with the mouse, records the target's track_id and class.
  • _select_detection(): finds the target that should currently be followed from the detection results each frame.

After clicking a target, the program saves:

xxxxxxxxxx
self.selected_track_id = int(detection.track_id)
self.selected_class_id = int(detection.class_id)
self.selected_last_bbox = detection.bbox

If the same track_id can still be found in the next frame, tracking continues directly. If the ID jumps, _try_reacquire_selected_detection() is entered to re-find the target based on the same class and the previous frame's position.

The reacquisition score considers three factors:

  • The IoU with the previous frame's detection box.
  • The distance to the previous frame's target center point.
  • The confidence of the current detection box.

Related configuration:

xxxxxxxxxx
reacquire_enable: true
reacquire_iou_threshold: 0.05
QR Code Tracking
Mediapipe Palm Tracking

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