yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
DOFBOT SE📖
1.First Trial
  • 1.First Trial
  • 2.Analysis of common problems
  • 3.Calibration offset
  • 4.Precautions for DIY Robotic Arm
  • 5.Robotic arm gripping anomaly solutions
2.Assembly Course
  • 1.Installation video
  • 2.Calibrate the Robotic Arm
  • 3.Install the map
3.Remote Control Course
  • 1.Mobile APP control
  • 2.USB handle control
  • 3.PC software control
4.Preparation
  • 1.Manage APP control service
  • 2.Manage JupyterLab service
  • 3.Write STM32 firmware
  • 4.Introduction to expansion board
5.Basic Control Course
  • 1.Control RGB light
  • 2.Control buzzer
  • 3.Control single servo
  • 4.Read servo angle
  • 5.Control all servo
  • 6.DOFBOT up down left right
  • 7.DOFBOT dancing
  • 8.DOFBOT memory action
  • 9.DOFBOT grab block
  • 10.Porter
  • 11.Stack block
  • 12.USB camera display
  • 13.Synchronous action
6.AI Vision Basic Course
  • 1.Gesture Recognition
  • 2.Color threshold adjustment Color calibration
  • 3.Color recognition
  • 4.Face recognition
  • 5.Garbage recognition
  • 6.Yolo object recognition
  • 7.Real-time web view
7.2D Visual Tracking Course
  • 1.PID algorithm basics
  • 2.Color block positioning
  • 3.Color block tracking
  • 4.Face positioning
  • 5.Face tracking
  • 6.Gesture recognition fixed action
8.2D Visual Grasping Course
  • 0.Visual positioning
  • 1.Gesture recognition stack blocks
  • 2.Color recognition grab blocks
  • 3.Catch game
  • 4.Color sorting and stacking
  • 5.Garbage sorting
  • 6.Color interaction
9.2D Mediapipe Course
  • 1.Hand detection
  • 2.Posture detection
  • 3.Overall inspection
  • 4.Face detection
  • 5.Face recognition
  • 6.Face effects
  • 7.3D object recognition
  • 8.Paintbrush
  • 9.Finger control
  • 10.Gesture recognition
  • 11.Gesture control robotic arm action group
  • 12.Arm posture control robotic arm
  • 13.Palm Targeting
  • 14.Robotic arm tracks the palm
  • 15.Fingertip trajectory recognition
  • 16.Fingertip trajectory control robotic arm
  • 17.Gesture Grasp and Release Objects
  • 18.Finger Control Robot Arm
10.AI Large Model Voice Module (Must Read)
  • 1. Introduction to AI Large Model Voice Module
  • 2. Flash the firmware (Must read)
  • 3. Modify the wake-up word and command word
11.2D Voice Control Course
  • 1.Simple Voice Control
  • 2.Smart Voice Control
  • 3.Voice Action Control
  • 4.Memory Learning Mode
  • 5.Color Recognition with Voice Broadcast
  • 6.Color Recognition and Grasping with Voice Broadcast
  • 7.Color Recognition and Sorting with Voice Broadcast
  • 8.Voice Recognition Target Tracking
  • 9.Voice Control Stacking
  • 10.Voice Control Color Sorting
  • 11.Garbage Recognition with Voice Broadcast
  • 12.Garbage Sorting with Voice Broadcast
12.Robotic Arm Control and Inverse Kinematics
  • 1. Robotic arm ROS control
  • 2. Inverse solution
13.3D Sorting and Grasping Course
  • 1.AprilTag ID sorting
  • 2.MediaPipe Gesture-AprilTag ID sorting
  • 3.MediaPipe Gesture-AprilTag distance sorting
  • 4.Block color sorting
  • 5.Block different shape sorting
  • 6.Yolov11 garbage sorting
14.3D Tracking Course
  • 1.AprilTag Tracking
  • 2.Color Block Tracking
  • 3.KCF Object Tracking
15.3D Voice Control for Sorting & Tracking Course
  • 1.Voice Control AprilTag ID Sorting
  • 2.Voice Control Color Block Sorting
  • 3.Voice Control Yolov11 Garbage Recognition Sorting
  • 4.Voice Control AprilTag Tracking
  • 5.Voice Control Color Block Tracking
  • 6.Voice Control Object Tracking
16.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
17.AI Model Development
  • 1. Register a model service provider account
  • 2. Configure 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
18.AI Model – Text Version
  • 1.Semantic understand instruction following
  • 2.Multimodal visual understand
  • 3.Text Large Model + robotic arm control
  • 4.Multimodal Large Model+video understanding
  • 5.Multimodal Large Model+robotic arm gripping
  • 6.Multimodal Large Model+robotic arm tracking
  • 7.Multimodal Large Model+robotic arm sorting
  • 8.Multimodal Large Model+robotic arm handling
  • 9.Multimodal Large Model+Color Blocks Back In Place
  • 10.Multimodal Large Model + Intent Prediction + Robotic Arm Gripping
  • 11.Text Large Model + YOLOv11 + Intelligent Garbage Classification
19.AI Model – Voice Version
  • 1.Semantic understand instruction following
  • 2.Multimodal visual understand
  • 3.Text Large Model + robotic arm control
  • 4.Multimodal Large Model+video understanding
  • 5.Multimodal Large Model+robotic arm gripping
  • 6.Multimodal Large Model+robotic arm tracking
  • 7.Multimodal Large Model+robotic arm sorting
  • 8.Multimodal Large Model+robotic arm handling
  • 9.Multimodal Large Model+Color Blocks Back In Place
  • 10.Multimodal Large Model + Intent Prediction + Robotic Arm Gripping
  • 11.Text Large Model + YOLOv11 + Intelligent Garbage Classification
20.AI Model – Fun Applications
  • 1.AI Butler-Intent Inference
  • 2.AI Encyclopedia-Arithmetic Master
  • 3.AI Encyclopedia-You asked I Pointed
  • 4.AI Encyclopedia-Nutritional Analysis
  • 5.AI Encyclopedia-Problem Solving Expert
  • 6.AI Encyclopedia-English Spelling
  • 7.AI Butler-Garbage Sorting
  • 8.AI Top Chef
21.MoveIt2 Course
  • 1. MoveIt Configuration
  • 2. MoveIt Usage
  • 3. MoveIt Drive Real Robot
  • 4. MoveIt Random Movement
  • 5. MoveIt Forward Kinematics Design
  • 6. MoveIt Inverse Kinematics Design
  • 7. MoveIt Cartesian Path
  • 8. MoveIt Scene Design
  • 9. MoveIt Trajectory Planning
  • 10. MoveIt Collision Detection
22.YOLOv11 Development Course
  • 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 Conversion
  • 9. Model Prediction
23. Linux Operating System
  • 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
24.OpenCV Course
  • 1.Introduction to Open Source CV
  • 2.Image reading and display
  • 3.Picture writing
  • 4.Image Quality
  • 5.Pixel operations
  • 6.Image zoom
  • 7.Picture cut
  • 8.Picture pan
  • 9.Picture mirroring
  • 10.Affine transformation
  • 11.Picture rotation
  • 12.perspective transformation
  • 13.Grayscale processing
  • 14.Binary image
  • 15.Edge green detection
  • 16.Line segment drawing
  • 17.Rectangular circle drawing
  • 18.Text and picture drawing
25.Advanced Visuals Course
  • 1. QR Code
  • 2. Human Pose Estimation
  • 3. Object Detection
  • 4. AR Vision
  • 5. ROS + OpenCV Basics
26.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
27.Jupyter Lab Usage Course
  • 0.Read the document before operation
  • 1.Jupyter Lab environment construction
  • 2.Basic use of Jupyter Widgets
  • 3.Launch JupyterLab
  • 4.How to Use JupyterLab
Download
  • APP(iOS/Android)
  • VM File
  • Instruction manual
  • Hardware_3DModelFile
  • PC_Software
  • Code
  • Communication Protocol-Python Library
  • Tools
Download ZIP

Welcome to DOFBOT SE repository

2.Color Block Tracking

Color Block Tracking

1. Function Description

After the program starts, press [r], [g], [b], [y] keys to select the color block to track. Press [c] to cancel tracking. At this point, you can press [r], [g], [b], [y] to change to other target color blocks.

2. Startup and Operation

Enter the following commands in the terminal to start:

Note: When tracking color blocks, move slowly within the camera's field of view

xxxxxxxxxx
# Start camera and inverse kinematics program
ros2 launch dofbot_info camera_arm_kin.launch.py 
# Start robotic arm control program
ros2 run dofbot_sorting_3d grasp
# Start color block tracking program
ros2 run dofbot_follow color_follow_2D 

Taking the green block as an example, press [g] to select the green block, then press the spacebar to start tracking.

If you want to change to the yellow block at this point, press [c] first to cancel the color block selection, then press [y] to select the yellow block.

3. Core Code Analysis

Code path:

xxxxxxxxxx
/home/yahboom/dofbot_ws/src/dofbot_follow/dofbot_follow/color_follow_2D.py

Import necessary libraries:

xxxxxxxxxx
import cv2
import os
import numpy as np
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2 as cv
from dofbot_sorting_3d.color_common import *
from std_msgs.msg import Bool,Int16
import time
from rclpy.node import Node
import rclpy
import threading
from Arm_Lib import Arm_Device
from dofbot_interface.msg import AprilTagInfo
import dofbot_follow.PID as PID

Initialize program parameters, create publishers and subscribers:

xxxxxxxxxx
class ColorRecognizeNode(Node):
    # Track color blocks
    
    def __init__(self, name):
        # Initialize the ROS2 node with the given name
        # 使用给定的名称初始化ROS2节点
        super().__init__(name)
        
        # Create an instance of the robotic arm device class
        # 创建机械臂设备类的实例
        self.Arm = Arm_Device()
        
        # Define initial joint angles for the robot arm
        # 定义机械臂的初始关节角度
        self.init_joints = [90, 150, 0, 20, 90, 0]
        
        # Bridge for converting between OpenCV images and ROS2 Image messages
        # 用于在OpenCV图像和ROS2 Image消息之间转换的桥接器
        self.rgb_bridge = CvBridge()
        
        # Flag indicating whether to publish position information
        # 标志位,表示是否发布位置信息
        self.pub_pos_flag = False
        
        # Publisher for publishing object position information
        # 发布物体位置信息的发布者
        self.pos_info_pub = self.create_publisher(AprilTagInfo, "PosInfo", 1)
        
        # Publisher for setting joint angle
        # 设置关节角度的发布者
        self.TargetJoint5_pub = self.create_publisher(Int16, "set_joint5", 10)
​
        # Current target color
        # 当前目标颜色
        self.target_color = 0
        # File paths for HSV color threshold configuration files
        # HSV颜色阈值配置文件的路径
        self.red_hsv_text = os.path.join(package_pwd, 'red_colorHSV.text')
        self.green_hsv_text = os.path.join(package_pwd, 'green_colorHSV.text')
        self.blue_hsv_text = os.path.join(package_pwd, 'blue_colorHSV.text')
        self.yellow_hsv_text = os.path.join(package_pwd, 'yellow_colorHSV.text')
        
        # Tuple to store HSV range for color filtering
        # 存储颜色过滤的HSV范围的元组
        self.hsv_range = ()
        
        # Flag for selection state (e.g., selecting ROI)
        # 选择状态标志
        self.select_flags = False
        
        # Name of the display window
        # 显示窗口的名称
        self.windows_name = 'frame'
        
        # State machine state for tracking
        # 跟踪的状态机状态
        self.Track_state = 'init'
        
        # Mouse click position coordinates
        # 鼠标点击位置坐标
        self.Mouse_XY = (0, 0)
        
        # Image dimensions (columns, rows)
        # 图像尺寸(列,行)
        self.cols, self.rows = 0, 0
        
        # Initial region of interest (ROI) for color detection
        # 颜色检测的初始感兴趣区域(ROI)
        self.Roi_init = ()
        
        # Instance of color detection class
        # 颜色检测类的实例
        self.color = color_detect()
        
        # Currently detected color
        # 当前检测到的颜色
        self.cur_color = None
        
        # Text color for display
        # 显示的文本颜色
        self.text_color = (0, 0, 0)
        
        # Center coordinates of detected object
        # 检测到的物体中心坐标
        self.cx = 0
        self.cy = 0
        
        # Radius of detected circular object
        # 检测到的圆形物体的半径
        self.circle_r = 0
        
        # Message for publishing joint angle
        # 发布关节角度的消息
        self.joint5 = Int16()
        
        # Array to store corner points of detected object
        # 存储检测到的物体角点的数组
        self.corners = np.empty((4, 2), dtype=np.int32)
        
        # Current target color index
        # 当前目标颜色索引
        self.cur_target_color = 0
        
        # Flag for updating HSV thresholds
        # 更新HSV阈值的标志
        self.updata_flag = False
        
        # Move arm to initial position on startup
        # 启动时将机械臂移动到初始位置
        self.Arm.Arm_serial_servo_write6_array(self.init_joints, 2000)
​
        # Default distance parameter
        # 默认距离参数
        self.dist = 0.13
        
        # Subscription to receive raw camera images
        # 订阅以接收原始相机图像
        self.subscription = self.create_subscription(
            Image, '/image_raw', self.ImageCallback, 1)
​
        # Variables for storing object position
        # 存储物体位置的变量
        self.px = 0.0
        self.py = 0.0
        
        # Target servo positions for x and y axes
        # x轴和y轴的目标舵机位置
        self.target_servox = 90
        self.target_servoy = 45
        
        # PID controllers for x and y axis servo control
        # x轴和y轴舵机控制的PID控制器
        #self.xservo_pid = PID.PositionalPID(0.25, 0.1, 0.05)
        #self.yservo_pid = PID.PositionalPID(0.25, 0.1, 0.05)
        self.xservo_pid = PID.PositionalPID(0.5, 0.1, 0.1)
        self.yservo_pid = PID.PositionalPID(0.5, 0.1, 0.1)
        
        # Flags indicating if servo output is out of range
        # 标志位,表示舵机输出是否超出范围
        self.y_out_range = False
        self.x_out_range = False
        
        # Current joint angles of the arm
        # 机械臂当前的关节角度
        self.cur_joints = self.init_joints
        
        # Auxiliary flags for tracking logic
        # 跟踪逻辑的辅助标志
        self.a = 0
        self.b = 0

ImageCallback callback function:

xxxxxxxxxx
def ImageCallback(self, color_frame):
    # Convert ROS2 Image message to OpenCV RGB image format
    # 将ROS2 Image消息转换为OpenCV RGB图像格式
    rgb_image = self.rgb_bridge.imgmsg_to_cv2(color_frame, 'rgb8')
    
    # Convert RGB image to BGR format for OpenCV processing
    # 将RGB图像转换为BGR格式以进行OpenCV处理
    rgb_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2BGR)
    
    # Create a copy of the image for drawing results
    # 创建图像副本用于绘制结果
    result_image = np.copy(rgb_image)
    
    # Capture key press 
    # 捕获按键
    key = cv2.waitKey(10) & 0xFF
    
    # Process the image to detect colors and get binary mask
    # 处理图像以检测颜色并获取二值掩码
    result_frame, binary = self.process(rgb_image, key)
    
    # Start a separate thread to display the image
    # 启动独立线程显示图像
    # This prevents blocking the main callback loop
    # 这可以防止阻塞主回调循环
    show_frame = threading.Thread(target=self.img_out, args=(result_frame, binary,))
    show_frame.start()
    show_frame.join()  # Wait for the display thread to finish
    
    # Check if a valid object (with sufficient size) has been detected
    # 检查是否检测到有效物体
    # center coordinates non-zero, radius > 30 pixels
    # 中心坐标非零,半径 > 30像素
    if self.cx != 0 and self.cy != 0 and self.circle_r > 30:
        # Get the center coordinates of the detected object
        # 获取检测到的物体中心坐标
        center_x = self.cx
        center_y = self.cy
        
        # Check if the object center deviates significantly from image center
        # 检查物体中心是否明显偏离图像中心
        # Image center: (320, 240) for 640x480 resolution
        # 图像中心:(320, 240),对应640x480分辨率
        # Threshold: 10 pixels (dead zone to avoid jitter)
        # 阈值:10像素(死区以避免抖动)
        if (abs(center_x - 320) > 10 or abs(center_y - 240) > 10):
            # Call XY tracking function to adjust arm position
            # 调用XY跟踪函数以调整机械臂位置
            self.XY_track(center_x, center_y)
            
            # Print tracking status
            # 打印跟踪状态
            print("Tracking")
            print("-------------------------------------")

Image processing function process:

xxxxxxxxxx
def process(self, rgb_img, key):
    
    rgb_img = cv.resize(rgb_img, (640, 480))
    
    # Initialize empty binary image list
    # 初始化空的二值图像列表
    binary = []
    
    # Key press handling for color selection and mode switching
    # 按键处理,用于颜色选择和模式切换
    if key == ord('c') or key == ord('C'):
        # 'C' key: Cancel/Reset - clear target color and reset system
        # 'C'键:取消/重置
        self.target_color = 0
        self.Reset()  
        self.updata_flag = True
    elif key == ord('r') or key == ord('R'): 
        # 'R' key: Select Red color
        # 'R'键:选择红色
        self.target_color = 1
        self.cur_target_color = self.target_color
    elif key == ord('g') or key == ord('G'): 
        # 'G' key: Select Green color
        # 'G'键:选择绿色
        self.target_color = 2
        self.cur_target_color = self.target_color
    elif key == ord('b') or key == ord('B'): 
        # 'B' key: Select Blue color
        # 'B'键:选择蓝色
        self.target_color = 3
        self.cur_target_color = self.target_color
    elif key == ord('y') or key == ord('Y'): 
        # 'Y' key: Select Yellow color
        # 'Y'键:选择黄色
        self.target_color = 4
        self.cur_target_color = self.target_color
    elif key == ord('i') or key == ord('I') or self.target_color != 0: 
        # 'I' key or any color selected: Enter identify/tracking state
        # 'I'键或选择了任何颜色:进入识别/跟踪状态
        self.Track_state = "identify"
    #print("self.Track_state: ", self.Track_state)
    
    # State machine: Initialization state
    # 状态机:初始化状态
    if self.Track_state == 'init':
        # Create a named window for mouse interaction
        # 创建用于鼠标交互的命名窗口
        cv.namedWindow(self.windows_name, cv.WINDOW_AUTOSIZE)
        # Set mouse callback for selecting ROI
        # 设置鼠标回调以选择感兴趣区域
        cv.setMouseCallback(self.windows_name, self.onMouse, 0)
        
        # If ROI selection is active, draw guides on the image
        # 如果ROI选择处于活动状态,在图像上绘制引导线
        if self.select_flags == True:
            # Draw line from start to current mouse position
            # 从起点到当前鼠标位置绘制线条
            cv.line(rgb_img, self.cols, self.rows, (255, 0, 0),  2)
            # Draw rectangle for ROI
            # 为ROI绘制矩形
            cv.rectangle(rgb_img, self.cols, self.rows, (0, 255, 0), 2)
            
            # If ROI is valid (width and height > 0)
            # 如果ROI有效(宽度和高度 > 0)
            if self.Roi_init[0] != self.Roi_init[2] and self.Roi_init[1] != self.Roi_init[3]:
                # Extract HSV range from the selected ROI
                # 从选定的ROI中提取HSV范围
                rgb_img, self.hsv_range = self.color.Roi_hsv(rgb_img, self.Roi_init)
                self.dyn_update = True
            else: 
                # Invalid ROI, return to init state
                # ROI无效,返回初始化状态
                self.Track_state = 'init'
                    
    # State machine: Identify/Tracking state
    # 状态机:识别/跟踪状态
    elif self.Track_state == "identify":
        # Load HSV range based on selected color
        # 根据选择的颜色加载HSV范围
        if self.target_color == 1:
            self.hsv_range = read_HSV(self.red_hsv_text)
            self.cur_color = "red"
            self.text_color = (0, 0, 255)  # Red text (BGR)
        elif self.target_color == 2:
            self.hsv_range = read_HSV(self.green_hsv_text)
            self.cur_color = "green"
            self.text_color = (0, 255, 0)  # Green text (BGR)
        elif self.target_color == 3:
            self.hsv_range = read_HSV(self.blue_hsv_text)
            self.cur_color = "blue"
            self.text_color = (255, 0, 0)  # Blue text (BGR)
        elif self.target_color == 4:
            self.hsv_range = read_HSV(self.yellow_hsv_text)
            self.cur_color = "yellow"
            self.text_color = (255, 255, 0)  # Yellow text (BGR)
        else: 
            # No valid color selected, return to init
            # 未选择有效颜色,返回初始化状态
            self.Track_state = 'init'
​
    # Object detection and tracking
    # 物体检测与跟踪
    if self.Track_state != 'init':
        # Ensure HSV range is loaded before detection
        # 确保在检测前已加载HSV范围
        if len(self.hsv_range) != 0:
​
            # Returns: annotated image, binary mask, circle params, _, corners
            # 返回:标注图像,二值掩码,圆形参数,_,角点
            rgb_img, binary, self.circle, _, self.corners = self.color.object_follow(rgb_img, self.hsv_range)
            
            # Extract circle parameters
            # 提取圆形参数
            self.cx = self.circle[0]  # Center x
            self.cy = self.circle[1]  # Center y
            self.circle_r = self.circle[2]  # Radius
            
            # Update HSV configuration file if flag is set
            # 如果标志已设置,则更新HSV配置文件
            if self.cur_target_color == 1 and self.updata_flag == True:
                write_HSV(self.red_hsv_text, self.hsv_range)
            elif self.cur_target_color == 2 and self.updata_flag == True:
                write_HSV(self.green_hsv_text, self.hsv_range)
            elif self.cur_target_color == 3 and self.updata_flag == True:
                write_HSV(self.blue_hsv_text, self.hsv_range)
            elif self.cur_target_color == 4 and self.updata_flag == True:
                write_HSV(self.yellow_hsv_text, self.hsv_range)
            self.updata_flag = False  # Reset update flag
                    
    # Overlay the current color name on the image
    # 在图像上叠加当前颜色名称
    ...

XY_track function:

​x
def XY_track(self, center_x, center_y):
    # Store the current detected object's center position
    # 存储当前检测到的物体中心位置
    self.px = center_x
    self.py = center_y
    
    # X-axis Servo Control
    #X轴舵机控制
    if not (self.target_servox >= 180 and center_x <= 320 and self.a == 1 or 
            self.target_servox <= 0 and center_x >= 320 and self.a == 1):
        # Normal tracking mode
        # 正常跟踪模式
        if self.a == 0:
            # Set the current object's x-coordinate as the PID system output
            # 将当前物体的x坐标设为PID系统输出
            self.xservo_pid.SystemOutput = center_x
            
            # Handle out-of-range situation
            # 处理超出范围的情况
            if self.x_out_range == True:
                # Force the servo to the boundary position
                # 强制舵机到达边界位置
                if self.target_servox < 0:
                    self.target_servox = 0
                    self.xservo_pid.SetStepSignal(630)
                if self.target_servox > 0:
                    self.target_servox = 180
                    self.xservo_pid.SetStepSignal(10)
                self.x_out_range = False
            else:
                # set the step signal to the image center x (320)
                # 将步进信号设为图像中心x坐标(320)
                self.xservo_pid.SetStepSignal(320)
                self.x_out_range = False
            
            # Set the inertia time parameters for the PID controller
            # 设置PID控制器的惯性时间参数
            self.xservo_pid.SetInertiaTime(0.01, 0.1)
            
            # Calculate the target value for the servo
            # 计算舵机的目标值
            target_valuex = int(1500 + self.xservo_pid.SystemOutput)
            
            # Convert the target value to a servo angle 
            # 将目标值转换为舵机角度
            self.target_servox = int((target_valuex - 500) / 10) - 10
            
            # Check if the calculated angle exceeds the valid range
            # 检查计算出的角度是否超出有效范围
            if self.target_servox > 180:
                self.x_out_range = True
            if self.target_servox < 0:
                self.x_out_range = True
    
    #Y-axis Servo Control
    #Y轴舵机控制
​
    if not (self.target_servoy >= 180 and center_y <= 240 and self.b == 1 or 
            self.target_servoy <= 0 and center_y >= 240 and self.b == 1):
        if self.b == 0:
            # Set the current object's y-coordinate as the PID system output
            # 将当前物体的y坐标设为PID系统输出
            self.yservo_pid.SystemOutput = center_y
​
            # Handle out-of-range situation
            # 处理超出范围的情况
            if self.y_out_range == True:
                self.yservo_pid.SetStepSignal(450)
                self.y_out_range = False
            else:
                # set the step signal to the image center y (240)
                # 将步进信号设为图像中心y坐标(240)
                self.yservo_pid.SetStepSignal(240)
​
            # Set the inertia time parameters for the PID controller
            # 设置PID控制器的惯性时间参数
            self.yservo_pid.SetInertiaTime(0.01, 0.1)
           
            # Calculate the target value for the servo
            # 计算舵机的目标值
            target_valuey = int(1500 + self.yservo_pid.SystemOutput)
            
            # Enforce a minimum value to prevent the arm from going too low
            # 强制执行最小值,防止机械臂降得太低
            if target_valuey <= 1000:
                target_valuey = 1000
                self.y_out_range = True
            
            # Convert the target value to a servo angle with an offset
            # 将目标值转换为带偏移量的舵机角度
            self.target_servoy = int((target_valuey - 500) / 10) - 55
            
            # Clamp the angle to the valid range [0, 180]
            # 将角度限制在有效范围[0, 180]内
            if self.target_servoy > 180: 
                self.target_servoy = 180
            if self.target_servoy < 0: 
                self.target_servoy = 0 
​
            #Map servo angles to physical joint angles
            #舵机角度映射到物理关节角度
            joint2 = 120 + self.target_servoy
            joint3 = self.target_servoy / 4.5
            joint4 = self.target_servoy / 3
                
    joints_0 = [float(self.target_servox / 1), float(joint2), float(joint3), float(joint4), 90.0, 30.0]
​
    # Send the joint commands to the robotic arm
    # 向机械臂发送关节控制命令
    self.Arm.Arm_serial_servo_write6_array(joints_0, 2000)
    
    # Update the current joint state
    # 更新当前关节状态
    self.cur_joints = joints_0
AprilTag Tracking
KCF Object 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
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文