jetson nano 自动驾驶小车编程 python


jetson nano 小车实现以下自动驾驶功能
(一)功能一:摄像头扫描到斑马线停车,硬件方面摄像头代码,舵机代码,电机代码都是编好了的。
(二)功能一:摄像头扫描到红灯停车,绿灯行驶,硬件方面摄像头代码,舵机代码,电机代码都是编好了的。
(三)功能三:能够按照指定的跑道循迹运动,硬件方面摄像头代码,舵机代码,电机代码都是编好了的。
python3.6.9    15703003349(+V)

一个功能至少50

二、数据采集
2.1摄像头的开启
运行interactive_regression.ipynb文件中的如下代码块,开启摄像头。
1.    from jetcam.csi_camera import CSICamera  
2.    camera = CSICamera(width=224, height=224)  
3.    camera.running = True 
2.2数据采集与保存
运行interactive_regression.ipynb文件,会出现如下交互界面:
                     
左侧图是摄像头的实时预览画面,点击图中可形成中图所示的绿色标记,同时,该图片与标记数据会保存到相应的文件夹下。
我们通过遥控小车绕赛道10圈,共采集数据612份。

三、算法设计
3.1模型选择
我们选取了34层ResNet34残差网络,网络结构图如下所示:
                       
核心代码:
1.    model = torchvision.models.resnet34(pretrained=True)  
2.    model.fc = torch.nn.Linear(512, output_dim)  

3.2优化器的选择
我们选择Adam作为优化器。Adam可以通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率,经过我们的实验,Adam比随机梯度优化器(SGD)效果更好。
核心代码:
1.    optimizer = torch.optim.Adam(model.parameters())  

3.3训练次数
我们的训练次数设置在20-30次左右。

3.4模型转换
为使模型加载速度更快,我们通过torch2trt库,将PyTorch模型转换成TensorRT模型。代码位于road_following.ipynb文件中。
核心代码:
1.    from torch2trt import torch2trt  
2.    data = torch.zeros((1, 3, 224, 224)).cuda().half()  
3.    model_trt = torch2trt(model, [data], fp16_mode=True)  

3.5自动驾驶参数设定
将训练好的模型加载到小车的主控芯片后,还需要对驱动点击的各项参数进行设定。我们对road_following.ipynb文件中的具体参数进行微调,摄像头帧率设为35帧/秒,转向增益设为0.65,转向偏移设置为-0.15。
核心代码:
1.    from jetcam.csi_camera import CSICamera  
2.    from utils import preprocess  
3.    import numpy as np  
4.      
5.    camera = CSICamera(width=224, height=224, capture_fps=65)  
6.    STEERING_GAIN = 0.75  
7.    STEERING_BIAS = 0.00  
8.      
9.    car.throttle = 0.15  
10.      
11.    while True:  
12.        image = camera.read()  
13.        image = preprocess(image).half()  
14.        output = model_trt(image).detach().cpu().numpy().flatten()  
15.        x = float(output[0])  
16.        car.steering = x * STEERING_GAIN + STEERING_BIAS 

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
解答:

一、斑马线停车
1.首先需要在摄像头捕捉的图像中检测出斑马线,可以使用OpenCV的图像处理功能,通过边缘检测和色彩过滤等方式识别出斑马线。
2.当检测到斑马线时,需要让小车停止前进,可以通过控制车辆的电机停转实现。
3.待斑马线消失后,可以让小车恢复运动。同时,可以通过增加延迟时间,使小车停下的时间更长,保证安全性。

代码实现:

import cv2
# 预设斑马线的颜色范围,在HSV色域中
lower_color = [0, 0, 0]
upper_color = [255, 255, 255]

camera = CSICamera(width=224, height=224)
camera.running = True

car.throttle = 0.15

while True:
    image = camera.read()

    # 转换颜色空间
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    # 过滤颜色
    mask = cv2.inRange(hsv, np.array(lower_color), np.array(upper_color))
    # 边缘检测
    edges = cv2.Canny(mask, 50, 150)

    # 检测斑马线
    lines = cv2.HoughLinesP(edges, 1, np.pi / 180, threshold=100, minLineLength=100, maxLineGap=30)

    if lines is not None:
        for line in lines:
            x1, y1, x2, y2 = line[0]
            # 斑马线在图像中的位置,这里假设在图像正中央
            center_x = (x1 + x2) / 2
            center_y = (y1 + y2) / 2
            if center_y >= 180 and center_y <= 300:
                # 斑马线在正中央的范围内
                car.throttle = 0.0  # 停车
                time.sleep(1)  # 暂停一秒
                break
    else:
        car.throttle = 0.3  # 恢复运动

二、红绿灯停车
1.需要在摄像头捕捉的图像中检测出交通信号灯,可以使用OpenCV的图像处理功能,通过边缘检测和色彩过滤等方式识别出交通信号灯。
2.当检测到红灯时,需要让小车停止前进,可以通过控制车辆的电机停转实现。
3.当检测到绿灯时,可以让小车恢复运动。同时,可以通过增加延迟时间,使小车停下的时间更长,保证安全性。

代码实现:

import cv2
# 预设红绿灯的颜色范围,在HSV色域中
lower_red = [0, 0, 0]
upper_red = [10, 255, 255]

lower_green = [50, 50, 50]
upper_green = [70, 255, 255]

camera = CSICamera(width=224, height=224)
camera.running = True

car.throttle = 0.15

while True:
    image = camera.read()

    # 转换颜色空间
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    # 过滤颜色
    mask_red = cv2.inRange(hsv, np.array(lower_red), np.array(upper_red))
    mask_green = cv2.inRange(hsv, np.array(lower_green), np.array(upper_green))

    # 检测红灯
    red_count = cv2.countNonZero(mask_red)
    if red_count > 5000:  # 假设红灯面积超过5000个像素点
        car.throttle = 0.0  # 停车
        time.sleep(1)  # 暂停一秒
    else:
        car.throttle = 0.3  # 恢复运动

    # 检测绿灯
    green_count = cv2.countNonZero(mask_green)
    if green_count > 5000:  # 假设绿灯面积超过5000个像素点
        car.throttle = 0.3  # 恢复运动

三、指定跑道循迹运动
1.需要让小车在指定的跑道上行驶,可以通过读取白色参考线的位置,调整舵机的角度,使小车沿着白色参考线行驶。
2.可以使用OpenCV的图像处理功能,通过边缘检测和色彩过滤等方式识别出白色参考线。
3.可以通过计算参考线的中心位置,调整舵机角度,使小车沿着中心位置行驶。

代码实现:

import cv2
# 预设白色参考线的颜色范围,在HSV色域中
lower_white = [0, 0, 180]
upper_white = [255, 40, 255]

camera = CSICamera(width=224, height=224)
camera.running = True

car.throttle = 0.15
STEERING_GAIN = 0.75  # 转向增益
STEERING_BIAS = 0.00  # 转向偏移

while True:
    image = camera.read()

    # 转换颜色空间
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    # 过滤颜色
    mask = cv2.inRange(hsv, np.array(lower_white), np.array(upper_white))
    # 边缘检测
    edges = cv2.Canny(mask, 50, 150)

    # 检测参考线
    lines = cv2.HoughLinesP(edges, 1, np.pi / 180, threshold=100, minLineLength=100, maxLineGap=30)

    if lines is not None:
        # 计算参考线的中心位置
        center_x = 0
        center_y = 0
        count = 0
        for line in lines:
            x1, y1, x2, y2 = line[0]
            if abs(y2 - y1) < 10:
                center_x += (x1 + x2) / 2
                center_y += (y1 + y2) / 2
                count += 1

        if count > 0:
            center_x /= count
            center_y /= count
            # 计算舵机角度
            x = center_x / 224 - 0.5
            angle = x * STEERING_GAIN + STEERING_BIAS
            angle = max(-1.0, min(angle, 1.0))

            car.steering = angle
    else:
        car.throttle = 0.0
        car.steering = 0.0

如果我的回答解决了您的问题,请采纳!

引用chatGPT作答,实现自动驾驶小车的Python程序,可以按照以下步骤进行:

一、功能实现

1.首先需要安装Jetson Nano上的GPIO库,用于控制小车的电机和舵机。可以使用Jetson.GPIO库来完成该任务。

2.编写控制小车的程序。需要编写代码控制小车的电机和舵机。可以使用PWM方式来控制电机和舵机,可以使用Jetson.GPIO库提供的PWM功能来完成该任务。

3.编写摄像头程序。需要编写代码读取摄像头的图像。可以使用OpenCV库来读取摄像头的图像,同时进行图像处理,例如图像预处理,边缘检测等。

4.实现斑马线停车功能。可以在摄像头图像中进行斑马线检测,当摄像头扫描到斑马线时,停车。可以使用OpenCV库中的边缘检测和形态学变换等技术来实现该功能。

5.实现红绿灯识别功能。可以在摄像头图像中进行颜色检测,当检测到红灯时,停车,当检测到绿灯时,行驶。可以使用OpenCV库中的颜色检测技术来实现该功能。

6.实现循迹运动功能。可以使用卷积神经网络(CNN)来对摄像头图像进行分类,识别车道线,然后通过控制舵机,让小车沿着车道线行驶。可以使用PyTorch库来训练和使用CNN模型。

二、数据采集

1.开启摄像头。可以使用jetcam.csi_camera库来开启摄像头。

2.数据采集与保存。可以使用interactive_regression.ipynb文件中的交互界面来采集数据。通过遥控小车绕赛道10圈,共采集数据612份。

三、算法设计

1.模型选择。可以选择34层ResNet34残差网络作为CNN模型。

2.优化器选择。可以选择Adam作为优化器,可以使用torch.optim.Adam函数来创建Adam优化器对象。

3.训练次数。可以将训练次数设置在20-30次左右。

4.模型转换。可以使用torch2trt库,将PyTorch模型转换成TensorRT模型,以提高模型加载速度。

5.自动驾驶参数设定。可以微调摄像头帧率,转向增益,转向偏移等参数。可以使用jetcam.csi_camera库来设置摄像头帧率,使用utils库中的preprocess函数来对摄像头图像进行预处理,使用numpy库来处理输出数据。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: Jetson Nano入门(图像分类+图像分割+人脸识别)中的 (3)安装Python运行库 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    sudo apt install python-leveldb
    gedit  ~/caffe/python/requirements.txt
    

    最想念的python-leveldb不支持Jetson TX2上的aarch64平台,安装一个低版本的,将“requirements.txt”中的“leveldb>=0.191”删掉,并保存关闭文件。
    接着安装NVIDIA Caffe所需要的Python运行库:

    sudo -Hpip install -r  ~/caffe/python/requirements.txt
    
  • 以下回答来自chatgpt:

    非常感谢您的询问。关于在Jetson Nano上实现自动驾驶小车,我可以提供以下建议:

    第一步:准备硬件和软件环境

    检查Jetson Nano开发板是否已经正确安装,连接小车的所有传感器和执行器,包括摄像头、激光雷达、电机等等。

    安装Jetpack软件套件,以便能够使用Jetson Nano的所有功能库和驱动。您可以在NVIDIA的官网上下载最新版本的Jetpack,并按照指示进行安装。

    第二步:搭建自主感知系统

    搭建自主感知系统,使用摄像头和/或激光雷达来感知环境。可以使用OpenCV库来处理图像和视频数据,以便提取关键信息和特征点,例如,检测道路、识别标志、寻找物体等等。

    基于这些数据,您可以使用机器学习算法来训练一个目标检测器或者分类器。对于小车遇到的各种不同情况,分析不同的图像数据,然后在未来看到类似数据时,小车就可以自动“识别”这种情况并采取相应的措施。

    代码示例:

    import cv2
    
    # 读取视频文件
    cap = cv2.VideoCapture('test.mp4')
    
    while cap.isOpened():
        # 读取一帧
        ret, frame = cap.read()
    
        if not ret:
            break
    
        # 在图像中寻找道路并标记
        # ...
    
        # 在图像中查找停车标志并标记
        # ...
    
    cap.release()
    cv2.destroyAllWindows()
    

    第三步:控制运动和速度

    为小车配置电机或舵机,以便能够实现自主控制。您可以使用GPIO库来控制电路板中的引脚,从而控制小车的运动和速度。您还需要了解如何使用PWM信号控制电机,以便能够实现精细的控制。

    代码示例:

    import Jetson.GPIO as GPIO
    
    # 配置GPIO引脚
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(18, GPIO.OUT)
    
    # 使用PWM控制电机
    pwm = GPIO.PWM(18, 100)
    pwm.start(0)
    
    # 控制电机速度
    pwm.ChangeDutyCycle(50)
    
    # 控制电机方向
    GPIO.output(18, GPIO.HIGH)
    
    # 停止电机
    pwm.stop()
    GPIO.cleanup()
    

    第四步:实现避障和碰撞规避

    设计并实现一个避障和碰撞规避系统,使小车可以在遇到障碍物时自动停车和换道,避免与其他车辆或障碍物碰撞。您可以使用深度学习算法来训练一个目标检测器,以便在行驶过程中检测到障碍物并采取相应的措施。

    代码示例:

    import Jetson.GPIO as GPIO
    
    # 配置GPIO引脚
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(16, GPIO.IN)
    GPIO.setup(18, GPIO.OUT)
    
    # 定义检测函数
    def detect_obstacle():
        if GPIO.input(16):
            GPIO.output(18, GPIO.HIGH)
            # 向左转
        else:
            GPIO.output(18, GPIO.LOW)
            # 向右转
    
    # 循环检测障碍物
    while True:
        detect_obstacle()
    

    以上是我能够提供的一些建议和代码示例。我希望这些信息能够对您有所帮助。如果您有其他的问题或者需要进一步指导,请随时联系我。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

Python控制小车
可以借鉴下
https://www.bbsmax.com/A/nAJvb6DoJr/