【无人驾驶系列】基于ROS的无人驾驶系统

无人驾驶系统安全 作者:刘少山,李文超,唐洁 责编:何永灿,欢迎人工智能领域技术投稿、约稿、给文章纠错,请发送邮件至heyc@youkuaiyun.com 本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅2017年《程序员》 目前针对无人车攻击的方法有许多,如何防御这些攻击以保证无人车的安全是个重要的课题。本文是无人驾驶技术系列的第九篇,详细介绍针对无人车传感器、操作系统、控制系统、车联网的攻... 阅读详情

作者简介: 
刘少山,PerceptIn联合创始人,主要专注于增强现实、虚拟现实、机器人的核心SLAM技术及其在智能硬件上的实现与优化。创立PerceptIn之前在百度美国研发中心工作,负责无人车系统架构及产品化。 
张伟德,百度美国研发中心高级架构师。曾在弗吉尼亚大学网格计算小组担任研究员,在Yahoo!、微软等公司负责大型分布式搜索构架设计。目前在百度从事大数据、深度学习架构和开发。 
James Peng,百度首席架构师。斯坦福大学博士,研究方向包括云计算平台、深度学习、数据建模、大规模数据库等。曾在Google工作多年,加入百度后领导多个创新项目,并于2013年获得百度最高奖。 
责编:周建丁(zhoujd@youkuaiyun.com) 
本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅2016年《程序员》

本文是无人驾驶技术系列的第二篇。在上篇解析光学雷达(LiDAR)技术之后,本文着重介绍基于机器人操作系统ROS的无人驾驶系统。文中将介绍ROS以及它在无人驾驶场景中的优缺点,并讨论如何在ROS的基础上提升无人驾驶系统的可靠性、通信性能和安全性。

无人驾驶:多种技术的集成

无人驾驶技术是多个技术的集成,如图1所示,一个无人驾驶系统包含了多个传感器,包括长距雷达、激光雷达、短距雷达、摄像头、超声波、GPS、陀螺仪等。每个传感器在运行时都不断产生数据,而且系统对每个传感器产生的数据都有很强的实时处理要求。比如摄像头需要达到60FPS的帧率,意味着留给每帧的处理时间只有16毫秒。但当数据量增大之后,分配系统资源便成了一个难题。例如,当大量的激光雷达点云数据进入系统,占满CPU资源,就很可能使得摄像头的数据无法及时处理,导致无人驾驶系统错过交通灯的识别,造成严重后果。

图片描述

图1 无人驾驶系统范例

如图2所示,无人驾驶系统整合了多个软件模块(包括路径规划、避障、导航、交通信号监测等)和多个硬件模块(包括计算、控制、传感器模块等),如何有效调配软硬件资源也是一个挑战。具体包括三个问题:第一,当软硬件模块数据增加,运行期间难免有些模块会出现异常退出的问题,甚至导致系统崩溃,此时如何为提供系统自修复能力?第二,由于模块之间有很强的联系,如何管理模块间的有效通信(关键模块间的通信,信息不可丢失,不可有过大的延时)?第三,每个功能模块间如何进行资源隔离?如何分配计算与内存资源?当资源不足时如何确认更高的优先级执行?

图片描述

图2 无人驾驶软硬件整合

简单的嵌入式系统并不能满足无人驾驶系统的上述需求,我们需要一个成熟、稳定、高性能的操作系统去管理各个模块。在详细调研后,我们觉得机器人操作系统ROS比较适合无人驾驶场景。下文将介绍ROS的优缺点,以及如何改进ROS使之更适用于无人驾驶系统。

机器人操作系统(ROS)简介

ROS是一个强大而灵活的机器人编程框架,从软件构架的角度说,它是一种基于消息传递通信的分布式多进程框架。ROS很早就被机器人行业使用,很多知名的机器人开源库,比如基于quaternion的坐标转换、3D点云处理驱动、定位算法SLAM等都是开源贡献者基于ROS开发的。因为ROS本身是基于消息机制的,开发者可以根据功能把软件拆分成为各个模块,每个模块只是负责读取和分发消息,模块间通过消息关联。如图3所示,最左边的节点可能会负责从硬件驱动读取数据(比如Kinect),读出的数据会以消息的方式打包,ROS底层会识别这个消息的使用者,然后把消息数据分发给他们。

图片描述

图3 ROS系统

ROS 1.0

ROS 1.0起源于Willow Garage的PR2项目,主要组件包括ROS Master、ROS Node和ROS Service三种。ROS Master的主要功能是命名服务,它存储了启动时需要的运行时参数,消息发布上游节点和接收下游节点的连接名和连接方式,和已有ROS服务的连接名。ROS Node节点是真正的执行模块,对收到的消息进行处理,并且发布新的消息给下游节点。ROS Service是一种特殊的ROS节点,它相当于一个服务节点,接受请求并返回请求的结果。图4展示了ROS通信的流程顺序,首先节点会向master advertise或者subscribe感兴趣的topic。当创建连接时,下游节点会向上游节点TCP Server发布连接请求,等连接创建后,上游节点的消息就会通过连接送至下游节点。

图片描述

图4 ROS Master Node通信

ROS 2.0

ROS 2.0的改进主要是为了让ROS能够符合工业级的运行标准,采用了DDS(数据分发服务)这个工业级别的中间件来负责可靠通信,通信节点动态发现,并用shared memory方式使得通信效率更高。通过使用DDS,所有节点的通信拓扑结构都依赖于动态P2P的自发现模式,所以也就去掉ROS Master这个中心节点。如图5所示,RTI Context、PrismTech OpenSplice和Twin Oaks都是DDS的中间件提供商,上层通过DDS API封装,这样DDS的实现对于ROS Client透明。设计上ROS主页详细讨论了用DDS的原因,详情参见http://design.ros2.org/articles/ros_on_dds.html。

图片描述

图5 ROS 2.0 DDS

在无人车驾驶系统中, 我们选择依旧基于ROS 1.0 开发,而不是ROS 2.0,主要有以下几点考虑:

  1. ROS 2.0是一个开发中的框架,很多功能还不是很完整,有待更多的测试与验证。而在无人驾驶环境中,稳定性与安全性是至关重要的,我们需要基于一个经过验证的稳定系统来保证系统的稳定性、安全性和性能,以达到无人车的要求。
  2. DDS本身的耗费。我们测试了直接在ROS 1.0上使用DDS中间件,其中国防科技大学有一个开源项目MicROS已经做了相关的尝试,详情参见https://github.com/cyberdb/micROS-drt。但是实验发现在一般的ROS通信场景中(100K发送者接收者通信),ROS on DDS的吞吐率并不及ROS 1.0,主要原因是DDS框架本身的耗费要比ROS多一些,同时用了DDS以后CPU占用率有明显提高。但是我们也确认了使用DDS之后,ROS的QoS高优先级的吞吐率和组播能力有了大幅提升。我们的测试基于PrismTech OpenSplice的社区版,在它的企业版中有针对单机的优化,比如使用了共享内存的优化,我们暂未测试。
  3. DDS接口的复杂性。DDS本身就是一套庞大的系统,其接口的定义极其复杂,同时文档支持较薄弱。

系统可靠性

如上文所述,系统可靠性是无人驾驶系统最重要的特性。试想几个场景:第一,系统运行时ROSMaster出错退出,导致系统崩溃;第二,其中一个ROS节点出错,导致系统部分功能缺失。以上任何一个场景在无人驾驶环境中都可能造成严重的后果。对于ROS而言,其在工业领域的应用可靠性是非常重要的设计考量,但是目前的ROS设计对这方面考虑得比较少。下面就讨论实时系统的可靠性涉及的一些要素。

去中心化

ROS重要节点需要热备份,以便宕机时可以随时切换。在ROS 1.0的设计中,主节点维护了系统运行所需的连接、参数和主题信息,如果ROS Master宕机了,整个系统就有可能无法正常运行。去中心化的解决方案有很多,如图6所示,我们可以采用主从节点的方式(类似ZooKeeper),同时主节点的写入信息随时备份,主节点宕机后,备份节点被切换为主节点,并且用备份的主节点完成信息初始化。

图片描述

图6 基于ZooKeeper的监控和报警

实时监控和报警

对于运行的节点实时监控其运行数据,并检测到严重的错误信息时报警。目前ROS并没有针对监控做太多的构架考虑,然而这块方面恰恰是最重要的。对于运行时的节点,监控其运行数据,比如应用层统计信息、运行状态等,对将来的调试、错误追踪都有很多好处。如图7所示,实时监控从软件构架来说主要分成3部分:ROS节点层的监控数据API,让开发者能够设置所需的统计信息,通过统一的API进行记录;监控服务端定期从节点获取监控数据(对于紧急的报警信息,节点可以把消息推送给监控服务端);获取到监控数据后,监控服务端对数据进行整合、分析、记录,在察觉到异常信息后报警。

图片描述

图7 基于ZooKeeper的监控和报警

节点宕机状态恢复

节点宕机的时候,需要通过重启的机制恢复节点,这个重启可以是无状态的,但有些时候也必须是有状态的,因此状态的备份格外重要。节点的宕机检测也是非常重要的,如果察觉到节点宕机,必须很快地使用备份的数据重启。这个功能我们也已经在ZooKeeper框架下实现了。

系统通信性能提升

由于无人驾驶系统模块很多,模块间的信息交互很频繁,提升系统通信性能会对整个系统性能提升的作用很大。我们主要从以下三个方面来提高性能:

第一,目前同一个机器上的ROS节点间的通信使用网络栈的loop-back机制,也就是说每一个数据包都需要经过多层软件栈处理,这将造成不必要的延时(每次20微秒左右)与资源消耗。为了解决这个问题,我们可以使用共享内存的方法把数据memory-map到内存中,然后只传递数据的地址与大小信息,从而把数据传输延时控制在20微秒内,并且节省了许多CPU资源。

第二,现在ROS做数据broadcast的时候,底层实现其实是使用multiple unicast,也就是多个点对点的发送。假如要把数据传给5个节点,那么同样的数据会被拷贝5份。这造成了很大的资源浪费,特别是内存资源的浪费。另外,这样也会对通信系统的吞吐量造成很大压力。为了解决这个问题,我们使用了组播multicast机制:在发送节点和每一接收节点之间实现点对多点的网络连接。如果一个发送节点同时给多个接收节点传输相同的数据,只需复制一份相同的数据包。组播机制提高了数据传送效率,减少了骨干网络出现拥塞的可能性。图8对比了原有的通信机制(灰线)与组播机制(橙色)的性能,随着接收节点数量增加(X轴),原有的通信机制的数据吞吐量急剧下降,而组播机制的数据吞吐量则比较平稳,没有受到严重影响。

图片描述

图8 Multicast性能提升

第三,对ROS的通信栈研究,我们发现通信延时很大的损耗是在数据的序列化与反序列化的过程。序列化将内存里对象的状态信息转换为可以存储或传输的形式。在序列化期间,对象将其当前状态写入到临时或持久性存储区。之后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。为了解决这个问题,我们使用了轻量级的序列化程序,将序列化的延时降低了50%。

系统资源管理与安全性

如何解决资源分配与安全问题是无人驾驶技术的一个大课题。想象两个简单的攻击场景:第一,其中一个ROS的节点被劫持,然后不断地分配内存,导致系统内存消耗殆尽,造成系统OOM而开始关闭不同的ROS节点进程,从而整个无人驾驶系统崩溃。第二,ROS的topic或者service被劫持, ROS节点之间传递的信息被伪造,导致无人驾驶系统行为异常。

我们选择的方法是使用Linux Container(LXC)来管理每一个ROS节点进程。简单来说,LXC提供轻量级的虚拟化以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化等其他复杂功能,相当于C++中的NameSpace。LXC有效地将单个操作系统管理的资源划分到孤立的群组中,以更好地在孤立的群组之间平衡有冲突的资源使用需求。对于无人驾驶场景来说,LXC最大的好处是性能损耗小。我们测试发现,在运行时LXC只造成了5%左右的CPU损耗。

除了资源限制外,LXC也提供了沙盒支持,使得系统可以限制ROS节点进程的权限。为了避免有危险性的ROS节点进程可能破坏其他ROS节点进程的运行,沙盒技术可以限制可能有危险性的ROS节点访问磁盘、内存以及网络资源。另外为了防止节点中的通信被劫持,我们还实现了节点中通信的轻量级加密解密机制,使黑客不能回放或更改通信内容。

结论

要保证一个复杂的系统稳定、高效地运行,每个模块都能发挥出最大的潜能,需要一个成熟有效的管理机制。在无人驾驶场景中,ROS提供了这样一个管理机制,使得系统中的每个软硬件模块都能有效地进行互动。原生的ROS提供了许多必要的功能,但是这些功能并不能满足无人驾驶的所有需求,因此我们在ROS之上进一步地提高了系统的性能与可靠性,完成了有效的资源管理及隔离。我们相信随着无人驾驶技术的发展,更多的系统需求会被提出,比如车车互联、车与城市交通系统互联、云车互联、异构计算硬件加速等,我们也将会持续优化这个系统,力求让它变成无人驾驶的标准系统。

无人驾驶技术系列文章将讨论ROS系统、高精地图、路径规划、底层控制和视觉识别等技术。整体规划如下,敬请期待:

  1. LiDAR
  2. ROS
  3. Map
  4. GPS + IMU
  5. Camera
  6. Planning
  7. Control
  8. Data platform
  9. Simulation
  10. Communications
资源 | 最全的12篇无人驾驶技术系列文章 无人驾驶作为人工智能的集大成应用,从来就不是某单一的技术,而是众多技术点的整合。技术上它需要有算法上的创新、系统上的融合,以及来自云平台的支持。本文整合了首发于《程序员》的无人驾驶系列技术文章,点击以下蓝色标题即可阅读:光学雷达(LiDAR)在无人驾驶技术中的应用本文为《程序员》无人驾驶技术系列文章的第一篇,深入解析光学雷达(LiDAR)在无人车研发中的应用,包括光学雷达的工作原理,在地图绘制、定... 阅读详情

相关推荐

无人驾驶汽车系统入门(十四)——ROS入门与实践(1)

原文链接: https://blog.youkuaiyun.com/adamshan/article/details/79653378 无人驾驶汽车系统入门(十四)——ROS入门与实践(1) 前言:作为目前最广泛使用的开源机器人软件平台,ROS(Robot Operating System)极大的提升了机器人开发的效率。目前无人驾驶系统的实际实现仍然依赖于ROS,作为一个相对成熟的机器人软件平台,ROS虽然存在一些缺点,在无人驾驶系统的系统实现上,ROS仍然是开源框架中最好的选择,这也是为什么诸如Apollo,Auto

bd007mycs的专栏 1394

无人车采用纯跟踪算法跟随离线路径(ROS,C++实现)第一部分

上面就是自己做的一个简单的路径跟踪,在离线测试过程中,输出转角的变化率最大变化是-5快速变化到20,所以基本是认为可行的,后续会等实验室的车修好,在实车上进行测试,再具体对整体测试效果进行梳理。

m0_46699649的博客 3950

RTI Connext DDS(1)

RTI Connext提供了高度分布式、智能自治的应用系统的第一个软件优化框架。 RTI Connext DDS具备了优秀的数据分发服务能力, 1)数据传输性能,满足了严格的实时要求,以低延迟分发大量数据; 2)提供了标准化身份验证、加密和访问控制提供细粒度安全服务; 3)能够加快集成并简化对已部署系统的增量更新; 4)提供无单点故障的高度可用性,非常适合任务关键型系统; RTI Connext DDS提供了30天试用版,https://www.rti.com/

pony12的专栏 1219

一步一步自己动手实现一台阿克曼ROS无人车

带你一步一步自己动手实现一台阿克曼ROS无人车。

COONEO的博客 5292

gps小车程序

基于stm32芯片的两轮差分驱动的移动机器人gps自动导航技术

从一根USB线缆说起:深入浅出聊聊那些影响信号完整性和EMC性能的‘小细节’(双绞、屏蔽、360度搭接全解析)

本文深入探讨了USB线缆中影响信号完整性和EMC性能的关键细节,包括双绞线绞距、屏蔽层设计和360度搭接工艺。通过实验数据和实用技巧,揭示了这些‘小细节’如何显著影响高频信号质量和电磁兼容性,为工程师提供了从选购到系统设计的全面指南。

weixin_30824479的博客 439

【无人驾驶系列二】基于ROS的无人驾驶系统

本文是无人驾驶技术系列的第二篇。在上篇解析光学雷达(LiDAR)技术之后,本文着重介绍基于机器人操作系统ROS的无人驾驶系统。文中将介绍ROS以及它在无人驾驶场景中的优缺点,并讨论如何在ROS的基础上提升无人驾驶系统的可靠性、通信性能和安全性。 无人驾驶:多种技术的集成 无人驾驶技术是多个技术的集成,如图1所示,一个无人驾驶系统包含了多个传感器,包括长距雷达、激光雷达、短距雷达、摄像头、超声...

天空之城 4135

大模型学习路线之多模态模型

​ (Frankly speaking,博主太懒了)章节一只对CLIP、BLIP、BLIP2、InstructBLIP进行了整理,章节二以CLIP、VisualGLM作为实践案例。​ 实际上多模态模型除了CLIP、BLIP、BLIP2、InstructBLIP,还有LLaVA、miniGPT4,以及国内清华的VisualGLM、阿里的Qwen-VL等。(更多多模态原理可以看文末的参考说明)一、多模态模型 & 理论。

2401_86435672的博客 2290

【亲测免费】 分享【无人驾驶系列】基于ROS的无人驾驶系统 PPT教材

分享【无人驾驶系列】基于ROS的无人驾驶系统 PPT教材 去发现同类优质开源项目:https://gitcode.com/ 资源介绍 本仓库提供了一份名为“分享【无人驾驶系列】基于ROS的无人驾驶系统 PPT教材”的资源文件。该文件详细介绍了基于ROS(Robot Operating System)的无人驾驶系统,涵盖了无人驾驶技术的核心概念、系统架构、关键组件以及实际应用案例。 内容概述 无人...

gitblog_09757的博客 485

YOLOv8的特征蒸馏代码应用讲解(CWD/MGD/mimic/在线蒸馏/逻辑蒸馏)

基于YOLOv8的逻辑蒸馏、特征蒸馏、在线蒸馏等方法代码介绍。

qq_41920323的博客 2583

人工智能---什么是Transformer?

Transformer是一种强大的神经网络架构,最初由Google的研究人员在论文《Attention is All You Need》中提出,用于自然语言处理任务,特别是在机器翻译方面取得了巨大成功。Transformer的核心思想是完全基于自注意力机制(self-attention mechanism)来实现序列到序列(sequence-to-sequence)的学习。它在自然语言处理(NLP)和其他序列到序列任务中表现出色,逐渐成为该领域的主流模型。近些年也逐渐在自动驾驶领域有所应用。

智能汽车人的博客 3955

无人驾驶系统Autoware与仿真环境LGSVL Simulator联合配置

在此,把在Ubuntu 16.04中,搭建无人驾驶系统Autoware编译环境、配置无人驾驶仿真环境LGSVL Simulator、并进行联合测试的步骤,记录下来,以备查阅。 系统配置: 我所用的配置,需要两个系统:一个Ubuntu系统,一个Windows 10系统。 1. 在Ubuntu系统上,安装无人驾驶系统Autoware,可参考: 无人驾驶系统Autoware的Docker环境配置...

Zhanglin_Wu的专栏, C++, Scrum, LLVM, 编译器 9589

多思计组实验实验六 微程序控制器实验

实验六 微程序控制器实验

qq_53089329的博客 3784

无人驾驶系统Autoware的Docker环境配置

在此,把在Ubuntu 16.04中,搭建无人驾驶系统Autoware的Docker编译环境,记录下来,以备查阅。 Autoware是一款开源的无人驾驶系统,官方网站为:https://www.autoware.ai/ 1. 安装CUDA,Docker,Nvidia Docker 关于如何安装CUDA,Docker CE,以及Nvidia Docker,可参考: 在Ubuntu 16.04...

Zhanglin_Wu的专栏, C++, Scrum, LLVM, 编译器 4643

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案解析

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案解析

伶俐角少儿编程 712

CTR-GCN 论文解读

提出了一种信道拓扑优化图卷积,该卷积可以动态有效地对信道拓扑进行建模。共享拓扑是一个参数化的邻接矩阵,作为所有通道的拓扑先验,并提供顶点之间的一般相关性。通过使用特定于通道的相关性细化共享拓扑,CTR-GC 获得了通道拓扑。

一杯水果茶!足矣~ 3088

【亲测免费】 探索未来:基于ROS的无人驾驶系统PPT教材推荐

探索未来:基于ROS的无人驾驶系统PPT教材推荐 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在科技飞速发展的今天,无人驾驶技术已成为人工智能领域的热门话题。为了帮助广大技术爱好者、学生、研究人员以及工程师深入了解这一前沿技术,我们推出了“分享【无人驾驶系列】基于ROS的无人驾驶系统PPT教材”。这份教材详细介绍了基于ROS(Robot Operating Syst...

gitblog_09709的博客 461

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

基于机器人操作系统ROS的无人驾驶系统,这些优缺点要知道

本文着重介绍基于机器人操作系统ROS的无人驾驶系统。文中将介绍ROS以及它在无人驾驶场景中的优缺点,并讨论如何在ROS的基础上提升无人驾驶系统的可靠性、通信性能和安全性。 在上篇解析光学雷达(LiDAR)技术(《》)之后,本文着重介绍基于机器人操作系统ROS的无人驾驶系统。文中将介绍ROS以及它在无人驾驶场景中的优缺点,并讨论如何在ROS的基础上提升无人驾驶系统的可靠性、通信性能

linuxarmsummary的专栏 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【实时Linux实战系列】无人驾驶系统中的实时决策支持

本文介绍了基于实时Linux系统的无人驾驶实时决策支持技术实现。主要内容包括:1)系统核心概念,包括实时任务特性及相关通信协议;2)开发环境配置,涵盖ROS、Python、OpenCV等工具的安装;3)关键功能实现,包括传感器数据处理、环境感知和路径规划;4)常见问题解决方案和实践建议。通过整合Raspberry Pi、NVIDIA Jetson等硬件及ROS等软件工具,构建了完整的无人驾驶决策系统。该技术可应用于自动驾驶汽车、智能交通等领域,为开发者提供了构建高效实时决策系统的完整解决方案。

望获实时Linux系统 1406

基于STM32的快递小车无人驾驶系统

设计了一种基于stm32的快递小车控制系统,实现对小车的运动控制和环境感知。系统采用了stm32开发板作为控制核心,结合电机驱动模块、传感器模块、语音与远程控制模块等多种硬件部件,构建了一个稳定、可靠和灵活的控制系统。通过对小车的运动控制,实现小车智能化地行进和存取快递功能;通过环境感知,让小车能够感知到周围的障碍物和墙壁等,从而完善了小车的自主性和适应性。实验结果表明,本控制系统具有高度的控制精度和稳定性,能够满足小车长时间工作的要求。

4733
上一篇: Android系统多任务双屏异显
下一篇: 纳雷科技周坤明:毫米波雷达的开发与应用技术
RyanLeiWang
博客等级 码龄20年 184粉丝 40原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值