近年来,自动驾驶汽车成为越来越受关注的话题,因为许多公司正在积极开发相关的硬件和软件技术,来实现无需人工干预的全自动驾驶能力。深度神经网络(DNN)已成功应用于各种感知和控制任务,它们也是自动驾驶汽车的重要工作负载。什么是DeepPiCar?DeepPicar是NVIDIA名为DAVE-2的真正自动驾驶汽车的小规模复制品。使用DeepPicar,我们分析了RaspberryPi的计算能力,支持基于端到端深度学习的自动驾驶汽车实时控制。项目理念:通过从人工驾驶切换到自动驾驶来控制车辆。零件清单:PiCar-S树莓派智能机器人车载套件树莓派3GoogleEdgeTPU协处理器微型SD卡16GB广角USB摄像头1.3兆像素,带170度鱼眼镜头适配器HDMI90度角电池18650充电器第1步:集齐所有零部件PiCar-S树莓派智能机器人车载套件https://www.banggood.com/SunFounder-PiCar-S-Raspbe...树莓派3https://ar.banggood.com/Raspberry-Pi-3-Model-B+-.....GoogleEdgeTPU协处理器https://saudi.desertcart.com/products/125589101-go...广角USB摄像头1.3兆像素,带170度鱼眼镜头https://etqan.sa/product/usb-camera/?gclid=CjwKCAi...适配器HDMI90度角https://www.banggood.com/Ugreen-HD112-HDMI-Male-to...电池18650https://etqan.sa/product/18650-battery-3-7v-recha...充电器微型SD卡16GB第2步:关于GoogleEdgeTPU加速器CoralUSBAccelerator是目前现有Linux系统带有强大机器学习功能的演算机器。USBAccelerator采用EdgeTPU(一种由Google设计和制造的小型ASIC),可通过USB3.0接口以低功耗提供高性能机器学习演算。EdgeTPU主要优点:-高速TensorFlowLite-低电量-占地面积小特点:GoogleEdgeTPUML加速器协处理器USB3.0Type-C插座支持主机CPU上的DebianLinux模型使用TensorFlow构建。尽管可以自定义架构,但完全支持MobileNet和Inception架构与GoogleCloud兼容。Coral是Google的一个拓展功能,通过本地AI平台帮助构建智能想法。第3步:树莓派设置要对RaspberryPi进行设置,您需要:微型SD卡微型USB数据线键盘鼠标HDMI显示器HDMI线设置步骤:连接好microSD卡后,开始从树莓派官网https://www.raspberrypi.org/downloads/下载obrution系统,使用NOBBS软件,通过copping下载到microSD卡上面的所有文件。之后,将microSD卡插入树莓派并插入所有电缆,所有选项都会在屏幕上看到。第4步:组装和安装使用说明书,我们开始安装PiCar套件,该套件包含:说明书皮卡车的主体直流电机直流电机驱动器(TRA9118A)降压DC-DC转换器模块伺服电机带调制模块的脉冲(PWMPCA9685)调节器USB摄像头USB模块电池18650(3.7V)电池盒车轮(4)电线螺丝刀(不同种类的)螺丝注1:在开始安装之前,请确保套件的每个电子部件都能正常工作,分别进行测试。注2:如果您使用的是树莓派3及以上版本,则无需安装天线,因为raspberry具有内部Wifi和蓝牙。零件的组装经过几个阶段:从背面组装亚克力板和车轮在车的主体上安装电机在树莓派上进行伺服校准注意:由于舵机在后部,因此需要进行一些配置以进行保护。我们需要在安装时使舵机旋转到90度,这样旋转范围才能与汽车中的应用相匹配。否则可能会损坏舵机。从正面组装亚克力板和车轮电气模块组装电路连接安装相关视频:安装#1-YouTube安装#2-YouTube安装#3-YouTube安装#4-YouTubepicar说明书.pdf第5步:手工制作模型制作交通标志并与项目配合使用的手工艺品很少。我们使用的标志:红色交通灯绿色交通灯停止标志速度标志人(我们用的是乐高玩具)此步骤的相关视频:手工艺品第6步:使用RaspberryPi设置Picar对于GoogleEdgeTPUAccelerator,将设置所需的所有计算机视觉和深度学习软件。我们使用的主要软件工具是Python、OpenCV(一个强大的计算机视觉包)和TensorFlow(谷歌流行的深度学习框架)。注意:我们在这里使用的所有软件都是免费和开源的。树莓派操作系统设置设置远程访问(IP地址/sudo/SSH/VNC)设置远程文件访问安装USB摄像头获取源代码,直接从Github下载源代码到您的PC上:https://github.com/sunfounder/Sunfounder_Smart_Vid...安装Python软件,访问Python网站www.python.org,找到最新的Python3并安装。安装完成后,重新启动计算机,然后按照说明书上的说明继续安装。运行cali_client开始校准马达调整车削调整安装调整现在我们有了一个可以通过Python控制的正在运行的机器人汽车。下面是我开源的代码和文件仅供参考:setup.pycamera.pyi2cHelper.py第7步:机器学习和实践在我们运行程序之前,我们应该给picar一个视觉处理(相机和OpenCV)和一个计算处理(TensorFlow),所以我们必须首先遵循:用于计算机视觉的OpenCV安装OpenCV和相关库为EdgeTPU安装张量流在这一步中,我们将使用单次射击多盒物体检测和迁移学习等深度学习技术来教DeepPiCar检测道路上的各种(微型)交通标志和行人。然后我们将教它在红灯和停车标志处停车,绿灯行驶,停车等待行人通过,并根据张贴的限速标志更改其限速,并为Picar进行大量练习。下面是一些机器学习和实践的相关视频:机器学习练习视频-1练习视频-2练习视频-3练习视频-4端到端深度学习笔记本“如何轻松免费地训练目标检测模型”第8步:最终产品演示在这一步中,我们展示了最终产品,一个无需人工干预即可控制车辆的仿真模型。下面是源代码仅供参考:importloggingimportpicarimportcv2importdatetimefromhand_coded_lane_followerimportHandCodedLaneFollowerfromobjects_on_road_processorimportObjectsOnRoadProcessorimporttime_SHOW_IMAGE=TrueclassDeepPiCar(object):__INITIAL_SPEED=0__SCREEN_WIDTH=340#__SCREEN_WIDTH=320__SCREEN_HEIGHT=240def__init__(self):"""Initcameraandwheels"""logging.info('CreatingaDeepPiCar...')picar.setup()logging.debug('Setupcamera')#self.camera=cv2.VideoCapture(-1)self.camera=cv2.VideoCapture(0)self.camera.set(3,self.__SCREEN_WIDTH)self.camera.set(4,self.__SCREEN_HEIGHT)self.pan_servo=picar.Servo.Servo(1)#self.pan_servo.offset=-30#calibrateservotocenterself.pan_servo.offset=0self.pan_servo.write(90)self.tilt_servo=picar.Servo.Servo(2)#self.tilt_servo.offset=20#calibrateservotocenterself.tilt_servo.offset=0self.tilt_servo.write(90)logging.debug('Setupbackwheels')self.back_wheels=picar.back_wheels.Back_Wheels()self.back_wheels.speed=0#SpeedRangeis0(stop)-100(fastest)###self.back_wheels.forward()logging.debug('Setupfrontwheels')self.front_wheels=picar.front_wheels.Front_Wheels()#self.front_wheels.turning_offset=-25#calibrateservotocenterself.front_wheels.turning_offset=0self.front_wheels.turn(90)#SteeringRangeis45(left)-90(center)-135(right)self.lane_follower=HandCodedLaneFollower(self)self.traffic_sign_processor=ObjectsOnRoadProcessor(self)#lane_follower=DeepLearningLaneFollower()self.fourcc=cv2.VideoWriter_fourcc(*'XVID')datestr=datetime.datetime.now().strftime("%y%m%d_%H%M%S")self.video_orig=self.create_video_recorder('../data/tmp/car_video%s.avi'%datestr)self.video_lane=self.create_video_recorder('../data/tmp/car_video_lane%s.avi'%datestr)self.video_objs=self.create_video_recorder('../data/tmp/car_video_objs%s.avi'%datestr)logging.info('CreatedaDeepPiCar')defcreate_video_recorder(self,path):returncv2.VideoWriter(path,self.fourcc,20.0,(self.__SCREEN_WIDTH,self.__SCREEN_HEIGHT))#returncv2.VideoWriter(path,self.fourcc,20.0,(self.__SCREEN_WIDTH,self.__SCREEN_HEIGHT))def__enter__(self):"""Enteringawithstatement"""returnselfdef__exit__(self,_type,value,traceback):"""Exitawithstatement"""iftracebackisnotNone:#Exceptionoccurred:logging.error('Exitingwithstatementwithexception%s'%traceback)self.cleanup()defcleanup(self):"""Resetthehardware"""logging.info('Stoppingthecar,resettinghardware.')self.back_wheels.speed=0self.front_wheels.turn(90)self.camera.release()self.video_orig.release()self.video_lane.release()self.video_objs.release()cv2.destroyAllWindows()defdrive(self,speed=__INITIAL_SPEED):"""Mainentrypointofthecar,andputitindrivemodeKeywordarguments:speed--speedofbackwheel,rangeis0(stop)-100(fastest)"""logging.info('Startingtodriveatspeed%s...'%speed)self.back_wheels.speed=speedself.back_wheels.forward()i=0whileself.camera.isOpened():_,image_lane=self.camera.read()image_objs=image_lane.copy()i+=1self.video_orig.write(image_lane)image_objs=self.process_objects_on_road(image_objs)self.video_objs.write(image_objs)show_image('DetectedObjects',image_objs)image_lane=self.follow_lane(image_lane)self.video_lane.write(image_lane)show_image('LaneLines',image_lane)ifcv2.waitKey(1)&0xFF==ord('q'):self.cleanup()breakdefprocess_objects_on_road(self,image):image=self.traffic_sign_processor.process_objects_on_road(image)returnimagedeffollow_lane(self,image):image=self.lane_follower.follow_lane(image)returnimage#############################UtilityFunctions############################defshow_image(title,frame,show=_SHOW_IMAGE):ifshow:cv2.imshow(title,frame)defmain():withDeepPiCar()ascar:car.drive(17)if__name__=='__main__':logging.basicConfig(level=logging.DEBUG,format='%(levelname)-5s:%(asctime)s:%(message)s')main()deep_pi_car.pydriver_main.py