Skip to main content

One post tagged with "Screen"

View All Tags

DshanPI-A1 Review Part 2: Gesture Recognition Programming Environment Setup and Screen Debugging

· 6 min read
Yuxuan
100askTeam yuxuan.

In this review, I will install the necessary tools for the gesture recognition system and debug the screen.

Hardware and Environment Preparation

Before starting, let's clarify the equipment and environment on hand:

  • Core board: Dshanpi-A1, with the Rockchip RK3576 chip as the main SoC.

  • Screen: A 480x800 resolution MIPI screen.

  • System: Buildroot Linux system.

  • Official SDK

Install Development Tools

Here is the list for this time:

Package/Configuration CategoryRecommended Options and Purpose
Python Environmentpython3: Core interpreter. python-pip: Used to install Python packages not included in Buildroot. python-numpy: Provides efficient numerical computation support for OpenCV and other libraries. python-setuptools: A base build dependency for some Python packages.
Computer Vision and Image Processingopencv4: Be sure to enable python3 support. Provides the core computer vision library for image processing and gesture recognition algorithms. opencv4 contrib modules: Includes additional, more advanced algorithms.
Camera and Display Supportgstreamer1 and related plugins: Build pipelines for camera image capture and screen display. gst1-plugins-base, gst1-plugins-good, gst1-plugins-bad, gst1-plugins-ugly: Provide a rich set of codecs and functional elements. gst1-python: Allows creating and manipulating GStreamer pipelines in Python.

SDK Configuration Process

1. Select the Chip Type

./build.sh chip

img

img

2. Enter buildroot Configuration

cd buildroot
make menuconfig

img

3. Select Target packages

img

4. Install the Python Environment

When you cannot find the installation path, press the / key to search:

img

Enter python3 to search:

img

Enter the displayed Location path to configure:

img

img

5. Save the Configuration and Build

make

Return to the SDK main directory and run:

./build.sh rootfs
./build.sh updateimg

Finally, flash and run it on the development board.

Development Board Debugging

Check Tool Installation

python3 --version
pip3 --version
python3 -c "import numpy; print('NumPy version:', numpy.__version__)"
python3 -c "import cv2; print('OpenCV version:', cv2.__version__)"

img

Screen Debugging

Problem Analysis

The system is already running the Weston compositor, which means we have a graphical interface environment. Attempting to directly operate the FrameBuffer (/dev/fb0) is ineffective because Weston has already occupied the display interface.

Through system inspection, we found:

  • The /dev/fb0 device exists
  • The screen status is connected
  • The resolution is 480x800

img

Solution: GStreamer + Wayland

GStreamer Basic Test

gst-launch-1.0 videotestsrc pattern=smpte ! video/x-raw,width=480,height=800 ! waylandsink sync=false

img

Camera Direct-to-Display Test

gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,width=640,height=480 ! videoconvert ! waylandsink sync=false

img

Note: Please replace the device parameter with your camera's device node

Test Script

#!/usr/bin/env python3
# fixed_display_test.py

import subprocess
import time
import os

def check_camera_devices():
"""Check available camera devices"""
print("=== Camera Device Check ===")

try:
# Use v4l2-ctl to check devices
result = subprocess.run(["v4l2-ctl", "--list-devices"],
capture_output=True, text=True)
if result.returncode == 0:
print("Found video devices:")n print(result.stdout)
else:
print("v4l2-ctl command execution failed")
except Exception as e:
print(f"Failed to check camera devices: {e}")

# Test common camera devices
camera_devices = ["/dev/video11", "/dev/video0", "/dev/video1", "/dev/video2"]
print("\nTesting camera devices:")

for device in camera_devices:
if os.path.exists(device):
print(f"Testing device: {device}")
try:
# Try to test the camera using GStreamer
cmd = [
"gst-launch-1.0",
"-v",
"v4l2src", f"device={device}", "!",
"video/x-raw,width=640,height=480,framerate=15/1", "!",
"videoconvert", "!",
"waylandsink", "sync=false"
]

process = subprocess.Popen(cmd)
time.sleep(3) # Display for 3 seconds
process.terminate()
process.wait()
print(f" {device}: Camera working normally")
return device

except Exception as e:
print(f"{device}: Test failed - {e}")
else:
print(f"{device}: Device does not exist")

return None

def test_static_patterns():
"""Test static patterns (will not change)"""
print("\n=== Static Pattern Test ===")

# Set Wayland environment
os.environ['WAYLAND_DISPLAY'] = 'wayland-0'

# Test static patterns (will not change)
static_patterns = [
("smpte100", "SMPTE 100% color bars"),
("ball", "Clock pattern"),
("blink", "Blink pattern"),
("pinwheel", "Pinwheel pattern"),
("spokes", "Spokes pattern"),
]

for pattern, description in static_patterns:
print(f"Displaying: {description}")
try:
cmd = [
"gst-launch-1.0",
"videotestsrc", f"pattern={pattern}", "!",
"video/x-raw,width=480,height=800,framerate=15/1", "!",
"waylandsink", "sync=false"
]

process = subprocess.Popen(cmd)
time.sleep(3)
process.terminate()
process.wait()
print(f"{description} displayed successfully")

except Exception as e:
print(f"{description} display failed: {e}")

def test_custom_resolution():
"""Test custom resolution display"""
print("\n=== Custom Resolution Test ===")

resolutions = [
(480, 800, "Portrait 480x800"),
(800, 480, "Landscape 800x480"),
(640, 480, "Standard 640x480"),
(400, 800, "Portrait 400x800"),
]

for width, height, desc in resolutions:
print(f"Testing resolution: {desc}")
try:
cmd = [
"gst-launch-1.0",
"videotestsrc", "pattern=smpte100", "!",
f"video/x-raw,width={width},height={height},framerate=15/1", "!",
"videoconvert", "!",
"waylandsink", "sync=false"
]

process = subprocess.Popen(cmd)
time.sleep(2)
process.terminate()
process.wait()
print(f" {desc} displayed successfully")

except Exception as e:
print(f" {desc} display failed: {e}")

if __name__ == "__main__":
print("=" * 50)

# 1. Check camera
camera_device = check_camera_devices()

# 2. Test static patterns
test_static_patterns()

# 3. Test different resolutions
test_custom_resolution()

print("\n" + "=" * 50)
if camera_device:
print(f"Available camera device: {camera_device}")
else:
print("No available camera device found")
print("All tests completed")

img

img

Run Results

image-20251222165424798

image-20251222165428939

I will put the demo video in the attachments

Bonus Chapter: FileZilla File Transfer

FileZilla Connection Settings

FileZilla - The free FTP solution

Check SSH Service

ss -tuln | grep 22

img

Network Sharing Settings

img

img

img

Select the network that can access the internet, and click Properties:

img

image-20251222165505322

Connect to the Development Board

ifconfig

img

Connect using FileZilla:

  • IP: Development board IP address
  • Username: root
  • Password: rockchip
  • Port: 22

Summary

Looking back at the entire debugging process, the following key points are worth special attention:

  1. Display Path Selection: On systems running a compositor such as Weston, prioritize the GStreamer + waylandsink solution for displaying images, rather than directly operating the FrameBuffer.

  2. Camera Device Node: Be sure to use the v4l2-ctl --list-devices command to confirm the device node corresponding to the camera, and specify it correctly in the code.

  3. Screen Resolution: Note that the screen resolution detected by the system (which can be queried via cat /sys/class/drm/card0-DSI-1/modes) may be slightly different from the physical resolution. When creating display frames, use this as the reference or make adjustments accordingly.

At this point, we have successfully set up the gesture recognition programming environment on the Dshanpi A1 development board and resolved the display issues with the MIPI screen and camera. Although the process was full of twists and turns, it laid a solid foundation for the subsequent actual writing of gesture recognition algorithms. I hope my experience can be of help to everyone!