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. YOLO Object Recognition and Tracking

YOLO Object Recognition and Tracking (PTZ)

1. Experiment Objective

Click any YOLO-detected object with the mouse, and the car body 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

Focus on 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 differs (you can replace it with your own trained model), modify model_path, or override it at launch with model_path:=:

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

Replacing the Model with a Custom One

In general, if you only switch to a standard YOLOv8/YOLOv11 ONNX model, you do not need to change the Python source code; you only need to edit the configuration file:

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

There are mainly two cases that require changing the source code.

First: if you want to hard-code the class names directly in the program instead of using class_names_path, modify the 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 instead, so you do not need to change the source code when switching models.

3. Experiment Steps

1. Hardware Preparation

HardwareRequirement
PTZ version❌
No-PTZ version✅
Required peripheralsESP32 camera (fixed on a bracket)

Change the car model in the .bashrc file to the corresponding model:

xxxxxxxxxx
gedit .bashrc

image-20260811143316297

After editing, save and exit, then run the following command to apply the changes:

xxxxxxxxxx
source ~/.bashrc

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

xxxxxxxxxx
ros2 launch microros_v2_bringup car_base.launch.py

image-20260728161615714

3. Start Object Recognition and Tracking (Terminal 2)

xxxxxxxxxx
ros2 launch yolo_onnx_follow_pkg yolo_onnx_follow.launch.py

image-20260728191204720

Click the object you want to follow in the detected results with the mouse:

image-20260728191231088

Operation Instructions

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 and start following that target.
  • r: clear the current target, stop the chassis turning, and re-select a target.
  • q or Esc: exit the program; on exit it publishes a stop velocity and returns the pan-tilt to its initial angle.

Normal operation:

  • Green detection boxes appear in the window.
  • The target box turns yellow after being clicked.
  • When the target deviates from the frame center, the pan-tilt turns first to correct.
  • When the pan-tilt horizontal angle deviates a lot, the chassis publishes angular.z to turn in place.
  • After the target-lost time exceeds the threshold, the chassis stops turning; if a target of the same class reappears nearby within a short time, the program tries to re-acquire it.

Now slowly move the recognized object, and the pan-tilt and car chassis will track it.

4. Source Code Analysis

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, /cmd_vel by default.
  • PTZ: configures the pan-tilt angle topic, servo limits, initial angle, publish count, and whether to recenter after stopping.
  • YOLO_ONNX_FOLLOW: configures the model path, image topic, detection thresholds, window display, target selection, tracking re-acquisition, and control parameters.

Commonly tuned parameters:

ParameterDescription
conf_thresholdDetection confidence threshold; lower values detect more easily but also cause more false positives
max_detectionsMaximum number of high-confidence detection boxes kept per frame
max_inference_rate_hzMaximum inference rate; lower it when performance is insufficient
follow_rate_hzFollow control rate
pixel_toleranceThe pan-tilt is not corrected when the target center error is smaller than this pixel value
kp_x, kd_xPan-tilt horizontal control parameters
kp_y, kd_yPan-tilt tilt control parameters
max_step_xyMaximum pan-tilt angle step per control cycle
enable_body_turn_followWhether the chassis is allowed to turn following the pan-tilt horizontal deviation
body_kp, body_kdChassis turning control parameters
max_angular_zMaximum chassis angular velocity

4.3 Core Source Code Analysis

The main program file is:

xxxxxxxxxx
yolo_onnx_follow_pkg/yolo_onnx_follow_node.py

Its core flow can be summarized as:

xxxxxxxxxx
Load config -> initialize ROS topics -> load the ONNX model -> receive camera images
-> YOLO inference -> NMS filtering -> assign tracking IDs -> select/re-acquire the target
-> compute the pan-tilt angle -> compute the chassis angular velocity -> publish control commands

4.3.1 Detection Data Structure

Detection stores 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 index.
  • class_name: class name.
  • track_id: the temporary tracking ID assigned to the target internally by the program.

cx, cy, width, and height are property functions that quickly give the target center and box size; the subsequent pan-tilt control mainly uses cx and cy.

4.3.2 SimpleIouTracker Tracking ID Assignment

SimpleIouTracker is a lightweight local tracker that does not depend on any external tracking library. Its purpose is to keep the same object in consecutive frames assigned 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. Compute IoU against same-class targets first; inherit the old ID when the IoU is greater than track_iou_threshold.
  2. If IoU matching fails, use the center-point distance between same-class targets as a fallback match.
  3. If it still does not match, assign a new track_id.

This reduces follow jitter when same-class objects move fast, when detection boxes suddenly grow or shrink, or when IDs briefly jump.

Related configuration:

xxxxxxxxxx
track_iou_threshold: 0.2
track_center_threshold_ratio: 0.12
track_max_lost_frames: 30

A larger track_center_threshold_ratio makes it easier to join nearby same-class targets into the same ID; however, if several same-class targets are close together in the frame, a value that is too large may cause wrong matches.

4.3.3 Model Loading _load_model()

_load_model() checks the model path and loads 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 OpenCV DNN CUDA backend:

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 the following in the configuration:

xxxxxxxxxx
use_cuda: false

4.3.4 Image Callback _image_callback()

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

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

The maximum inference rate is then limited by max_inference_rate_hz to avoid saturating the CPU by inferring on every frame:

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

The actual recognition and tracking flow 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])

In other words: YOLO detection first, then ID assignment, and finally updating the target to follow.

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)

It then builds the 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. Filters low-confidence results with conf_threshold.
  3. Removes duplicate boxes with cv2.dnn.NMSBoxes().
  4. Sorts by confidence and keeps only max_detections targets.

The current default configuration is:

xxxxxxxxxx
conf_threshold: 0.2
max_detections: 3

So the window shows at most the 3 highest-confidence targets, reducing interference from cluttered detection boxes during selection and tracking.

4.3.6 Target Selection and Re-acquisition

There are two main entry points for target selection:

  • _on_mouse(): after clicking a detection box in the window, 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, it keeps following directly. If the ID has jumped, it enters _try_reacquire_selected_detection() to find the target again by the same class and the previous frame's position.

The re-acquisition score considers three factors:

  • IoU with the previous frame's detection box.
  • Distance from the previous frame's target center.
  • The current detection box's confidence.

Related configuration:

xxxxxxxxxx
reacquire_enable: true
reacquire_iou_threshold: 0.05
reacquire_max_center_ratio: 0.45
reacquire_max_lost_frames: 30
reacquire_score_weight: 0.15

_smooth_target_center() smooths the target center point:

xxxxxxxxxx
target_center_smoothing_alpha: 0.65

The smaller this parameter, the smoother the target center, but the slower the response; the closer to 1.0, the faster the response, but the more visible the frame detection jitter.

4.3.7 OpenCV Display and Keys

_show_frame() draws the detection boxes, class names, IDs, and status information:

  • Regular detection boxes are green.
  • The currently followed target is yellow.
  • The top shows the current frame count, detection count, image latency, and inference time.

_handle_window_key() handles keyboard input:

xxxxxxxxxx
if key in (ord("r"), ord("R")):
    self._clear_selection()
elif key in (ord("q"), ord("Q"), 27):
    self.shutdown_requested = True

Pressing r clears the current target and publishes zero velocity; pressing q or Esc exits the program.

4.3.8 Pan-Tilt Following _apply_ptz_follow()

The input to pan-tilt following is the target center point:

xxxxxxxxxx
err_x = float(state["cx"]) - half_w
err_y = float(state["cy"]) - half_h

If the error is smaller than pixel_tolerance, no correction is made to avoid small jitter:

xxxxxxxxxx
if abs(err_x) <= cfg["pixel_tolerance"]:
    step_x = 0.0

Otherwise, the error is normalized and the angle step is computed with P+D control:

xxxxxxxxxx
out_x = clamp(cfg["ptz_kp"] * norm_x + cfg["ptz_kd"] * deriv_x, -1.0, 1.0)
step_x = out_x * cfg["max_ptz_step"]

Finally, the pan-tilt angle is published through PtzController.publish_servo_angles():

xxxxxxxxxx
self.ptz.publish_servo_angles(
    servo1_angle=...,
    servo2_angle=...,
    repeat=False,
)

If the pan-tilt moves in the wrong direction, first change the following in the configuration:

xxxxxxxxxx
sign_x: 1.0
sign_y: -1.0

4.3.9 Chassis Turning _compute_body_turn()

The chassis does not turn directly from the image pixel error; instead it turns according to the pan-tilt horizontal deviation. This way the pan-tilt chases the target first, and the chassis then slowly turns the car body back toward the target direction.

The judgment logic:

xxxxxxxxxx
if abs(servo_err) >= cfg["servo1_engage_deg"]:
    self.body_correcting = True
elif abs(servo_err) <= cfg["body_tolerance_deg"]:
    self.body_correcting = False

That is:

  • When the pan-tilt horizontal deviation exceeds servo1_engage_deg, the chassis starts turning.
  • When the pan-tilt returns within the body_tolerance_deg range, the chassis stops turning.

Chassis angular velocity computation:

xxxxxxxxxx
angular_z = cfg["body_dir"] * (
    cfg["body_kp"] * servo_err + cfg["body_kd"] * deriv
)
angular_z = clamp(angular_z, -cfg["max_angular_z"], cfg["max_angular_z"])

If the chassis turning direction is wrong, modify:

xxxxxxxxxx
body_dir: -1.0

If the chassis turns too slowly, increase body_kp appropriately; if it turns too aggressively, reduce body_kp or max_angular_z.

4.3.10 PTZ Controller ptz_controller.py

ptz_controller.py encapsulates the pan-tilt angle publishing logic. The topic it publishes is:

xxxxxxxxxx
/cmd_ptz_angle

The message type is:

xxxxxxxxxx
geometry_msgs/msg/Vector3

Where:

  • Vector3.x: horizontal servo angle.
  • Vector3.y: tilt servo angle.
  • Vector3.z: currently unused.

publish_servo_angles() clamps the angles with the servo limits before publishing:

xxxxxxxxxx
self.servo1_angle = clamp(new_servo1_angle, self.servo1_min_angle, self.servo1_max_angle)
self.servo2_angle = clamp(new_servo2_angle, self.servo2_min_angle, self.servo2_max_angle)

On program exit, recenter_after_stop() returns the pan-tilt to its initial angle.

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