yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
Rider Pi Robot📖
0.Quick Start
  • 0. Notes (Must Read)new
  • 1.APP control experience
  • 2.Web page image transmission controlnew
  • 3.Manual
1.RPi Basic course
  • 1.SSH remote login
  • 2.VNC remote login desktop
  • 3. Remote file transfer
  • 4. JupyterLab environment construction and use
  • 5. Write system image
  • 6. Connect to WiFi
  • 7. Close startup programs(MustRead)
  • 8. Raspberry Pi system expansion
2.Car basic control course
  • 1. Car screen display control
  • 2. Car recording audio
  • 3. Car plays audio
  • 4. Car recording video
  • 5. Car plays video
  • 6. RGB light control
  • 7. Car attitude angle reading
  • 8. Read the battery level of the car
3.Car motion control
  • 1. Car forward and backward
  • 2. Car rotation movement
  • 3. Adjust car height
  • 4. Adjust car posture
  • 5. Car self-stabilization mode
  • 6. Car squats and shakes
4.Open Source CV
A. Getting started with OpenCV
  • 1. Introduction to OpenCV
  • 2. OpenCV image reading and display
  • 3. OpenCV image writing
  • 4. OpenCV Image Quality
  • 5.OpenCV pixel operations
B. OpenCV geometric transformation
  • 1. Image scaling
  • 2. Image cutting
  • 3. Image translation
  • 4. Image mirroring
  • 5. Affine Transformation
  • 6. Image Rotation
  • 7. Perspective Transformation
C. OpenCV image processing and drawing text segments
  • 1. Grayscale processing
  • 2. Image Binarization
  • 3. Edge Detection
  • 4. Line drawing
  • 5. Rectangle and circle drawing
  • 6. Text and picture drawing
D. Image beautification
  • 1. Color Image Histogram
  • 2. Histogram Equalization
  • 3. Image repair
  • 4. Brightness enhancement
  • 5. Skin whitening
  • 6. Gaussian mean filtering
  • 7. Median Filter
5.AI Visual recognition course
  • 1. Camera driver tutorial
  • 2. Color recognition
  • 3. HSV value test
  • 4. Object Recognition
  • 5. QR code recognition
  • 6. Human face mask
  • 7. License Plate Recognition
  • 8. Human Pose Estimation
  • 9. Object Detection
  • 10.Yolo detection
  • 11. Face Detection
  • 12. Face effects
  • 13. 3D Object Recognition
  • 14. Paintbrush
  • 15. Finger recognition
  • 16. Gesture Recognition
  • 17.Facial Recognitionnew
  • 18.Emotion Recognitionnew
  • 19.Motion Detectionnew
6.AI Visual interaction course
  • 1. Color tracking
  • 2. Color follows
  • 3. QR code recognition action
  • 4. Face tracking
  • 5. Finger control
  • 6. Gesture following
  • 7. Gesture control car
  • 8. Human Body Followingnew
7. AI Large Model Interaction
  • 0.Principles of Large AI Models
  • 1.Large model premise use configuration
  • 2.Q&A(For cm5)
  • 3.Q&A and ChatGPT(For cm4)
  • 4.Speech recognition
  • 5.Picture to Text
  • 6.Embodied intelligence
Download
  • APP(iOS/Android)
  • System_File
  • Code
  • Hareware_Info
  • AI_Model_File
  • 3D_Model_File
  • Instruction_Manual
Download ZIP

Welcome to Rider Pi Robot repository

8. Human Body Following

Human Body Follow

Human Body Follow1. Experiment Objective2. Experiment Steps3. Experimental Phenomena4. Experimental Source Code Analysis

This tutorial is specific to CM5 version; it cannot be used directly in CM4 version.

1. Experiment Objective

Learn to use the RiderPi camera for human body perspective positioning and follow the human body.

2. Experiment Steps

Enter the RiderPi system, terminate the RiderPi main program, and enter "ip (IP is the RiderPi's IP):8888" in your browser. After logging in, enter the password "yahboom".

image-2024112100001

Then log in and navigate to the path cd ~/Rider-pi_class/6.AI Visual Interaction Course/8. Human Body Follows and run follow_person.ipynb.

Finally, run the program.

3. Experimental Phenomena

After running the program, RiderPi will detect the human body and follow it forward, backward, left, and right based on the distance to the human body.

image-2024112100002

4. Experimental Source Code Analysis

xxxxxxxxxx
# 显示输出区域
display(image_widget)
display(output_area)
​
from track import HumanTracker
from xgolib import XGO
​
button = Button()
dog = XGO(port="/dev/ttyAMA0", version="xgolite")
dog.attitude('p', -10)
​
​
tracker = HumanTracker()
from PIL import Image, ImageDraw
import xgoscreen.LCD_2inch as LCD_2inch
splash_theme_color = (255,255,255)
mydisplay = LCD_2inch.LCD_2inch()
mydisplay.Init()
mydisplay.clear()
# Init Splash
splash = Image.new("RGB", (mydisplay.height, mydisplay.width), splash_theme_color)
draw = ImageDraw.Draw(splash)
mydisplay.ShowImage(splash)
detector = HumanDetector()
last_move_x_speed = 0.0
last_turn_speed = 0.0
filter_coefficient = 0.3  # 滤波系数 filter coefficient
while True:
    with output_area:
        frame = picam2.capture_array()
        humans = detector.detect_humans(frame)
        for human in humans:
            if human:
                print("\n=== update  ===")
                center_x, distance = human['center_x'], human['distance'] if human else (None, None)
                #print(f"距离最近的人在 ({human['bbox']}), center_x: {human['center_x']}, distance: {human['distance']} cm")
                tracking_params = tracker.update(human)
                if tracking_params['is_detected'] and tracking_params['is_moving']:
                    prediction = tracker.predict_future_position(tracking_params, 0.06)
                    if prediction:
                        pass
                raw_move_x_speed = tracking_params['velocity_x'] * 0.05 + (distance - 100) * 0.1
                if -20 <distance - 70 <  20:
                    raw_move_x_speed = (distance - 70) * 0.3
                else: 
                    raw_move_x_speed = (distance - 70) * 0.2
                raw_turn_speed = tracking_params['velocity_x'] * 0.02
                if 145<center_x<175:
                    raw_turn_speed = 0
                elif 130<center_x<145 or 175< center_x <190:
                    raw_turn_speed = (160 - center_x) * 0.2
                else:
                    raw_turn_speed = (160 - center_x) * 0.15
                move_x_speed = filter_coefficient * last_move_x_speed + (1 - filter_coefficient) * raw_move_x_speed
                turn_speed = filter_coefficient * last_turn_speed + (1 - filter_coefficient) * raw_turn_speed
                max_move_speed = 10.0
                max_turn_speed = 15.0
                move_x_speed = max(-max_move_speed, min(max_move_speed, move_x_speed))
                turn_speed = max(-max_turn_speed, min(max_turn_speed, turn_speed))
                # 更新上一时刻的速度 Update the speed from the previous moment
                last_move_x_speed = move_x_speed
                last_turn_speed = turn_speed
                if la =="cn":
                    print(f'距离:{distance}, 中心点偏移:{160-center_x}')
                    print(f"移动速度: {move_x_speed:.2f}, 转向角度: {turn_speed:.2f}")
                else:
                    print(f'distance:{distance}, center_x:{160-center_x}')
                    print(f"move_x_speed: {move_x_speed:.2f}, turn_angle: {turn_speed:.2f}")
        
                #dog.move_x(move_x_speed)
                #dog.turn(turn_speed)
                # #dog.move_x(0.02 * tracking_params['velocity_y'])
                # #dog.turn(tracking_params['velocity_x'])
                
                
        # 如果没有检测到人体,逐渐减速 If no human body is detected, gradually slow down
        if humans == []:
            move_x_speed = 0.03*filter_coefficient * last_move_x_speed 
            turn_speed = 0.03*filter_coefficient * last_turn_speed 
            max_move_speed = 3.0
            max_turn_speed = 3.0
            move_x_speed = max(-max_move_speed, min(max_move_speed, move_x_speed))
            turn_speed = max(-max_turn_speed, min(max_turn_speed, turn_speed))
            dog.move_x(move_x_speed)
            dog.turn(turn_speed)
​
            if la =="cn":
                print(f"移动速度: {move_x_speed:.2f}, 转向角度: {turn_speed:.2f}")
            else:
                print(f"move_x_speed: {move_x_speed:.2f}, turn_angle: {turn_speed:.2f}")
            
            last_move_x_speed = move_x_speed
            last_turn_speed = turn_speed
            
        b, g, r = cv2.split(frame)
        image_widget.value = bgr8_to_jpeg(frame)
        #cv2.imshow('Human Detection', frame)
        
        img = cv2.merge((r, g, b))
        imgok = Image.fromarray(img)
        mydisplay.ShowImage(imgok)
​
        if button.press_b():
            dog.reset()
            break
if -20 <distance - 70 <  20:
    raw_move_x_speed = (distance - 70) * 0.3
else: 
    raw_move_x_speed = (distance - 70) * 0.2
raw_turn_speed = tracking_params['velocity_x'] * 0.02
if 145<center_x<175:
    raw_turn_speed = 0
elif 130<center_x<145 or 175< center_x <190:
    raw_turn_speed = (160 - center_x) * 0.2
else:
    raw_turn_speed = (160 - center_x) * 0.15
  • If you want to change the following distance and the left/right turn size, you can change the range here.
  • detector.detect_humans(frame): This function mainly detects the position of human bodies in the image.

 

 

Gesture control car
Principles of Large AI Models

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