自动驾驶
文章平均质量分 65
主要学习自动驾驶技术,apollo技术
H-KING
学海无涯
展开
-
百度自动驾驶apollo源码解读23:/cyber/time模块和/cyber/timer模块
这两个都是和时间相关的模块,一起解读吧。原创 2023-06-15 15:01:06 · 5271 阅读 · 3 评论 -
百度自动驾驶apollo源码解读22:/cyber/node模块和/cyber/service模块
为什么要同时解读两个模块?因为:原作者把service单独领出来做了个模块,个人感觉没必要,此部分逻辑放在node模块之下更贴切。本篇文章做了统一解读。原创 2023-06-08 15:16:49 · 1380 阅读 · 0 评论 -
百度自动驾驶apollo源码解读18:cyber通讯系统
这些通讯方式是不是仍有优化点?我们现在清晰的知道,第三种通讯方式当数据量大的时候是非常不太稳定,是不是设计有问题呢,或者说fastrtps库已经到达了极限,看清楚源代码有助于解决这些问题。今天开始研究cyber的通讯模块,这个东西网上分析和解说有一大堆,想要自己真正理解还是要读懂源代码,通讯模块是最复杂的模块吧。以下模块都是通讯模块的一员,其实有了前面的基础,这些代码难倒不是很难,就是体量大,需要梳理和总结。原创 2023-05-09 14:48:38 · 654 阅读 · 2 评论 -
百度自动驾驶apollo源码解读19:/cyber/class_loader 模块
简单来讲这个模块是干什么用的:大型系统一般不是由单个可执行程序代码组成的,而是夹杂了很多动态库,linux下的就是so文件,如何把这些so里面的类导出来,可执行程序如何动态的加载他们,比如一共写了6个so,只想动态的加载其中3个,运行过程中甚至想卸载掉其中的几个用以释放相关的资源,这个模块就是干这个工作的。原创 2023-05-29 17:31:52 · 576 阅读 · 0 评论 -
百度自动驾驶apollo源码解读20:/cyber/mainboard 模块
该模块主要包含3部分:进程主函数、ModuleArgument类、ModuleController类。原创 2023-05-30 10:58:37 · 704 阅读 · 0 评论 -
百度自动驾驶apollo源码解读21:/cyber/component 模块
成员属性有四个is_shutdown_、node_、config_file_path_、readers_,前三个都好理解的,其中的node_成员要说一下,所有Component都自带了Node成员指针,无需自己新建一个,一个Component对应一个Node对于最后一个成员readers_,不是很好理解,既然有了reader列表那是不是writer也安排一下?TimerComponent类是一个普通类,他默认提供了一个定时器的功能,就是可以在配置文件里面写一下多长时间回调一次Proc()。原创 2023-05-31 15:25:00 · 765 阅读 · 0 评论 -
百度自动驾驶apollo源码解读17:/cyber/python 模块
我们从上述pyton写的talker说起,分析来分析去,最后的结果就是格式为proto的ChatterBenchmark数据最后被当做message::PyMessageWrap类型写出去了,或者更确切的说是ChatterBenchmark先调用了SerializeToString(), 这个字符串作为PyMessageWrap的成员data_,最后将PyMessageWrap发布到了cyber里面,怪不得叫做Wrap就是再给包裹一层,这么做的意义是什么呢?系统要安装基本的编译库,和python开发库。原创 2023-04-27 15:49:03 · 841 阅读 · 1 评论 -
百度自动驾驶apollo源码解读16:/cyber/message 模块
google::protobuf::Message,并且会自带很多接口函数,比如查询、设置字段值的,查询设置整体proto属性值的,比如SetTypeName、ByteSizeLong等,有静态函数,也有成员函数,还有序列化、反序列化的。消息头,序列化的时候将次头放在protobuf形成的内存前面,主要记录一些属性值,比如消息序列号、消息体的大小等,message_traits里面有两个接口ParseFromHC和SerializeToHC。于实现不同的消息种类,最后给外面呈现的统一接口名字。原创 2023-04-26 13:59:02 · 839 阅读 · 1 评论 -
百度自动驾驶apollo源码解读15:懒汉式单例宏DECLARE_SINGLETON
此处我给加了注释贴出来。原创 2023-04-25 16:49:18 · 392 阅读 · 0 评论 -
百度自动驾驶apollo源码解读14:接口存在判定宏DEFINE_TYPE_TRAIT
首先是有一个模板类(使用的是struct),有一个模板参数T,它里面有一个成员变量value类型为bool,和两个成员重载模板函数Test,然后value的值是通过调用Test函数获取到的,具体调用那个函数呢?按照编译规则(个人猜测)应该首先尝试调用Test(decltype(&Class::func)*),如果调用了此函数,就会返回true,如果没有调用此函数就调用后补函数Test(...),返回false,为什么叫他后补函数呢,因为他的参数很特殊,三个点,可传递任意参数,当然意味着他的优先级比较低。原创 2023-04-24 17:36:29 · 274 阅读 · 0 评论 -
百度自动驾驶apollo源码解读13:无锁无界队列UnboundedQueue
我这边给加了注释和测试程序。原创 2023-03-17 11:09:26 · 392 阅读 · 0 评论 -
百度自动驾驶apollo源码解读12:线程池
在激光雷达里面看到了一个线程池的代码,默认项目里面没有,是激光雷达厂商提供的吧。仅用一个头文件去实现,此处贴出来源码吧。utility.cpp实现文件。utility.h头文件。写一个简单的测试例子。原创 2023-03-16 14:18:26 · 1640 阅读 · 4 评论 -
百度自动驾驶apollo源码解读11:无锁哈希表AtomicHashMap
直接上源代码吧,代码是阿波罗团队写的源代码,我这边给加了注释。简单写了个main.cpp对一些功能进行测试。原创 2023-03-10 13:15:46 · 658 阅读 · 1 评论 -
百度自动驾驶apollo源码解读10:信号槽机制
大家都知道Qt的信号槽机制给编程带来了极大的便利,阿波罗通讯主要通过同一channel的读写,简而言之就是发布订阅模型,这个时候信号槽的机制就显得极为实用,阿波罗在cyber基础类库里面用C++模板类自己写了一套信号槽机制,值的学习。1.和qt的信号槽差不多,不处理返回值,即发送信号函数没有返回值,槽函数执行不处理返回值2.信号、槽、连接都封装成了类3.推荐信号和槽参数一致4.主要用到地方:底层通信机制来看看怎么使用...原创 2022-07-08 16:32:09 · 771 阅读 · 0 评论 -
百度自动驾驶apollo源码解读9:无锁有界队列BoundedQueue
在此贴出来apollo源代码,本篇只是源码解读,想要看此文件依赖的相关文件可访问:https://github.com/ApolloAuto/apollo/tree/master/cyber/base1.整个类是个数组,指定大小的数组,意味着数据是连续存储的。2.Init的时候会申请好相关的内存,大小为(N+2)*单个大小,为什么是n+2?想不通3.数据的存储如下图所示 队列大小是固定的,超过指定数量再进行加入会失败。数据是循环往复利用的,感觉上就是环形内存池4.之所以是无锁队列是因为底层有原子操作5原创 2022-07-07 13:53:06 · 893 阅读 · 0 评论 -
百度自动驾驶apollo源码解读8:/cyber/sysmo 模块
SysMo是一个用DECLARE_SINGLETON宏实现的单例类,在公开函数cyber::Init里面执行了SysMo::Instance进行实例化,SysMo构造函数执行了自己的Start函数,检测环境变量sysmo_start的值是否为1,若为1则开启一个线程不停的调用scheduler::Instance()->CheckSchedStatus,调用间隔为100毫秒,上述CheckSchedStatus函数执行逻辑是遍历所有执行器的快照状态,是否为空闲,若在干活则输出干了多长时间了以及协程的名字,线原创 2022-07-01 13:05:15 · 691 阅读 · 0 评论 -
百度自动驾驶apollo源码解读7:/cyber/scheduler 模块
cyber提供的三大功能:调度功能、通讯功能、组件。其中调度功能最核心的逻辑在/cyber/scheduler下面,本篇文章主要自己对该模块的研读和理解,可能会有错误,看到的朋友帮忙点播一下。首先看下牵涉到协程的一些基本概念图谱,对协程有些基本的概念和了解 再次看下阿波罗设计的协程-调度系统类关系图谱,这个理解这个图谱会对阅读源代码有所帮助,推荐边看源代码边看图谱 里面有两大调度方案:classic(经典)和choreography(编排),图谱如下 进入正文cyber主要提供了两种协程的调度方案class原创 2022-06-24 16:11:28 · 2762 阅读 · 0 评论 -
百度自动驾驶apollo源码解读6:/cyber/croutine 模块
本篇解读一下/cyber/croutine模块,该模块文件比较少,detail文件夹,CRoutine类,RoutineFactory模板类1.detail文件夹主要实现类似linux下的ucontext_t结构和其四个关联函数getcontext、setcontext、makecontext、swapcontext.实现堆栈的创建保存和切换,为什么不使用linux自带api而是要自己用汇编实现呢?有博主文章说linux那一套api最终要牵扯到系统内核里面,cyber自己实现这一套完全是应用层的,可以进一原创 2022-06-17 16:45:57 · 1141 阅读 · 2 评论 -
百度自动驾驶apollo源码解读5:cyber的Service踩坑笔记
1.坑描述:不用临时变量接收函数node->CreateService返回值导致服务创建失败2.前戏:cyber作为ROS的替代品提供了主要两大功能:调度功能和通讯功能.通讯功能包括订阅发布模式和一问一答的Service模式.本篇主要讲的是Service模式下的一个坑.Service的主要实现代码在/cyber/service下面,仅4个文件(两个头文件两个实现文件).可谓相当的精巧.怎么使用呢?源代码里面/cyber/examples/service.cc.50多行代码展示了如何使用他的Service功能原创 2022-06-08 16:15:26 · 897 阅读 · 2 评论 -
百度自动驾驶apollo源码解读4:/cyber/task 模块
在这里就不贴源代码,太占空间了,源码连接:https://github.com/ApolloAuto/apollo/tree/master/cyber/taskcyber下面的task包是使用cyber协程的入口包,共有5个文件如下:BUILD文件:构建文件task_manager.h文件:任务管理头文件task_manager.cc文件:任务管理主文件task_test.cc文件:任务管理测试文件task.h文件对task_manager封装使用的文件构建文件和测试文件不再赘述,和其他包类似,比原创 2022-06-01 13:43:58 · 1357 阅读 · 0 评论 -
百度自动驾驶apollo源码解读3:进程或线程设置调度策略、优先级
1.利用setpriority调整“进程”优先级,测试优先级对进程的影响(注:是进程而不是线程)定义函数 int setpriority(int which,int who, int prio);参数1 : PRIO_PROCESS who为进程识别码 PRIO_PGRP who 为进程的组识别码 PRIO_USER who为用户识别码参数2 :参数3 :prio介于-20至20之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)原创 2022-05-27 14:22:21 · 1563 阅读 · 0 评论 -
百度自动驾驶apollo源码解读2:进程或线程绑定指定CPU
1.简介CPU绑定指的是在多CPU的系统中将进程或线程绑定到指定的CPU核上去执行。在Linux中,我们可以利用CPU affinity属性把进程绑定到一个或多个CPU核上。CPU Affinity是进程的一个属性,这个属性指明了进程调度器能够把这个进程调度到哪些CPU上。 该属性要求进程在某个指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器。CPU Affinity分为2种:soft affinity和hard affinity。soft affinity只是一个建议,如果不可避免,调原创 2022-05-20 17:26:59 · 1163 阅读 · 0 评论 -
百度自动驾驶apollo源码解读1:std::atomic实现读写锁
直接上源代码吧,代码是阿波罗团队写的源代码,我这边给加了注释/*1.有一说一这个读写锁的设计还是很牛逼的,以我自己感觉atomic和读写完全不相干的东西竟然可以用前者实现后者2.这个设计理念是不是百度阿波罗团队自创的呢?好像不是,这有个连接,设计理念很相似,15年的博客: https://blog.csdn.net/10km/article/details/49641691*/#ifndef CYBER_BASE_ATOMIC_RW_LOCK_H_#define CYBER_BASE_原创 2022-05-12 15:39:27 · 1942 阅读 · 0 评论