【智路】智路OS 组件开发基础

https://airos-edge.readthedocs.io/zh/latest/dev_guide/dev_guide.html

智路OS组件开发的整体设计理念是:

  • 框架提供基类及接口,开发者实现派生类
  • 派生类将数据通过回调或者参数的方式传递给框架
  • 框架加载组件进行运行

所有使用包管理工具创建的文件目录基本相同,以下分别是设备、应用、服务的默认包目录

1 开发

智路OS所有组件都是以继承基类的形式开发,以应用为例,其中example_app.h的内容如下所示

自定义实现的ExampleApp需要继承智路OS规定的基类AirOSApplication,并且实现Init和Start接口

框架在启动时会加载该文件编译的动态库并且调用自定义的Init和Start方法,以此实现应用在智路OS上的运行

在源文件中,需要进行模块的注册,框架会根据名称进行加载,每种组件的注册方式有区别,后续小节会详细介绍

AIROS_APPLICATION_REG_FACTORY(ExampleApp, "example_app")

配置

使用上述方式注册后,需要在conf文件夹的默认文件app_lib_cfg.pb修改注册的名称和最终编译的so的名称,使得框架能够加载

so_name: "libexample_app.so"
app_name: "example_app"

2 编译

Bazel

新创建的包中.bazelrc、.bazelversion、WORKSPACE、BUILD为Bazel构建相关配置,如工程使用CMake则不需要使用,构建脚本模板仅提供基础的依赖,如需修改请参考bazel官方文档

  • .bazelrc:Bazel默认的构建配置,包含默认SDK的链接路径、默认链接的系统库等,相机和感知部分会增加cuda的依赖,如果实现中也使用到了cuda或者其他依赖,可以在此增加。

  • .bazelversion: 配置bazel的版本,默认5.0.0
  • BUILD:Bazel的构建脚本,需要注意以下规则:
    • 智路OS派生类的动态依赖库必须以cc_binary标签编译,否则在编译时依赖库并不寻找所有符号,导致在运行时会因符号找不到而出现问题。
    • 模板默认依赖了智路OS的SDK,其他第三方库依赖需要使用智路OS的版本,具体可以查看WORKSPACE里指定的第三方库路径
    • linkshared=True代表本规则生成动态库,linkstatic=True代表deps依赖的规则中优先以静态的方式依赖,具体使用方式参考官方文档

  • WORKSPACE:Bazel工作空间标识,一个包为一个工作空间,标识了包的依赖路径,方便在BUILD中以@的格式进行引用

CMake

新创建的包中CMakeLists.txt为默认的cmake构建脚本,默认依赖了智路OS的SDK和部分第三方库供参考

新增依赖库

如果开发者需要新增SDK镜像内不存在的依赖库,需要将相应的库放置到包内的lib目录,最终才能打包发布。

如果仅安装在系统路径,即使在本机打包安装运行成功,当发布安装到其他机器会出现库缺失的情况。

### 关于智路OS `.record` 文格式 `.record`文智路OS(Apollo Cyber RT)中用于存储传感器数据和其他相关信息的一种二进制文格式[^1]。这种文通常被用来记录车辆运行过程中产生的各种数据流,以便后续分析、回放或者调试。 #### 1. **用途** `.record`文的主要用途在于保存自动驾驶汽车在行驶过程中的实时数据流。这些数据可能来源于多种传感器设备(如激光雷达、摄像头、毫米波雷达等),也可能包括定位信息、地图数据以及控制指令等内容。通过这种方式,开发者可以方便地对历史场景进行重播和测试,从而优化算法性能并验证系统的可靠性[^1]。 #### 2. **定义结构** 虽然具体的内部实现细节可能会有所变化,但从已知的信息来看,`.record`文一般由以下几个部分组成: - **头部信息** 头部包含了关于整个文的一些元数据描述,比如版本号、时间戳以及其他全局属性。 - **消息体** 这一部分实际承载着每一条独立的消息内容。每条消息都具有固定的字段布局,常见的有: - `timestamp`: 记录该事发生的具体时刻; - `channel_name`: 表明所属通道名称,对应不同的主题订阅者关系; - `message_content`: 实际的数据负载区域,依据具体协议序列化后的字节串形式存在; 以下是创建一个新的`.record`文并将某些频道上的消息写入其中的一个简单例子: ```python from cyber_record.record import RecordFile # 创建新的 record 文 with RecordFile('output.record', 'w') as writer: # 假设我们有一些已经准备好的 topic 和其对应的 message 数据 topics_and_messages = [ ('/topicA', serialized_message_a), ('/topicB', serialized_message_b) ] for topic, msg in topics_and_messages: writer.write_channel(topic) # 如果还没有注册此 channel,则先添加它 writer.write_message(topic, msg) # 将消息按照指定的 topic 写入到当前打开的 record 中去 ``` 同样地,在读取已有`.record`文时也可以非常直观地完成解析工作: ```python from google.protobuf.json_format import MessageToJson from cyber_record.record import RecordFile def read_all_topics(record_path): with RecordFile(record_path, 'r') as reader: channels = list(reader.get_channels().keys()) all_data = {} for chnl in channels: msgs = [] while True: try: timestamp, raw_msg = next(reader.read_messages([chnl])) deserialized_obj = parse_raw_to_protobuf(raw_msg) # 自己实现反序列化的函数 json_str = MessageToJson(deserialized_obj) msgs.append({ "time": timestamp, "content": json_str }) except StopIteration: break all_data[chnl] = msgs return all_data ``` 以上代码片段展示了如何利用官方库来处理`.record`类型的文操作方法[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值