高翔《自动驾驶中的SLAM技术》代码详解 — 第6章 2D SLAM

这篇具有很好参考价值的文章主要介绍了高翔《自动驾驶中的SLAM技术》代码详解 — 第6章 2D SLAM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

6.2 扫描匹配算法

6.2.1 点到点的扫描匹配


高翔《自动驾驶中的SLAM技术》代码详解 — 第6章 2D SLAM,SLAM,自动驾驶的SLAM技术,SLAM,代码详解文章来源地址https://www.toymoban.com/news/detail-629371.html

6.2 扫描匹配算法

6.2.1 点到点的扫描匹配

// src/ch6/test_2dlidar_io.cc
// Created by xiang on 2022/3/15.
//
#include <gflags/gflags.h>
#include <glog/logging.h>
#include <opencv2/highgui.hpp>

#include "ch6/lidar_2d_utils.h"
#include "common/io_utils.h"

// DEFINE_string定义ROS数据包的路径
DEFINE_string(bag_path, "./dataset/sad/2dmapping/test_2d_lidar.bag", "数据包路径");

/// 测试从rosbag中读取2d scan并plot的结果
int main(int argc, char** argv) {
    // 来初始化Google日志记录库
    google::InitGoogleLogging(argv[0]);
    // 将日志级别设置为INFO
    FLAGS_stderrthreshold = google::INFO;
    // 将日志输出到标准错误流(stderr)并带有彩色显示
    FLAGS_colorlogtostderr = true;
    // 将日志输出到标准错误流(stderr)并带有彩色显示
    google::ParseCommandLineFlags(&argc, &argv, true);

    // 创建了一个sad::RosbagIO对象rosbag_io,用于从rosbag中读取数据
    sad::RosbagIO rosbag_io(fLS::FLAGS_bag_path);
    rosbag_io.AddScan2DHandle("/pavo_scan_bottom",[](Scan2d::Ptr scan) {
                             cv::Mat image;     // 存储可视化的扫描图像
                             sad::Visualize2DScan(scan, SE2(), image, Vec3b(255, 0, 0)); //生成可视化的图像
                             cv::imshow("scan", image);
                             cv::waitKey(20);
                             return true;
                         })
        .Go();  // 用于从rosbag中读取数据

    return 0;
}
#include "ch6/lidar_2d_utils.h"
#include <opencv2/imgproc.hpp>

namespace sad {
// 扫描数据(scan)、位姿(pose)、图像(image)、
// 颜色(color)、图像大小(image_size)、分辨率(resolution)、子地图的位姿(pose_submap)
void Visualize2DScan(Scan2d::Ptr scan, const SE2& pose, cv::Mat& image, const Vec3b& color, int image_size,
                     float resolution, const SE2& pose_submap) {
    // 如果图像的数据为空,如果图像(image)的数据为空
    if (image.data == nullptr) {
        image = cv::Mat(image_size, image_size, CV_8UC3, cv::Vec3b(255, 255, 255));
    }

    // 扫描数据中的每一个激光点,判断激光点的测量距离是否在有效范围内
    for (size_t i = 0; i < scan->ranges.size(); ++i) {
        if (scan->ranges[i] < scan->range_min || scan->ranges[i] > scan->range_max) {
            continue;
        }

        // 计算当前激光点的真实角度
        double real_angle = scan->angle_min + i * scan->angle_increment;
        // 通过角度计算出该点在二维空间中的坐标(x, y)
        double x = scan->ranges[i] * std::cos(real_angle);
        double y = scan->ranges[i] * std::sin(real_angle);

        // 如果当前激光点的真实角度是否在可视范围内
        if (real_angle < scan->angle_min + 30 * M_PI / 180.0 || real_angle > scan->angle_max - 30 * M_PI / 180.0) {
            continue;
        }
        // 计算出激光点在地图坐标系下的坐标
        Vec2d psubmap = pose_submap.inverse() * (pose * Vec2d(x, y));

        // 将激光点在地图坐标系下的坐标映射到图像坐标系中
        int image_x = int(psubmap[0] * resolution + image_size / 2);
        int image_y = int(psubmap[1] * resolution + image_size / 2);
        // 判断像素坐标是否在图像的有效范围内
        if (image_x >= 0 && image_x < image.cols && image_y >= 0 && image_y < image.rows) {
            image.at<cv::Vec3b>(image_y, image_x) = cv::Vec3b(color[0], color[1], color[2]);
        }
    }

    // 同时画出pose自身所在位置
    Vec2d pose_in_image =
        pose_submap.inverse() * (pose.translation()) * double(resolution) + Vec2d(image_size / 2, image_size / 2);
    cv::circle(image, cv::Point2f(pose_in_image[0], pose_in_image[1]), 5, cv::Scalar(color[0], color[1], color[2]), 2);
}

}  // namespace s

到了这里,关于高翔《自动驾驶中的SLAM技术》代码详解 — 第6章 2D SLAM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自动驾驶SLAM技术第四章习题2

    在g2o的基础上改成ceres优化,高博都写好了其他的部分, 后面改ceres就很简单了. 这块我用的是ceres的自动求导,很方便,就是转化为模板仿函数的时候有点麻烦, 代码部分如下 这个文件写的内容ceres优化的残差块. 把i, j时刻的状态都写成15维的数组, 顺序是r,p,v,bg,ba. 每个元素都

    2024年02月11日
    浏览(34)
  • Carla自动驾驶仿真五:opencv绘制运动车辆的boudingbox(代码详解)

    提示:以下是本篇文章正文内容,下面案例可供参考 1、opencv安装可以参照我上一篇文章:opencv安装教程 ,这一篇文章即将讲述如果在carla仿真中,将仿真世界中的车辆通过opencv将boudingbox绘制出来。 1、构造相机投影矩阵函数 1)该函数用于构建相机的投影矩阵: w :相机视图

    2024年02月06日
    浏览(29)
  • 【Python | 自动驾驶】阐发AI大模型在APS中的底层逻辑与代码实现

    当今, AI大模型 是一个火热的。随着人工智能的迅猛发展,AI大模型在各个领域展现出了巨大的潜力和应用价值。在自动驾驶领域,AI大模型的应用驱动自动驾驶算法具备更强的泛化能力。 那么 AI大模型 为自动驾驶赋能了什么?它的未来发展前景又是怎样? 本文将以

    2024年02月05日
    浏览(31)
  • 【单目3D】在自动驾驶中将 2D 物体检测提升到 3D

    单目 3D 目标检测使用 RGB 图像来预测目标 3D 边界框。由于 RGB 图像中缺少关键的深度信息,因此该任务从根本上说是不适定的。然而在自动驾驶中,汽车是具有(大部分)已知形状和大小的刚体。那么一个关键的问题是如何有效地利用汽车的强大先验,在传统 2D 对象检测之上

    2024年02月19日
    浏览(26)
  • Carla自动驾驶仿真四:pygame渲染Camera画面及车辆控制(代码详解)

    提示:以下是本篇文章正文内容,下面案例可供参考 pygame提供了一种渲染实时视觉输出的方法,显示camera sensor的输出。我们也通过视频注入的方法将视频数据注入到控制器内部,提供视觉感知的场景,模拟真实场景进行仿真。 1、pygame安装 2、numpy安装 1、连接Carla并初始化

    2024年02月07日
    浏览(28)
  • 高翔ORB-SLAM2稠密建图编译(添加实时彩色点云地图+保存点云地图)

    本文写于2022年5月18日。 Ubuntu18.04 + ROS melodic ORBSLAM2_with_pointcloud_map 是基于 ORB_SLAM2 改动的, ORB_SLAM2 编译前一些库的安装以及编译时的报错参考此篇博客 ORBSLAM2_with_pointcloud_map源码地址 将源码下载到 ~/catkin_ws/src 目录下面 如果没有安装 Ros Melodic ,参考Ubuntu18.04安装Ros Melodic 以及

    2024年01月23日
    浏览(58)
  • 云计算实战应用案例精讲-【自动驾驶】多模态融合智能检测方法及 SLAM 车载实现(论文篇)

    目录 基于多模态融合的人机协同模型与算法研究 感知与识别技术 2.1 手势信息的感知与识别

    2024年02月11日
    浏览(32)
  • 自动驾驶技术综述1:自动驾驶算法软件架构介绍

    前言: 自动驾驶技术是一个庞大的工程体系,软件架构、功能算法、控制规划、感知识别、建图定位、电气架构、车载控制器、验证体系等等,有太多的角度可以去切入。对于自动驾驶功能与算法开发,自动驾驶功能的分级是很重要的,自动驾驶的功能衍变就是随着自动驾驶

    2024年02月06日
    浏览(32)
  • 【Apollo】阿波罗自动驾驶:塑造自动驾驶技术的未来

    前言    Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、成熟、

    2024年02月12日
    浏览(31)
  • 年内实现全面自动驾驶?快来恶补一下自动驾驶技术吧

    在7月6日召开的2023世界人工智能大会上,特斯拉CEO斯克预测,随着人工智能技术的快速发展,大约在今年年末,就会实现全面自动驾驶。 他说,“我之前也做过许多类似的预测,我承认之前的预测也不完全准确,但是这一次的预测,我觉得是比较接近的。” 不知道小伙伴们

    2024年02月15日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包