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

文章目录

|---|
| |

前言

本文是对Cyber RT的学习记录,文章可能存在不严谨、不完善、有缺漏的部分,还请大家多多指出。这一章的内容还是比较简单的,直接上代码与结果。
课程地址 : https://apollo.baidu.com/community/course/outline/329?activeId=10200
更多还请参考 :

1\] Apollo星火计划学习笔记------第三讲(Apollo Cyber RT 模块详解与实战) \[2\] 【Apollo星火计划】------ Cyber基础概念\|通信机制 \[3\] 第一章:Cyber RT基础入门与实践 \[4\] 第二章:Cyber RT通信机制解析与实践 \[5\] 第三章:Component组件认知与实践 \[6\] 第四章:Cyber RT之调度简介与实践 \[7\] 第五章:使用Cyber RT进行相机仿真 ## 相关代码整理 链接: 提取码: ht4c

|---|
| |

测试实践

文件目录

参考以下文件目录进行

bash 复制代码
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

cpp 复制代码
/*  
    需求: 发布摄像头仿真数据。
    实现:
        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

cpp 复制代码
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

运行

bash 复制代码
 ./bazel-bin/test/test_camera/camera_driver

另开一个终端打开DreamView

bash 复制代码
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文件中的参数与实际车辆相对应

bash 复制代码
# in docker
bash /apollo/scripts/camera.sh
# or
cd /apollo && cyber_launch start modules/drivers/camera/launch/camera.launch

启动camera + video compression驱动

请先修改并确认launch文件中的参数与实际车辆相对应

bash 复制代码
# 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摄像头?

相关推荐
Learn Beyond Limits26 分钟前
The learning process of Decision Tree Model|决策树模型学习过程
人工智能·深度学习·神经网络·学习·决策树·机器学习·ai
岑梓铭1 小时前
考研408《计算机组成原理》复习笔记,第六章(1)——总线概念
笔记·考研·408·计算机组成原理·计组
Suckerbin1 小时前
digitalworld.local: TORMENT
笔记·安全·web安全·网络安全
凯尔萨厮1 小时前
Java学习笔记三(封装)
java·笔记·学习
YoungUpUp2 小时前
【文件快速搜索神器Everything】实用工具强推——文件快速搜索神器Everything详细图文下载安装教程 办公学习必备软件
学习·everything·文件搜索·实用办公软件·everything 工具·文件快速搜索·搜索神器
RaLi和夕2 小时前
单片机学习笔记.C51存储器类型含义及用法
笔记·单片机·学习
星梦清河2 小时前
宋红康 JVM 笔记 Day15|垃圾回收相关算法
jvm·笔记·算法
武文斌772 小时前
ARM工作模式、汇编学习
汇编·嵌入式硬件·学习·arm
岑梓铭3 小时前
计算机网络第四章(4)——网络层《ARP协议》
网络·笔记·tcp/ip·计算机网络·考研·408
lingggggaaaa3 小时前
小迪安全v2023学习笔记(八十讲)—— 中间件安全&WPS分析&Weblogic&Jenkins&Jetty&CVE
笔记·学习·安全·web安全·网络安全·中间件·wps