【Apollo学习笔记】—— 相机仿真

文章目录
- 前言
- 相关代码整理
- 测试实践
- 文件目录
- 包管理BUILD文件以及cyberfile.xml文件
- 源程序
- BUILD
- 运行
- 结果
- 其他参考
- Camera
- Output channels
- 启动camera驱动
- 启动camera + video compression驱动
前言
本文是对Cyber RT的学习记录,文章可能存在不严谨、不完善、有缺漏的部分,还请大家多多指出。这一章的内容还是比较简单的,直接上代码与结果。
课程地址: https://apollo.baidu.com/community/course/outline/329?activeId=10200
更多还请参考:
[1] Apollo星火计划学习笔记——第三讲(Apollo Cyber RT 模块详解与实战)https://blog.csdn.net/sinat_52032317/article/details/126924375
[2] 【Apollo星火计划】—— Cyber基础概念|通信机制
https://blog.csdn.net/sinat_52032317/article/details/131878429?spm=1001.2014.3001.5501
[3] 第一章:Cyber RT基础入门与实践https://apollo.baidu.com/community/article/1093
[4] 第二章:Cyber RT通信机制解析与实践https://apollo.baidu.com/community/article/1094
[5] 第三章:Component组件认知与实践https://apollo.baidu.com/community/article/1103
[6] 第四章:Cyber RT之调度简介与实践https://apollo.baidu.com/community/article/1106
[7] 第五章:使用Cyber RT进行相机仿真https://apollo.baidu.com/community/article/1105相关代码整理
链接: https://pan.baidu.com/s/1ENgXE4yQ1v4nJRjcfZtd8w?pwd=ht4c 提取码: ht4c
测试实践
文件目录
参考以下文件目录进行
camera_demo
|-- driver|-- camera_sim| |-- BUILD| |-- camera_driver.cc
|--BUILD
|--camera_demo.BUILD
|--cyberfile.xml
包管理BUILD文件以及cyberfile.xml文件
参考之前的文章https://blog.csdn.net/sinat_52032317/article/details/131878429?spm=1001.2014.3001.5501
源程序
camera_driver.cc
/* 需求: 发布摄像头仿真数据。实现:1.头文件;2.初始化 cyber 框架;3.创建节点;4.创建发布者;5.组织数据并发布;6.等待关闭。
*/
#include "cyber/cyber.h"
#include "modules/common_msgs/sensor_msgs/sensor_image.pb.h"using apollo::drivers::Image;int main(int argc, char *argv[])
{apollo::cyber::Init(argv[0]);// 3.创建节点;auto talker_node = apollo::cyber::CreateNode("camear_sim_node");// 4.创建发布者;auto talker = talker_node->CreateWriter<Image>("/image_sim");// 5.组织数据并发布;size_t width = 500;size_t height = 350;size_t cell = 50; // 单元格宽度size_t step = width * 3; // 一行像素数char black = 200;char white = 10;apollo::cyber::Rate rate(10.0);while (apollo::cyber::OK()){// 组织数据auto msg = std::make_shared<Image>();msg->set_frame_id("camera");auto now = apollo::cyber::Time::Now();msg->set_measurement_time(now.ToSecond());msg->set_width(width);msg->set_height(height);msg->set_encoding("rgb8");msg->set_step(msg->width() * 3); // 一图片行的元素个数size_t length = msg->width() * msg->height() * 3;char value[length]; for (size_t i = 0; i < height; i++){ // 遍历像素行for (size_t j = 0; j < step; j++){ // 遍历列// 当前字节索引 value[i * step + j]int index = i * step + j;// 行赋值if (i / cell % 2 == 0){ // 偶数行value[index] = black;} else {value[index] = white;}// 列赋值// 偶数列,无需更改if (j / 3 / cell % 2 == 1) {// 奇数列,取反value[index] = value[index] == white ? black : white;}}}msg->set_data(value);//发布talker->Write(msg);rate.Sleep();}// 6.等待关闭。apollo::cyber::WaitForShutdown();return 0;
}
BUILD
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
load("//tools/install:install.bzl", "install", "install_src_files")
load("//tools:cpplint.bzl", "cpplint")
package(default_visibility = ["//visibility:public"])cc_binary(name = "camera_driver",srcs = ["camera_driver.cc"],deps = ["//cyber","//modules/common_msgs/sensor_msgs:sensor_image_cc_proto",],
)install(name = "install",runtime_dest = "camera_demo/bin",targets = [":camera_driver"],
)install_src_files(name = "install_src",src_dir = ["."],dest = "camera_demo/src/cyberatest",filter = "*",
)
记得修改包管理BUILD中的deps
运行
./bazel-bin/test/test_camera/camera_driver
另开一个终端打开DreamView
aem bootstrap start
选定合适的camera channel
结果

其他参考
apollo相机驱动在modules/drivers/camera文件目录下,需要设置好相应的配置文件,才能进行正常驱动。下面贴出文档中的README部分
Camera
camera包是基于V4L USB相机设备实现封装,提供图像采集及发布的功能。本驱动中使用了一台长焦相机和一台短焦相机。
Output channels
- /apollo/sensor/camera/front_12mm/image
- /apollo/sensor/camera/front_6mm/image
- /apollo/sensor/camera/front_fisheye/image
- /apollo/sensor/camera/left_fisheye/image
- /apollo/sensor/camera/right_fisheye/image
- /apollo/sensor/camera/rear_6mm/image
启动camera驱动
请先修改并确认launch文件中的参数与实际车辆相对应
# in docker
bash /apollo/scripts/camera.sh
# or
cd /apollo && cyber_launch start modules/drivers/camera/launch/camera.launch
启动camera + video compression驱动
请先修改并确认launch文件中的参数与实际车辆相对应
# in docker
bash /apollo/scripts/camera_and_video.sh
# or
cd /apollo && cyber_launch start modules/drivers/camera/launch/camera_and_video.launch### 常见问题
1. 如果出现报错“sh: 1: v4l2-ctl: not found”,需要安装v4l2库。```bash
sudo apt-get install v4l-utils
camera 驱动解释可以参考这篇博客Apollo camera驱动分析(二十九)
实践例子可参考自动驾驶开发者说|框架|如何在apollo中添加自己的USB摄像头?
相关文章:
【Apollo学习笔记】—— 相机仿真
文章目录 前言相关代码整理 测试实践文件目录包管理BUILD文件以及cyberfile.xml文件源程序BUILD运行结果其他参考CameraOutput channels启动camera驱动启动camera video compression驱动 前言 本文是对Cyber RT的学习记录,文章可能存在不严谨、不完善、有缺漏的部分࿰…...
【数据结构】——线性表的相关习题
目录 题型一(线性表的存储结构)题型二(链表的判空)题型三(单链表的建立)题型四(顺序表、单链表的插入删除操作)题型五(双链表的插入删除操作)题型六ÿ…...
SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用)
SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用) 文章目录 SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用…...
SpringBoot复习:(19)Condition接口和@Conditional注解
Condition接口代码如下: public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);}它是一个函数式接口,只有一个方法matches用来表示条件是否满足。matches方法中的ConditionContext类对象context可以…...
K8s中的Controller
Controller的作用 (1)确保预期的pod副本数量 (2)无状态应用部署 (3)有状态应用部署 (4)确保所有的node运行同一个pod,一次性任务和定时任务 1.无状态和有状态 无状态&…...
【MFC】03.常用复杂控件的使用-笔记
热键: 对话框-类向导:初始化函数中,热键需要在最开始的时候就注册进去: 注册热键: 在这之前,先去定义一个宏,代表你这个快捷键。 参数:窗口句柄,热键编号(热…...
Autosar诊断实战系列14-NRC优先级解析
本文框架 前言1. NRC分类2. NRC优先级判断2.1. NRC优先级判断逻辑介绍2.2 NRC测试注意事项前言 在本系列笔者将结合工作中对诊断实战部分的应用经验进一步介绍常用UDS服务的进一步探讨及开发中注意事项, Dem/Dcm/CanTp/Fim模块配置开发及注意事项,诊断与BswM/NvM关联模块的应…...
《向量数据库指南》——腾讯云向量数据库Tencent Cloud VectorDB产品特性,架构和应用场景
腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持 10 亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提…...
xcode 的app工程与ffmpeg 4.4版本的静态库联调,ffmpeg内下的断点无法暂停。
先阐述一下我的业务场景,我有一个iOS的app sdk项目,下面简称 A ,以及运行 A 的 app 项目,简称 A demo 。 引用关系为 A demo 引用了 A ,而 A 引用了 ffmpeg 的静态库(.a文件)。此时业务出现了 b…...
机器学习06 数据准备-(利用 scikit-learn基于Pima Indian数据集作 数据特征选定)
什么是数据特征选定? 数据特征选定(Feature Selection)是指从原始数据中选择最相关、最有用的特征,用于构建机器学习模型。特征选定是机器学习流程中非常重要的一步,它直接影响模型的性能和泛化能力。通过选择最重要的特征&#…...
机器学习-特征选择:如何使用Lassco回归精确选择最佳特征?
一、引言 特征选择在机器学习领域中扮演着至关重要的角色,它能够从原始数据中选择最具信息量的特征,提高模型性能、减少过拟合,并加快模型训练和预测的速度。在大规模数据集和高维数据中,特征选择尤为重要,因为不必要的…...
SpringBoot之Actuator基本使用
SpringBoot之Actuator基本使用 引入分类常用接口含义healthbeansconditionsheapdumpmappingsthreaddumploggersmetrics 引入 <!-- actuator start--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…...
排序算法(一)
1.冒泡排序-Bubble Sort 1.算法原理 依次比较相邻的两个元素,若按照从小到大的顺序,则将相邻元素中较大的一个放在后面;然后对每一对相邻元素都做这种比较,序列的最后一个元素就是最大的数; 2.算法复杂度 时间复杂度…...
Centos虚拟机忘记密码-修改密码
1.重启系统 2.在这个选择界面,按e建 3.找到如下位置,插入init/bin/sh 4.填写完成后按Ctrlx引导启动 5.输入mount -o remount, rw / (注意空格) 6.重置密码 出现以下为重置成功 7.执行touch /.autorelabel 8.退出exec /sbin/init 9.输入你的新密…...
Shell 分析服务器日志常用命令
1、查看有多少个IP访问: 日志文件的第一列是IP地址 awk {print $1} log_file|sort|uniq|wc -l2、查看某一个页面被访问的次数: grep "/index.php" log_file | wc -l3、查看每一个IP访问了多少个页面: awk {S[$1]} END {for (a i…...
mysql8配置binlog日志skip-log-bin,开启、关闭binlog,清理binlog日志文件
1.概要说明 binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。对于开发者可能对binlog并不怎么关注,但是对于运维或者架…...
机器学习:训练集与测试集分割train_test_split
1 引言 在使用机器学习训练模型算法的过程中,为提高模型的泛化能力、防止过拟合等目的,需要将整体数据划分为训练集和测试集两部分,训练集用于模型训练,测试集用于模型的验证。此时,使用train_test_split函数可便捷高…...
淘宝API开发(一)简单介绍淘宝API功能接口作用
前一阵子按照上级指示,根据淘宝API开发符合自已应用的系统,比如批量上传,批量修改名称,价格等功能什么的,在此就将我的开发历程写一写,为自己前段时间的工作做个总结。 淘宝开发平台(淘宝网 - 淘ÿ…...
Redis相关面试题
Redis的使用场景 根据自己简历上的业务进行回答 缓存 穿透、击穿、雪崩、双写一致、持久化、数据过期、淘汰策略 分布式锁 setnx redisson 缓存穿透:查询一个不存在的数据,数据库查不到数据也不会直接写入缓存,就会导致每次请求都查询数据库…...
数据库简介
1、数据库安装: rpm (redhat package manager) 也是个包管理工具: rpm -ivh 安装 rpm -e 表示卸载,卸载的时候有可能出现依赖的问题,可以用 --nodeps 忽略依赖卸载。 rpm -qa 搜索系统中安装的rpm的应用。 如果使用离线包,安装顺序不要乱。 m…...
西门子200Smart PLC的Modbus RTU主站自动轮询库:简化你的工业通信
西门子200Smart modbus rtu主站自动轮询库 used管脚为启用,其它管脚和西门子自带的指令一样使用及功能,调用后就不需要关心modbus轮训,功能块自己处理,简化200smart在工业自动化领域,Modbus RTU协议依然是设备之间通信…...
RTKLIB数据流引擎str2str:从源码到实战的流式数据处理架构剖析
1. RTKLIB数据流引擎str2str架构解析 str2str是RTKLIB中负责数据流处理的核心模块,它的设计理念类似于工厂里的流水线传送带。想象一下GNSS数据就像流水线上的零件,str2str的工作就是把这些零件从不同来源的传送带(输入流)接过来&…...
公开信息整理|2026年4月4日:消费复苏、金融调节、教育规范、科技安全与部分国际动态速览
🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...
Python可视化进阶:从Matplotlib到交互式图表
Python可视化进阶:从Matplotlib到交互式图表一张好图胜过千言万语,但大多数开发者却止步于基础的折线图和柱状图在数据驱动的时代,将复杂数据转化为清晰直观的可视化图表已成为每位开发者的必备技能。你是否曾遇到过这样的困境:花…...
ai一键生成tomcat配置脚本,三分钟搞定java web服务器环境搭建
今天想和大家分享一个超级实用的技巧——如何用AI工具快速搞定Tomcat服务器的安装和配置。作为一个Java Web开发者,每次在新环境搭建Tomcat总免不了要折腾半天,直到发现了InsCode(快马)平台的AI生成功能,整个过程变得异常简单。 环境自动适配…...
无需配置环境,用快马平台5分钟搭建你的第一个java学生管理系统原型
最近在尝试用Java写一个简单的学生信息管理系统原型,发现用传统方式从零开始搭建实在太费时间。光是安装JDK、配置环境变量这些前置工作就能劝退不少初学者。后来发现了InsCode(快马)平台,整个过程变得异常简单,5分钟就能跑通核心流程。 项目…...
SI4463项目实战:如何像调试代码一样,用WDS3工具精准调试射频参数?
SI4463射频调试实战:用WDS3实现代码级精准配置 在嵌入式开发领域,我们早已习惯了通过断点调试、日志输出和变量监控来掌控程序行为。但当面对射频模块时,许多工程师却感到束手无策——那些神秘的十六进制配置值、模糊不清的寄存器描述&#x…...
PHP生成随机数字与字母组合及纯数字的方法
、生成随机数字字母组合方法1:使用rand()和chr()函数结合1234567891011function generateRandomString($length 10) {$characters 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;$randomString ;for ($i 0; $i < $length; $i) {$randomSt…...
TensorFlow开发中用到的一些第三方库
本节介绍下后面开发要用到的辅助库,并做一些简单的代码实例和效果演示,当然我们都是为了最终目标TensorFlow开发做准备的,用到的也是这些库的简单的api,这里做简单的介绍为后面TensorFlow开发做准备,对于这些库的深入研…...
从理论到模型:HFSS仿真平面发夹滤波器的关键步骤与参数优化
1. HFSS仿真前的理论准备 在开始HFSS仿真之前,我们需要先完成一些理论计算工作。这就像盖房子要先画图纸一样,没有理论指导的仿真就像无头苍蝇。我刚开始做滤波器设计时就犯过这个错误,直接上手建模,结果调参调到怀疑人生。 平面发…...
