小组成员分工
Created on: March 10, 2025
Created on: March 10, 2025
Here is a suggested division of labor for the project among the four group members:
Group Member Responsibilities:
Yaokun Zhang - Hardware Setup & Integration
Ziqi Wang - Software & OpenCV Implementation
Yuanfan Jiang - Testing & Debugging
Yijian Lin - Project Management & Documentation
Each team member will collaborate and support others as needed, ensuring a smooth and successful project execution. Let me know if you want any modifications!
根据这个课件这个小车应该怎么安装呢,需要什么硬件配置
To assemble the car for this project, you will need the following hardware components:
Mount the Raspberry Pi
Install the Pi Camera
Connect the Sensors & Components
Set Up the Motorized Chassis
Software Configuration & Testing
Final Adjustments & Calibration
Would you like a circuit diagram or code example for any of the components?
为了完成这个巡线的任务这个小车应该怎么安装
To assemble the car and ensure it can perform the line-following task, follow these steps:
bashsudo apt update sudo apt install python3-opencv pip install numpy RPi.GPIO
bashsudo raspi-config
Use OpenCV to detect the track:
pythonimport cv2 import numpy as np # Open the Pi Camera cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: continue # Convert to grayscale gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Apply threshold to detect the line _, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV) # Find contours (track edges) contours, _ = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) if contours: # Find the largest contour (assumed to be the line) c = max(contours, key=cv2.contourArea) M = cv2.moments(c) if M["m00"] != 0: cx = int(M["m10"] / M["m00"]) cy = int(M["m01"] / M["m00"]) # Determine direction to move if cx < frame.shape[1] // 2 - 20: print("Turn Left") elif cx > frame.shape[1] // 2 + 20: print("Turn Right") else: print("Move Forward") cv2.imshow("Binary", binary) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
Adjust Camera Angle
Fine-tune Thresholding
Optimize Motor Speed
Would you like a more advanced version, such as PID control for smoother movement?
所以说如果我让AI去帮我写利用这个树莓派小车实现线追踪的这个代码,关于识别黑线这一块,我应该具体怎么和它描述,还有这个让树莓派小车前进后退左转右转的指令你知道吗
要实现树莓派小车的黑线识别和运动控制,您需要明确以下两个方面:
1. 描述黑线识别任务
当向AI描述黑线识别任务时,您可以这样表达:
findContours
函数检测图像中的轮廓,识别出黑线的位置和形状。2. 控制小车运动的指令
要控制小车的运动,您需要使用树莓派的GPIO引脚,通过电机驱动模块(如L298N)来控制直流电机。以下是一个使用Python和RPi.GPIO库的示例代码,演示如何控制小车的前进、后退、左转、右转和停止:
pythonimport RPi.GPIO as GPIO import time # 定义电机控制引脚 IN1 = 11 # 左电机前进 IN2 = 12 # 左电机后退 IN3 = 13 # 右电机前进 IN4 = 15 # 右电机后退 ENA = 18 # 左电机使能PWM ENB = 16 # 右电机使能PWM def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup([IN1, IN2, IN3, IN4, ENA, ENB], GPIO.OUT) global pwmA, pwmB pwmA = GPIO.PWM(ENA, 1000) pwmB = GPIO.PWM(ENB, 1000) pwmA.start(0) pwmB.start(0) def set_speed(speed): pwmA.ChangeDutyCycle(speed) pwmB.ChangeDutyCycle(speed) def forward(): GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.LOW) GPIO.output(IN3, GPIO.HIGH) GPIO.output(IN4, GPIO.LOW) def backward(): GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.HIGH) GPIO.output(IN3, GPIO.LOW) GPIO.output(IN4, GPIO.HIGH) def turn_left(): GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.HIGH) GPIO.output(IN3, GPIO.HIGH) GPIO.output(IN4, GPIO.LOW) def turn_right(): GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.LOW) GPIO.output(IN3, GPIO.LOW) GPIO.output(IN4, GPIO.HIGH) def stop(): GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.LOW) GPIO.output(IN3, GPIO.LOW) GPIO.output(IN4, GPIO.LOW) def cleanup(): pwmA.stop() pwmB.stop() GPIO.cleanup() if __name__ == "__main__": try: setup() set_speed(50) # 设置速度为50% forward() time.sleep(2) turn_left() time.sleep(1) forward() time.sleep(2) stop() except KeyboardInterrupt: pass finally: cleanup()
代码说明:
setup
函数:设置GPIO模式并初始化PWM。set_speed
函数:通过改变PWM的占空比来调整电机速度。forward
、backward
、turn_left
、turn_right
和stop
函数分别控制小车的前进、后退、左转、右转和停止。cleanup
函数:停止PWM并清理GPIO设置。请确保在实际连接时,电机和L298N驱动模块的接线与代码中的引脚定义相匹配。
通过上述描述,您可以向AI清晰地表达黑线识别的实现方法,并了解如何编写代码来控制树莓派小车的运动。
search()
是的,您可以通过编写代码来控制树莓派小车的各个部件。树莓派提供了多种接口和库,使得与硬件组件的交互变得相对简单。
主要部件及其控制方法:
电机(用于驱动小车前进、后退、转向):
RPi.GPIO
库或gpiozero
库来控制GPIO引脚的输出,从而实现对电机的控制。摄像头模块(用于图像处理,如黑线识别):
picamera
库(针对官方摄像头模块)或OpenCV
库来捕获和处理图像。超声波传感器(如HC-SR04,用于测距):
LED灯(用于指示或照明):
示例代码:
以下是一个使用RPi.GPIO
库控制电机的小示例:
pythonimport RPi.GPIO as GPIO import time # 设置GPIO模式为BOARD模式 GPIO.setmode(GPIO.BOARD) # 定义电机控制引脚 IN1 = 11 IN2 = 12 ENA = 13 # 设置引脚模式为输出 GPIO.setup(IN1, GPIO.OUT) GPIO.setup(IN2, GPIO.OUT) GPIO.setup(ENA, GPIO.OUT) # 设置PWM,频率为1000Hz pwm = GPIO.PWM(ENA, 1000) pwm.start(50) # 占空比为50%,即电机以50%的速度运行 # 前进 GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.LOW) time.sleep(2) # 停止 GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.LOW) time.sleep(1) # 后退 GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.HIGH) time.sleep(2) # 停止并清理GPIO设置 GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.LOW) pwm.stop() GPIO.cleanup()
注意事项:
RPi.GPIO
、picamera
、opencv-python
等。通过以上方法,您可以编写代码来控制树莓派小车的各个部件,实现如线追踪、避障等功能。
Servo motor 我特指的就是这个模块
是的,您的树莓派小车上的 SG90 舵机 (Servo Motor) 可以通过代码进行控制。它的主要作用是 调整摄像头的角度,用于 线追踪任务和符号识别任务之间的切换。
SG90 舵机的控制原理基于 PWM (脉宽调制) 信号,不同的脉宽会使舵机旋转到不同的角度:
使用 RPi.GPIO
或 pigpio
库可以控制 SG90 舵机的角度。
pythonimport RPi.GPIO as GPIO import time SERVO_PIN = 18 # 连接 SG90 的 GPIO 端口 def setup(): GPIO.setmode(GPIO.BCM) # 使用 BCM 编号模式 GPIO.setup(SERVO_PIN, GPIO.OUT) global pwm pwm = GPIO.PWM(SERVO_PIN, 50) # 50Hz PWM pwm.start(0) # 初始占空比为 0 def set_angle(angle): duty = 2.5 + (angle / 180.0) * 10 # 计算占空比 pwm.ChangeDutyCycle(duty) time.sleep(0.5) # 让舵机完成旋转 pwm.ChangeDutyCycle(0) # 避免持续供电导致抖动 def cleanup(): pwm.stop() GPIO.cleanup() if __name__ == "__main__": try: setup() set_angle(0) # 中间位置 time.sleep(1) set_angle(-90) # 左转 time.sleep(1) set_angle(90) # 右转 time.sleep(1) except KeyboardInterrupt: pass finally: cleanup()
RPi.GPIO 在 PWM 控制舵机时可能存在 抖动,可以改用 pigpio
库:
pythonimport pigpio import time SERVO_PIN = 18 # 连接 SG90 的 GPIO 端口 pi = pigpio.pi() # 初始化 pigpio pi.set_mode(SERVO_PIN, pigpio.OUTPUT) def set_angle(angle): pulse_width = 1000 + (angle + 90) * 5.56 # 将角度转换为脉冲宽度 (1000-2000µs) pi.set_servo_pulsewidth(SERVO_PIN, pulse_width) try: set_angle(0) # 中间 time.sleep(1) set_angle(-90) # 左转 time.sleep(1) set_angle(90) # 右转 time.sleep(1) finally: pi.set_servo_pulsewidth(SERVO_PIN, 0) # 停止舵机 pi.stop()
示例:
pythonif detect_line(): # 发现黑线 set_angle(0) # 角度归位,继续巡线 elif detect_symbol(): # 发现符号 set_angle(-90) # 旋转摄像头,进行符号识别
RPi.GPIO
或 pigpio
),推荐 pigpio
控制更稳定。这样,您的树莓派小车就可以 自动调整摄像头,实现更智能的巡线和符号识别任务!
如果您想让 AI 帮助您编写 C 语言代码 来 检测并计数圆形、三角形和正方形,可以这样描述您的需求:
目标:
C:2 T:3 S:1
,表示 2 个圆形、3 个三角形、1 个正方形。技术要求:
cv::cvtColor
)。cv::GaussianBlur
进行降噪。cv::Canny
进行边缘检测。cv::findContours
查找轮廓。cv::approxPolyDP
计算形状角点数量:
c#include <opencv2/opencv.hpp> #include <stdio.h> using namespace cv; using namespace std; int main() { // 打开摄像头 VideoCapture cap(0); if (!cap.isOpened()) { printf("无法打开摄像头\n"); return -1; } Mat frame, gray, blurred, edged; vector<vector<Point>> contours; vector<Vec4i> hierarchy; while (true) { cap >> frame; // 读取摄像头画面 if (frame.empty()) break; // 预处理:灰度化、去噪、边缘检测 cvtColor(frame, gray, COLOR_BGR2GRAY); GaussianBlur(gray, blurred, Size(5, 5), 0); Canny(blurred, edged, 50, 150); // 查找轮廓 findContours(edged, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); int circles = 0, triangles = 0, squares = 0; for (size_t i = 0; i < contours.size(); i++) { vector<Point> approx; double peri = arcLength(contours[i], true); approxPolyDP(contours[i], approx, 0.04 * peri, true); if (approx.size() == 3) { triangles++; // 三角形 } else if (approx.size() == 4) { squares++; // 正方形 } else { // 使用圆拟合检查是否是圆形 float radius; Point2f center; minEnclosingCircle(contours[i], center, radius); if (radius > 10) { // 避免误识别小噪点 circles++; } } } // 显示结果 printf("C: %d T: %d S: %d\n", circles, triangles, squares); // 显示图像 imshow("Shapes", frame); if (waitKey(30) >= 0) break; } cap.release(); destroyAllWindows(); return 0; }
安装 OpenCV:
bashsudo apt update sudo apt install libopencv-dev
编译代码:
bashg++ -o shape_counter shape_counter.cpp `pkg-config --cflags --libs opencv4`
运行代码:
bash./shape_counter
wiringPi
库)。findContours
之前,筛选出 最外层的轮廓 并排除它。cv::contourArea
排除噪声小轮廓。这样描述,AI 就可以理解您的需求,并编写出完整的 C 语言代码!
所以说这个摄像头使用的是什么型号
从课件内容来看,该树莓派小车使用的是 Raspberry Pi Camera (Pi Camera) 进行图像采集。这是一款 CSI 接口的官方摄像头模块,适用于树莓派的 OpenCV 任务,比如巡线和形状识别。
Raspberry Pi Camera Module v1
Raspberry Pi Camera Module v2
Raspberry Pi HQ Camera (高质量摄像头)
在终端运行:
bashvcgencmd get_camera
如果输出:
bashsupported=1 detected=1
说明摄像头已连接。
picamera
(适用于 v1/v2)pythonfrom picamera import PiCamera import time camera = PiCamera() camera.resolution = (640, 480) camera.start_preview() time.sleep(2) # 等待摄像头稳定 camera.capture('/home/pi/image.jpg') camera.stop_preview()
pythonimport cv2 cap = cv2.VideoCapture(0) # 0 代表第一个摄像头 while True: ret, frame = cap.read() if not ret: break cv2.imshow("Camera", frame) if cv2.waitKey(1) & 0xFF == ord('q'): # 按 'q' 退出 break cap.release() cv2.destroyAllWindows()
pythoncamera.resolution = (320, 240) # 低分辨率提高处理速度
pythoncamera.brightness = 50 camera.contrast = 50
pythongray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
如果您不确定使用的是 v1 还是 v2,可以运行:
bashvcgencmd get_camera
或者查看 摄像头的物理标签 来确认型号!
简短回答:
该示例代码本身不依赖特定的树莓派型号,只要能正常安装并运行相应版本的 OpenCV(包含 C API)的树莓派,都可以使用这段代码。常见的树莓派型号(如 Raspberry Pi 3B/3B+、Raspberry Pi 4B、以及性能相对较弱的 Pi Zero 系列等)都能运行,前提是系统和 OpenCV 环境配置正确。
树莓派型号兼容性
OpenCV 版本与 API
cvCaptureFromCAM
、IplImage
、cvFindContours
等)。cv::VideoCapture
、cv::Mat
等)来实现类似功能,或另外启用兼容模块。摄像头驱动
raspicam
、libcamera
、V4L2 或者 MMAL 等驱动接口工作。cvCaptureFromCAM(0)
可能直接基于 V4L2/VideoDevice0 工作,如果你的系统和摄像头驱动能被 OpenCV 识别,也就没问题。LCD 显示部分
cvNamedWindow
/ cv::imshow
来显示结果。若是 SPI、I2C、小尺寸并行屏之类,需要依赖其他库或驱动来完成数据输出。printf
打印到控制台,实际项目中可用串口、I2C 或特定库函数将文字输出到 LCD。结论:
是的,从课件来看,您的项目需要使用 OpenCV 来实现计算机视觉任务,并明确提到使用 C/C++ 库。这意味着:
C 语言的 OpenCV API:
cvCaptureFromCAM()
),那么您必须改写为 C++ 代码,使用 cv::VideoCapture
进行摄像头操作。OpenCV C++ API(推荐):
cppcv::Mat frame; cv::VideoCapture cap(0); cap.read(frame);
树莓派兼容性:
bashpython3 -c "import cv2; print(cv2.__version__)"
如果您确认需要 C++ 代码,我可以帮您将 C 语言示例转换为 C++ 代码,以便在 OpenCV 4.x 上运行。
所以说这个我们根据这个课件里面的要求的话,这个实验如果是要识别那个template的话,这个任务本身就包括了线追踪吗
是的,从课件的任务描述来看,形状识别任务(Count Shapes)和线追踪任务(Line Following)是两个独立的任务,但它们在运行过程中可能会结合在一起。也就是说,小车在执行形状识别任务时,仍然需要进行线追踪,以保持其在轨道上移动。
线追踪 (Line Following)
形状识别 (Count Shapes)
二者的结合
启动线追踪
检测到形状识别模板
执行形状识别
恢复线追踪
形状识别任务本身不包含线追踪,但在实验过程中,小车需要先沿线移动到指定位置才能执行形状识别。因此,形状识别和线追踪需要结合使用,并通过摄像头、OpenCV 以及电机控制实现自动化。