百度Apollo自动驾驶系统之cyberRT编程:Component实践
参考文献:https://apollo.baidu.com/community/Apollo-Homepage-Document
以及Apollo方面课程
一、Component概念
Cyber RT是一个高性能、高吞吐、低延时的计算运行框架,其中,动态加载技术和有向无环图(DAG)是其实现高性能重要途径之一。
Cyber RT采用了基于Component模块和**有向无环图(DAG)**的动态加载配置的工程框架。即将相关算法模块通过Component创建,并通过DAG拓扑定义对各Component依赖关系进行动态加载和配置,从而实现对算法进行统一调度,对资源进行统一分配。采用这个工程框架可以使算法与工程解耦,达到工程更专注工程,算法更专注算法的目的。
Node: cyberRT中的基本组成单元
Reader/Writer: Channel中的消息读写类
Channel: cyberRT中组件间的数据通信总线
DAG: cyber用于描述整个计算拓扑
二、Component类型
基类都为ComponentBase
1. 数据驱动的Component
支持一路或多路数据输入 ...
百度Apollo自动驾驶系统之cyberRT编程:通讯机制实践
参考文献:https://apollo.baidu.com/community/Apollo-Homepage-Document
以及Apollo方面课程
一、通信机制
按方式分类:
基于Writer/Reader的通信方式
基于C/S的通信方式
基于参数服务
按作用域分类:
进程内通信(对象指针,函数)
进程间通信(共享内存,管道,消息队列)
跨主机通信(RTPS、GRPC)
cyberRT使用的通信方式:进程内采用INTRA(函数与指针),进程间采用SHM(共享内存),跨主机通信采用RTPS(实时发布订阅的网络通信协议)
此外还有一种由Apollo决定的混合通信方式,根据对端的IP和进程PID信息决定采用什么方式进行通信,称为Hybrid
二、基于Write/Reader的通信方式
1. 概念
Node:是整个数据拓扑网络中的基本单元,可以根据需求创建和管理Writer、Reader、Service、Client
Writer:发布订阅模式中的发布者
Reader:发布订阅模式中的订阅者
Channel:通信中的topic,通过channel连接发布者和订阅者
M ...
2024 NewStar CTF比赛有感
2024 NewStar CTF比赛有感
前情提要:帮老板娘在她们学校参加她们校内信息安全社的校内赛,笔者第一次了解到了CTF这个比赛,颇觉得有趣,于是撰写如下博客
一、CTF比赛
CTF(Capture The Flag,夺旗赛)是一种流行于网络安全技术人员之间的一种信息安全技术竞赛。 其前身是传统黑客之间网络技术比拼的游戏,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。 起源于1996年第四届DEFCON。 现在已成为全球范围网络安全圈流行的竞赛形式。
比赛形式大抵是从加密串、网页、存在漏洞的可执行程序中找到形如flag{}的答案,所以被成为夺旗赛。
题目类型主要包含 Web 网络攻防 、 RE 逆向工程 、 Pwn 二进制漏洞利用 、 Crypto 密码攻击 、 Mobile 移动安全 以及 Misc 安全杂项 这六个类别。
Misc 是英文 Miscellaneous 的前四个字母,杂项、混合体、大杂烩的意思。
Recon(信息搜集)
主要介绍一些获取信息的渠道和一些利用百度、谷歌等搜索引擎的技巧
Encode(编码转换)
主要介绍 ...
Ranger妙用
Ranger妙用
相信大家在日常生活中总能看到一群人,以vim为主要工具,桌面环境使用平铺式窗口。纯键盘操作在一些技术社区中广受推崇,尤其是在开发者、黑客文化和开源社区中。这种操作方式不仅是一种工具使用习惯,也代表了高效工作、掌控技术的理念。Vim、Emacs 等编辑器自 Unix 时代以来就有着深厚的文化积淀,很多用户在学习过程中受到了这些经典工具的影响,从而养成了纯键盘操作的习惯。这类人群热衷于手指在键盘上跳舞的快感,鼠标对他们来说就是个摆设,连桌面都懒得给它留地方。仿佛手指越少离开键盘,他们的生产力就越接近超能力。他们相信:在键盘上打出一长串复杂命令,才是人生的终极艺术形式。
今天要介绍的ranger就是这样一个工具,而对于这些键盘艺术家来说,Ranger 就是他们心头好。作为一个纯键盘操作的文件管理器,Ranger 可以让你在终端里潇洒地穿梭文件夹、预览文件,靠着几个快捷键轻松完成各种文件操作,而手指只需要在键盘上上下翻飞。
当然,对于我们不那么高贵的(笑)程序员来说,ranger的优势往往体现在我们操作没有图形界面的服务器操作系统时,也能让我们轻松的操作各种文件。
零、特 ...
Python优雅计划(一)
Python优雅计划(一)
众所周知,从OI赛场里出来的选手总有一些奇奇怪怪的编码习惯,而压行缩减代码量又是其最为广为流传的《恶习》之一,我曾经也是他们的一员;对着执行了十几亿次的GTA代码嗤之以鼻,对着Windows的多年屎山表示不屑,然而……
时代变了,进入大学的笔者也有幸加入了一个工程性的项目组,写了廖廖几千行的工程性代码。
天哪,每当我打开一个月之前的代码时,我都要鼓起莫大的勇气,边看着边咒骂着一个月前的自己。
当一个函数套一个try-catch成为习惯,if的缩进套五六层成为常态,字典找不到key的报错成为日常,很显然我也成为了创造屎山代码的一员。
这篇文章的产生背景就是这样,我希望以Python为例子,回顾一下如何写出优雅的代码。当然,由于熵增定律的存在,你最终可能还是会创作出一个属于你的屎山(笑),但是笔者寄希望于这篇文章能让你在读自己屎山的时候能减少一点负罪感(大笑)
本次Python优雅计划(又称:屎山消消乐计划,乐) 将分为代码规范、模块化编程、Python小技巧和异常处理这四个章节来介绍,或在一篇文章中,或分为两篇文章进行实用性的阐述。
一、代码规范
或许在做 ...
OTA更新系统(详细设计)
OTA
包的content.json
键值
类型
备注
package
字符串
包名称
description
字符串
描述
updateInfo
字符串
更新描述
version
字符串
版本号
branch
字符串
分支
local
字符串
本地包位置
remote
字符串
OTA服务器
sha256
字符串
升级包的SHA256校验码
AfterUpdate
字符串
更新后指令
dependencies
JSON
依赖
一、生产运行侧
重启设备
daemon程序
依赖:flask、requests
JSON配置文件
由于单个设备的包较少,所以维护一个json文件
daemon整体配置文件(device.json):
键值
类型
备注
id
INT
设备唯一id
device
字符串
设备名称
registry
字符串
设备注册服务地址
description
字符串
描述
flask
JSON
flask配置项(见下)
package
列表
列表中每一项是一个json,为每 ...
OTA更新系统(一)
OTA更新系统(一)
OTA(Over-The-Air)更新对于物联网(IoT)系统非常重要,在整个物联网系统中,各个设备的控制方式、编程语言、配置文件往往有着十分巨大的区别。本文旨在探索出一种高可用性、低耦合性的物联网升级结构。
这篇文章为系列第一篇,旨在介绍整个架构系统
一、更新包设计
由于各个设备(模块)之间的差异较大,我们需要一种特殊的打包方式,在保留文件各方面关系与属性的情况下对整个文件夹进行传输;同时,为了保证能方便地读取更新包的各类信息,例如版本号、包名、前后启动等方式,我们需要将文件格式进行一定程度的规范修改。
1.更新包
在打包方式方面,我们选择了tar这一文件归档类型。相比于其他的压缩类型,tar类型的压缩率不高,但是其能完整保留所归档文件的属性,例如Linux文件的权限等。
2.打包方式
开发者可通过提供的Python脚本进行打包,假设脚本为pack.py
1python3 pack.py FOLDER
也可以手工进行tar打包
3.上传包
开发者可通过提供的Python脚本进行上传,假设脚本为update.py
1python3 update.py * ...
C++输入输出效率测试
C++输入输出效率测试
前情提要:
默认情况下,C++的标准库(iostream,例如 std::cin 和 std::cout)与C的标准库(stdio,例如 scanf 和 printf)之间是同步的。这意味着它们共享相同的缓冲区,并且在每次I/O操作时都会进行刷新和同步,以确保它们之间的一致性。这种同步确保了你可以在程序中混合使用C和C++风格的I/O,而不会出现数据错乱或顺序错误的问题。
然而,这种同步会带来性能开销。当你知道在程序中不需要混合使用C和C++风格的I/O时,可以通过调用std::ios::sync_with_stdio(false) 来关闭它们之间的同步。这样做之后,C++的I/O操作会变得更快,因为它们不再需要在每次操作时与C的I/O函数保持同步。
在竞赛中,除非用快读之类的技巧,一般选手都会选择使用C标准输入输出,这篇博客是探究关闭同步流后的C++的流输入输出与C标准输入输出在效率上的优劣对比。需要注意的是,本测试将输入输出合并在一个程序中,以期得出一个综合成绩,如果有不妥之处,请诸位提出。
本篇测试全程在Linux下进行,以下是测试环境:
gcc版 ...
面向对象(二)
面向对象(二)
面向对象(二)
在上一篇文章 面向对象(一) | 四叶草の博客 (wzcwzc.cool) 中,我们介绍了面向对象的基本概念,以及C++中类和对象的基础知识。在这篇文章中,我们将深入探讨C++面向对象编程的其他重要特性,包括继承、多态和运算符重载。
一、继承
继承是面向对象编程的一个核心概念,它允许我们创建一个新类,继承并重用现有类的属性和方法。这样,新类可以基于现有类进行扩展,而无需从头开始。
1. 基类 & 派生类
基类:被继承的类称为基类、父类或超类。
派生类:执行继承操作的类称为派生类或子类。
123456789101112131415class BaseClass { public: int baseVar; void baseFunc() { cout << "Function in Base Class" << endl; }};class DerivedClass: public Ba ...
苏大校园网の小妙招
苏大校园网直接连接
苏大校园网の小妙招
一、前言
众所周知,苏大的SUDA_WIFI需要进行认证。虽然可以开启校园漫游,但是似乎在大部分时间中,当我们断开wifi然后再重新连接的时候,都需要重新认证。
虽然我没有仔细求证过其中的判断标准,不过现在的设备连接wifi一般都会有一个随机MAC地址的选项。
MAC地址,全称为“媒体访问控制地址”(Media Access Control Address),是一个用于确保网络设备唯一性的地址。它是一个通常由六组两位十六进制数字组成的地址,例如:08:00:27:4A:2D:1F。
每个网络接口控制器(NIC)都有一个唯一的MAC地址,这个地址在生产时被烧录到硬件中,通常是不可更改的。无论是有线还是无线的网络设备,如以太网卡、Wi-Fi设备等,都有一个MAC地址。
MAC地址在数据链路层(OSI模型的第二层)被用于标识网络上的设备。当数据包在局域网(LAN)内传输时,它是基于MAC地址进行路由的,而不是IP地址。
MAC地址一般标志着网络中的唯一硬件,wifi认证过程中很有可能就是通过相同的MAC地址来判断登陆的设备是否是同一个,既然使用 ...