编程 [34]
可变参数模板和折叠表达式的工程示例
多传感器融合算法往往都需要一个时间同步算法,时间同步算法的输入一般是多个带时间戳的传感器数据。 使用 C++ 不久的人,往往会给这多个传感器的类分别创建实例,在处理的时候再根据传感器数量进行遍历。这样写没有问题,就是不够优雅。 学习可变参数模板和折叠表达式需要先对 C++ 中的 Template 有
C++模板
C++ 是一门强类型语言,编写一个通用函数,能把任意类型的变量传进去处理,通过把通用逻辑设计为模板来摆脱类型限制。 C++ 中的模板语法,实际上是在为 C++ 提供泛型(Generic Programming)的机制。 最常见的泛型应用在 STL 的容器中。 类模板 Class Templates
C++11及其之后的新特性(简单介绍)
C++11 自动类型推导 auto 需要注意的是: 必须在定义时初始化 auto 类型的变量 auto 类型不能定义数组 一旦初始化,就不可更改类型 auto x = 5;
auto y = 3.14;
auto a; // 错误
auto array[10]; //错误
auto a = 1
ROS1的launch文件
之前一直是 rosrun 方式启动ros节点的, 一是因为懒, 二是因为我只负责一个节点, 用不到 launch 方式. 这次遇到了不能保存 ROS 日志的 bug, 换成 launch 方式启动就能成功保存日志了... Launch文件 ROS中 .launch 文件可以同时启动多个 node,
ROS1的bag录制
bag录制 录制所有话题,这里没有指定 bag 名,会在当前路径生成一个当前时间戳命名的 bag rosbag record -a 录制指定话题 rosbag record <topic_name1> <topic_name2> ... 录制指定话题,并指定 bag 名称,arg为大写的英文字母O
C++ STL容器的底层原理
C++ STL 容器是使用频率超高的基础设施,只有了解各个容器的底层原理,才能得心应手地用好不同的容器,做到用最合适的容器干最合适的事情 [1]。 看了文章 [1] 开头,以为必有高论,然而对容器方法的底层几乎没有提及,那就自己边查边写吧。本文大部分内容来自 cplusplus.com/refere
学习Transformer
Transformer 在谷歌 2017 年的论文 [\1706.03762] Attention Is All You Need 中首次被提出,主要用于 NLP(Natural Language Processing,自然语言处理)的各项任务。 后来在 CV 领域,研究者们基于 Transform
ROS2的消息发布和订阅&图像发布和订阅
ROS2 的编译 colcon 是 ROS2 的编译工具。ROS2 的工作空间与 ROS1 基本保持相同的目录结构: <workspace>
├── build # 编译时自动生成,包含编译中间文件
├── install # 编译时自动生成,包含编译结果:可执行文件、库文件
Ubuntu安装ROS2,以及与ROS1的共存
系统环境:Ubuntu 20.04 ROS2版本:Foxy,其中Foxy是LTS长期支持版本,Galactic不是,但是这两者都只能运行在Ubuntu20.04上。 ROS2的安装 先检查是否支持UTF-8,用 locale命令 jetson@funnywii-orin:~$ locale
LANG
道路目标流量统计算法
实现流量统计算法有两个前提: 能够实现目标检测,最基本的前提,必须能够识别到视频帧中的车辆和行人。 能够进行目标跟踪,在检测的基础上,为目标分配一个唯一的ID。流量计数依赖于目标的唯一ID。 目标检测算法以YOLO系列为例。 跟踪算法以 ByteTrack 跟踪结果为例。将检测结果的 objects
我还在学CUDA编程(四)——内存管理及访问模式
内存管理 内存分配和释放 CUDA 编程模型中存在 Host 和 Device 两个异构系统,每个系统都有相对独立的内存空间。 在 Host 代码中,可以使用下面的函数分配 Device 全局内存: cudaError_t cudaMalloc(void **devPtr, size_t count
相机视频流的编码格式
VideoWriter 类 最近几个项目都需要保存相机图像数据,也就是存成视频。有的要求保存源视频,有的要求保存处理后的视频。 由于图像数据的读取使用 OpenCV,目标检测框架也是建立在 OpenCV 的基础上,所以保存图像顺理成章也使用 OpenCV。这里主要使用 OpenCV 的 VideoW
我还在学CUDA编程(四)——内存的层次结构
CUDA 内存模型 存储器的类型有两种: 可编程:显式控制哪些数据存放。 不可编程:不能决定数据存储位置。 在 CPU 层次结构中,一级缓存(L1 Cache)和二级缓存(L2 Cache)都是不可编程的。 可编程的存储器类型包括: 寄存器 共享内存 本地内存 常量内存 纹理内存 全局内存 下图为上
OpenCV 的 remap() 函数中的 map1 和 map2
今天在 StackOverflow 上看到这么个问题:想把原图像中的一个点 \textstyle g,通过内参和畸变参数映射到去畸变图像中的点 \textstyle p,并获取这个点的坐标。 你以为我接下来会说,xxx 和我想的一样,但是我想错了,其实并不是这样。 现在,我想说的只有其实并不是这样,
继续学CUDA编程(三) —— CUDA执行模型(下)
并行归约问题 先解释一下什么是 归约(Reduction),归约是将某个计算问题变换为另一个问题的过程。在 CUDA 运算中,在向量中执行满足交换律和结合律的运算,被称为归约问题。每次迭代计算方式都是相同的(归),从一组多个数据最后得到一个数(约)^{[1]}。比如当给定 N 个数值,求其 SUM/
单目相机的深度图,以及绝对深度和相对深度
深度图 深度图(Depth Image, Depth Map)会将图像中的每个像素编码为相机到场景中某个点的距离,从而提供图像中物体的空间信息。 需要注意的是,不同场景下深度的定义可能略有差异。有些传感器中,深度表示的是相机坐标系下沿光轴方向的 Z 值;有些场景中,深度也可能表示空间点到相机中心的欧
使用Python控制海康球头相机运动的方法
控制海康球头的 3 种方法 做了一些调查,目前控制海康球头相机的方法主要有三种: 海康官方 SDK。海康开放平台提供了多个平台的 SDK,包括 Windows、x86 Linux 和 ARM Linux(Jetson)等。Jetson 平台通常应选择 ARM 64 位 Linux 版本 ONVIF。
Jetson Orin部署Mediapipe Holistic检测
安装 JDK JetPack 一般不带 JDK,可以先安装 OpenJDK 11: sudo apt install openjdk-11-jdk
安装 Bazel 针对 MediaPipe 这个项目,需要使用的 Bazel 版本通常取决于当前 MediaPipe 版本指定的 Bazel 版本。更
继续学CUDA编程(三)——CUDA执行模型(上)
这一部分是 CUDA 的核心部分,涉及到了硬件和程序的执行模型。 CUDA 的执行层级是 Grid → Block → Warp → Thread,而真正被硬件调度的基本单位其实是 Warp,而不是 Thread。 然后必须先记住 CUDA 的约定: threadIdx.x → 列(col) thr
“我还要学CUDA编程!”(二)——CUDA编程模型
CUDA 编程结构 在 GPU 上执行的函数称为 CUDA 核函数(Kernel Function),核函数会被 GPU 上多个线程执行。典型的 CUDA 程序遵循如下模式: 把数据从 CPU 内存(Host)拷贝至 GPU 内存(Device) 调用该 Kernel 函数,对 Device 中的数