yahboom
HomeTutorialsProduct
Solution
Blog
Online Store
About Us
EN/中文
Store
ROSMASTER M1 PRO📖
0.Robot Configuration and Operation Guidelines
  • 0.Unboxing and Review
  • 1.Assembly Videos
  • 2.User Manual
  • 3.Enter Docker (For Raspberry Pi)
  • 4.FAQ
  • 5.RobotManager User Guide
1.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
2.Lidar Course
  • 1.Lidar Introduction And Use
  • 2.Lidar Obstacle Avoidance
  • 3.Lidar Following
  • 4.Lidar Guard
  • 5.Lidar Patrol
  • 6.GMapping-SLAM Mapping
  • 7.Cartographer-SLAM Mapping
  • 8.Slam-Toolbox Mapping
  • 9.Lifelong Mode Mapping
  • 10.Navigation2 Single Point Navigation
  • 11.Navigation2 Multi Point Navigation
  • 12.Cartographer Relocalization Navigation
  • 13.Slam-Toolbox Localization Navigation
  • 14.Synchronous Mapping And Navigation
  • 15.Aruco Visual Relocalization Navigation
  • 16.Mobile App Mapping And Navigation
3.USB Camera-Depth Camera Course
  • 1.USB Camera Introduction
  • 2.USB Camera Intrinsic Calibration
  • 3.Nuwa-HP60C Camera Introduction (Depth Camera Only)
  • 4.Depth Pseudo Color Image (Depth Camera Only)
  • 5.Depth Camera Distance Measurement (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)
4.Robotic Arm and 3D Space Gripping Course
  • 1.Robotic Arm Basic Usage
  • 2.Robotic Arm Kinematics
  • 3.Robotic Arm Chassis Coordination Control
  • 4.AprilTag ID Sorting
  • 5.AprilTag Height Anomaly Sorting
  • 6.AprilTag Tracking and Grasping
  • 7.Color Block Sorting
  • 8.Color Block Height Anomaly Sorting
  • 9.Color Block Tracking and Grasping
  • 10.Wood Block Shape Sorting
  • 11.KCF Tracking and Grasping Objects
  • 12.Mediapipe Gesture ID Sorting AprilTag
  • 13.Mediapipe Gesture Height Sorting AprilTag
  • 14.Desktop Tracking and Grasping AprilTag
  • 15.3D Spatial Tracking AprilTag
  • 16.Transformer Model Tracking Algorithm
  • 17.Line Following Obstacle Clearing
5.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
6.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
7.OpenClaw Interaction Method
  • 1.OpenClaw Webchat Interaction
  • 2.OpenClaw Tui Interaction
  • 3.OpenClaw Voice Dialogue Interaction
  • 4.OpenClaw WhatsApp Interaction
8.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
9.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 Props Placement
  • 2.Building the Sandbox Map
  • 3.Visual Relocalization Marker
  • 4.Map Mapping Marker
  • 5.Sandbox Scenario Comprehensive Case
11.AI Large 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 large Model Development
  • 1.Register a Model Service Provider Account
  • 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 - Voice Version
  • 1.Semantic Understanding and Command Following
  • 2.Multimodal Visual Understanding
  • 3.Multimodal Visual Understanding and Robotic Arm Gripping
  • 4.Multimodal Visual Understanding and SLAM Navigation
  • 5.Robotic arm gripping+Multimodal visual understand+SLAM navigation
  • 6.Intention Understanding
14.AI Model - Text Version
  • 1.Semantic Understanding and Command Following
  • 2.Multimodal Visual Understanding
  • 3.Multimodal Visual Understanding and Robotic Arm Gripping
  • 4.Multimodal Visual Understanding and 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 robotic arm
  • 13.Gesture grabbing and releasing objects
  • 14.Finger control robotic arm
  • 15.Medipipe gesture control robotic arm action 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.Trajectory Planning
  • 8.Collision Detection
  • 9.Scene Design
  • 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
  • System File
  • Code
  • 3D Model File
  • Software Tools
  • Hardware_Info
  • Deb function package
  • Dify AI Agent
Download ZIP

Welcome to ROSMASTER M1 PRO repository

7.Color Block Sorting

Color Block Color Sorting

Color Block Color Sorting1. Course Content2. Preparation3. Case Demonstration4. Color Block Color Calibration5. Core Source Code AnalysisDepth Camera Mode _pixel_to_measureMonocular Camera Mode _block_pnp_to_measure

1. Course Content

  • This feature implements the program acquiring images through the camera and, according to the key input, selecting the color of the color block to be sorted. The program will recognize the color blocks that meet the requirements, grasp them, and finally place them in a set position.

Important

The grasping point calculation methods differ between the depth camera and the USB monocular camera: the depth camera obtains the spatial coordinates of the target center point through the depth map, while the monocular camera performs PnP solving to obtain the spatial position of the target center point using a known side length (0.03m)

 

The wooden block used in this section: 30x30x30mm color block

2. Preparation

ros2 launch yahboomcar_bringup arm_demo.launch.py demo:=color_sort_lab

image-20260915205744177

 

3. Case Demonstration

  • Place the 30x30x30mm color block provided with the product below the camera. After the color block appears in the image, select the color block color using the following keys:

  • Key R: detect and sort the red block

  • Key G: detect and sort the green block

  • Key B: detect and sort the blue block

  • Key Y: detect and sort the yellow block

  • After pressing the spacebar, the chassis will first align with the target. After the chassis alignment with the target is complete, grasping is performed. After grasping is complete, the block is placed in different positions according to the color block's color. The robotic arm then resets, and pressing the spacebar again allows the next sorting round.

 

4. Color Block Color Calibration

  • Due to lighting reasons, the preset LAB values in the program may not accurately distinguish the color blocks. In this case, the detected color can be calibrated. Here, calibrating the green block is taken as an example

  • Press G to select detection of the green block

image-20260915210459968

  • Press C to perform color calibration

    • Use the left mouse button to drag and draw a rectangular box on the color block to be recognized, then release the mouse and check whether the binarized image can accurately recognize the target color. The slider below can fine-tune the LAB values

image-20260915210755320

  • Press the S key to save the calibration values to the parameter file, and press ESC to exit calibration

image-20260915210934836

 

  • After that, the normal color sorting flow can be carried out

image-20260915211224225

 

5. Core Source Code Analysis

  • Program path:

xxxxxxxxxx
~/yahboomcar_ros2_ws/yahboomcar_ws/src/common_demo/common_demo/arm_demo/color_sort_lab.py

Depth Camera Mode _pixel_to_measure

Use "detection box center pixel + corresponding depth value" for pinhole back-projection:

  1. Get depth: depth_z = depth_image[py, px] / 1000.0 (mm→m); ≤0.01m is regarded as invalid and returns None

  2. Back-project to the camera optical frame (using the intrinsic parameters fx, fy, cx, cy):

Xc=(u−cx) zfx,Yc=(v−cy) zfy,Zc=z
  1. TF2 transform: construct a PointStamped (frame is the depth image's frame_id), and use tf_buffer.transform(..., 'measure') to transform to the measure frame; retry 5 times on failure

  2. Offset correction: add the depth_measure parameter → [mx, my, mz]

Monocular Camera Mode _block_pnp_to_measure

Prerequisite: the target is a square block with a known side length square_size; use cv2.solvePnP to solve the pose:

  1. Tolerance 1: the minimum enclosing rectangle must be approximately square (aspect ratio ≤1.5), otherwise it is discarded

  2. Corner pairing: sort the 4 corners of minAreaRect in the order top-left→top-right→bottom-right→bottom-left (using coordinate sum/difference extrema), matching one-to-one with the square 3D corners centered at the origin with side length square_size on the Z=0 plane

  3. solvePnP: solve for the camera-frame pose rvec/tvec; tvec is the coordinates of the block center in the camera frame

  4. Tolerance 2: discard if the reprojection error >5px

  5. Tolerance 3: the camera-frame depth cam_z must be within 0.02∼0.8 m (the robotic arm's working range)

  6. TF2 transform + add the usb_camera_measure offset correction → [mx, my, mz]

 

​x
   def _pixel_to_measure(self, pixel_x, pixel_y, depth_image,
                          camera_frame_id):
        if self.camera_K is None:
            return None

        h, w = depth_image.shape
        px, py = int(round(pixel_x)), int(round(pixel_y))

        if px < 0 or px >= w or py < 0 or py >= h:
            return None

        # Depth value: mm -> m
        depth_z = depth_image[py, px] / 1000.0
        if depth_z <= 0.01:
            return None

        # Pixel coordinates -> camera optical coordinates
        fx = self.camera_K[0, 0]
        fy = self.camera_K[1, 1]
        cx = self.camera_K[0, 2]
        cy = self.camera_K[1, 2]

        cam_x = (pixel_x - cx) * depth_z / fx
        cam_y = (pixel_y - cy) * depth_z / fy
        cam_z = depth_z

        # Build the point in the camera frame
        point_cam = PointStamped()
        point_cam.header.stamp = rclpy.time.Time(seconds=0).to_msg()
        point_cam.header.frame_id = camera_frame_id
        point_cam.point.x = float(cam_x)
        point_cam.point.y = float(cam_y)
        point_cam.point.z = float(cam_z)

        # TF2 transform to the measure frame
        try:
            for attempt in range(5):
                try:
                    point_measure = self.tf_buffer.transform(
                        point_cam, 'measure',
                        timeout=Duration(seconds=1.0)
                    )
                    # Apply the depth_measure offset
                    mx = point_measure.point.x + self.depth_measure[0]
                    my = point_measure.point.y + self.depth_measure[1]
                    mz = point_measure.point.z + self.depth_measure[2]
                    return [mx, my, mz]
                except Exception:
                    if attempt < 4:
                        time.sleep(0.05)
                        continue
                    raise
        except Exception as e:
            self.get_logger().warn(f"TF to 'measure' failed: {e}")
            return None

    def _block_pnp_to_measure(self, block, camera_frame_id):
        """Monocular-mode pose estimation: the block is a fixed square (side length square_size);
        uses the 4 corners of the minimum enclosing rectangle as image points, solvePnP solves the camera-frame pose, then it is transformed to the measure frame
        """
        if self.camera_K is None:
            return None

        # Tolerance check 1: the bounding rectangle should be nearly square; filter out non-block contours
        _, (w, h), _ = block['rect']
        if w <= 1.0 or h <= 1.0:
            return None
        aspect = max(w, h) / min(w, h)
        if aspect > 1.5:
            return None

        # Sort the 4 corners: top-left -> top-right -> bottom-right -> bottom-left, matching the 3D object points one-to-one
        box = cv2.boxPoints(block['rect']).astype(np.float64)
        s = box.sum(axis=1)
        d = np.diff(box, axis=1).flatten()
        img_points = np.array([
            box[np.argmin(s)],   # top-left
            box[np.argmin(d)],   # top-right
            box[np.argmax(s)],   # bottom-right
            box[np.argmax(d)],   # bottom-left
        ], dtype=np.float64)

        # Square 3D corners (Z=0 plane, origin at the block center)
        half = self.square_size / 2.0
        obj_points = np.array([
            [-half, -half, 0.0],
            [ half, -half, 0.0],
            [ half,  half, 0.0],
            [-half,  half, 0.0],
        ], dtype=np.float64)

        success, rvec, tvec = cv2.solvePnP(
            obj_points, img_points, self.camera_K, None
        )
        if not success:
            return None

        # Tolerance check 2: an excessive reprojection error means the corners do not match the square assumption
        reproj, _ = cv2.projectPoints(
            obj_points, rvec, tvec, self.camera_K, None
        )
        reproj_err = float(np.mean(np.linalg.norm(
            reproj.reshape(-1, 2) - img_points, axis=1
        )))
        if reproj_err > 5.0:
            return None

        cam_x, cam_y, cam_z = tvec[0][0], tvec[1][0], tvec[2][0]
        # Tolerance check 3: the depth should be within the arm's working range
        if cam_z < 0.02 or cam_z > 0.8:
            return None

        point_cam = PointStamped()
        point_cam.header.stamp = rclpy.time.Time(seconds=0).to_msg()
        point_cam.header.frame_id = camera_frame_id
        point_cam.point.x = float(cam_x)
        point_cam.point.y = float(cam_y)
        point_cam.point.z = float(cam_z)

        try:
            for attempt in range(5):
                try:
                    point_measure = self.tf_buffer.transform(
                        point_cam, 'measure',
                        timeout=Duration(seconds=1.0)
                    )
                    # Apply the usb_camera_measure offset to compensate for measurement error
                    mx = point_measure.point.x + self.usb_camera_measure[0]
                    my = point_measure.point.y + self.usb_camera_measure[1]
                    mz = point_measure.point.z + self.usb_camera_measure[2]
                    return [mx, my, mz]
                except Exception:
                    if attempt < 4:
                        time.sleep(0.05)
                        continue
                    raise
        except Exception as e:
            self.get_logger().warn(f"TF to 'measure' failed: {e}")
            return None

 

AprilTag Tracking and Grasping
Color Block Height Anomaly Sorting

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