从零开始搭二维激光SLAM --- 栅格地图的构建

2023-05-16

上周搬家, 导致这篇文章更新的慢了点.

之前的文章我们都是通过scan-to-scan的方式进行位姿变换的计算. 接下来的文章将带领大家体验scan-to-map的计算位姿变换的方式.

首先, 来简要介绍一下什么是map.

1 地图与占用栅格地图

1.1 人眼中的地图

地图对于大部分人来说, 第一时间想到的应该是高德地图中的地图, 是一副平面的或者立体的, 能够标识出从一个地点到另一个地点的可通行路径.

地图对于人来说其实提供了2个方面的功能, 第一个就是提供一个可通行路径, 还有一个其实是定位.

当你下了公交或者出了地铁等, 发现自己不知道自己在哪了, 你的第一反应是什么? 拿出手机, 打开GPS, 看看高德地图中自己的位置在哪, 以及搜一下如何从自己现在的位置到自己想去的位置.这就是GPS定位.

如果没有GPS怎么办呢? 一般情况下, 大家都会在地图中选一个明显的或者好认的建筑, 来判断自己与这个建筑的位置关系, 从而确定出自己在地图中的位置. 确定了位置之后就可以去自己想去的位置去了.

举个例子, 当你朋友给你打电话说我迷路了, 我不知道在哪. 大部分人的第一反应应该是让朋友说一下旁边有什么明显的建筑, 如某某商场, 某某店的名字等等, 然后你通过某某商场, 某某店的名字确定了朋友的大致位置.

1.2 机器人眼中的地图

对于机器人来说也是一样的, 只不过机器人眼中的地图在表示上与高德地图有些不同.

机器人眼中的地图的表示形式有很多, 可以是三维点云地图, 也可以是二维点云地图, 也可以是二维栅格地图, 也可以是拓扑地图, 也可以是语义地图等等.

下面展示了一些地图的图片.
在这里插入图片描述上图为二维激光SLAM构建的二维栅格地图

在这里插入图片描述上图为三维激光SLAM构建的三维点云地图

在这里插入图片描述上图为视觉SLAM(ORB-SLAM2)构建的稀疏点云地图

在这里插入图片描述
上图为视觉SLAM构建稠密点云地图

其中, 三维激光SLAM与视觉SLAM构建的地图一般都是三维点云地图, 一副完全由离散的三维空间点组成的地图.

二维激光SLAM构建的地图为二维栅格地图,

1.3 栅格地图

栅格地图就是用一个个栅格组成的网格来代表地图. 栅格里可以存储不同的数值, 代表这个栅格的不同含义.

ROS的栅格地图使用白色代表空闲,也就是可通过区域,其存储的值为 0;

黑色代表占用,也就是不可通过区域,其存储的值为 100;

灰色代表未知,就是说目前还不清楚这个栅格是否可以通过,其存储的值为 -1.

栅格地图由于其 占用与空闲的表示方法,在ROS中又被称为占用地图

栅格地图的示意图如下图所示:
在这里插入图片描述图片引用于[csdn 白茶-清欢: https://blog.csdn.net/zhao_ke_xue/article/details/110919883]

2 ROS中的数据类型

接下来看一下ROS中的栅格地图的消息类型,

$ rosmsg show nav_msgs/OccupancyGrid 
std_msgs/Header header          # 数据的消息头
  uint32 seq                    # 数据的序号
  time stamp                    # 数据的时间戳
  string frame_id               # 地图的坐标系
nav_msgs/MapMetaData info       # 地图的一些信息
  time map_load_time            # 加载地图的时间
  float32 resolution            # 地图的分辨率,一个格子代表着多少米,一般为0.05,[m/cell]
  uint32 width                  # 地图的宽度,像素的个数, [cells]
  uint32 height                 # 地图的高度,像素的个数, [cells]
  geometry_msgs/Pose origin     # 地图左下角的格子对应的物理世界的坐标,[m, m, rad]
    geometry_msgs/Point position
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion orientation
      float64 x
      float64 y
      float64 z
      float64 w
# 地图数据,优先累加行,从(0,0)开始。占用值的范围为[0,100],未知为-1。
int8[] data    

可以看到,消息可以分为3个部分,消息头header,地图信息info,地图数据data.

地图信息info储存了地图相关的信息,包括 加载地图的时间,地图的分辨率,地图的宽度与高度,以及地图左下角栅格对应的物理坐标.

地图本身是只有像素坐标的,其像素坐标系为坐下角为(0, 0) 的坐标系.通过左下角栅格对应的物理坐标 origin 以及 分辨率,再通过 像素 * 分辨率 + origin , 将像素坐标转成物理世界的坐标,从而确定了整个地图的物理坐标.

地图数据data是一维的,我们在赋值之前要首先对这个一维数组进行初始化,数据的大小就是所有像素的个数.

遍历的时候要注意方向,这个数据是以行为主要递增方向的.也就是说遍历的时候要先遍历第一行的所有数据,然后再遍历第二行的所有数据.

3 代码

接下来,通过代码展示一下如何在ROS中发布一张地图.

3.1 获取代码

代码已经提交在github上了,如果不知道github的地址的朋友, 请在我的公众号: 从零开始搭激光SLAM 中回复 开源地址 获得。

推荐使用 git clone 的方式进行下载, 因为代码是正处于更新状态的, git clone 下载的代码可以使用 git pull 很方便地进行更新.

本篇文章对应的代码为 Creating-2D-laser-slam-from-scratch/lesson4/src/occupancy_grid/occupancy_grid.cc。

3.2 main

main函数中,首先声明了一个OccupancyGrid类的对象,然后以1Hz的频率重复调用PublishMap()函数.

int main(int argc, char **argv)
{
    ros::init(argc, argv, "lesson4_make_occupancy_grid_map");
    OccupancyGrid occupancy_grid;
    ros::Rate rate(1);

    while (ros::ok())
    {
        ROS_INFO("publish occupancy map");
        occupancy_grid.PublishMap();
        rate.sleep();
    }
    return (0);
}

3.3 occupancy_grid类

类的声明如下,内容很少.

首先,想要发布栅格地图,要包含 <nav_msgs/OccupancyGrid.h>这个头文件.

声明了2个Publisher,其中map_publisher_是用来发布map完整数据的.

map_publisher_metadata_只是用来发布地图信息的,不包含data数据,所以这个话题下的数据量要明显少于map话题下的数据量.适用于只需要知道地图相关信息或者尺寸,不需要知道地图实际data数值的情况.

#include <iostream>
#include <chrono>

#include <ros/ros.h>
#include <nav_msgs/OccupancyGrid.h>

class OccupancyGrid
{
private:
    ros::NodeHandle node_handle_;           // ros中的句柄
    ros::Publisher map_publisher_;          // 声明一个Publisher
    ros::Publisher map_publisher_metadata_; // 声明一个Publisher
    nav_msgs::OccupancyGrid map_;           //用来发布map的实体对象

public:
    OccupancyGrid();
    void PublishMap();
};

3.4 OccupancyGrid()构造函数

// 构造函数
OccupancyGrid::OccupancyGrid()
{
    // \033[1;32m,\033[0m 终端显示成绿色
    ROS_INFO_STREAM("\033[1;32m----> Make Occupancy Grid Map by no move started.\033[0m");

    map_publisher_ = node_handle_.advertise<nav_msgs::OccupancyGrid>("map", 1, true);
    map_publisher_metadata_ = node_handle_.advertise<nav_msgs::MapMetaData>("map_metadata", 1, true);

    // 对map_进行初始化
    map_.header.frame_id = "map";

    // 地图的分辨率为0.05m,代表一个格子的距离是0.05m
    map_.info.resolution = 0.05;

    // 地图图片像素的大小, width为地图的宽度是多少个像素
    map_.info.width = 30;
    map_.info.height = 30;

    // 如果要表示地图图片为多少米的话,就需要用实际长度除以分辨率,得到像素值
    // map_.info.width = 100 / map_.info.resolution;
    // map_.info.height = 100 / map_.info.resolution;

    // 地图左下角的点对应的物理坐标
    map_.info.origin.position.x = 0.0;
    map_.info.origin.position.y = 0.0;

    // 对数组进行初始化, 数组的大小为实际像素的个数
    map_.data.resize(map_.info.width * map_.info.height);
}

3.5 PublishMap()

代码很简单,只说明其中几点.

  • 遍历的时候要注意顺序,是行优先的顺序
  • 为data赋值之前要进行初始化,代码里为data赋予了 从-1到254之间的不同的值,实际使用时只需要赋予 -1, 0, 100 这三种值即可
// 构造map并进行发布
void OccupancyGrid::PublishMap()
{
    start_time_ = std::chrono::steady_clock::now();

    // 通过二维索引算出来的一维索引
    int index = 0;

    // 10种情况
    int count = 10;

    // 固定列, 优先对行进行遍历
    for (int j = 0; j < map_.info.height; j++)
    {
        for (int i = 0; i < map_.info.width; i++)
        {
            // 二维坐标转成一维坐标
            index = i + j * map_.info.width;
            // std::cout << " index: " << index ;

            // 0代表空闲, 100代表占用, -1代表未知, 默认值为0

            // 为map赋予不同的值来体验效果, 从-1 到 254
            if (index % count == 0)
                map_.data[index] = -1;
            else if (index % count == 1)
                map_.data[index] = 0;
            else if (index % count == 2)
                map_.data[index] = 30;
            else if (index % count == 3)
                map_.data[index] = 60;
            else if (index % count == 4)
                map_.data[index] = 100;
            else if (index % count == 5)
                map_.data[index] = 140;
            else if (index % count == 6)
                map_.data[index] = 180;
            else if (index % count == 7)
                map_.data[index] = 220;
            else if (index % count == 8)
                map_.data[index] = 240;
            else if (index % count == 9)
                map_.data[index] = 254;
        }
    }
    
    // 设置这一帧地图数据的时间戳
    map_.header.stamp = ros::Time::now();

    // 发布map和map_metadata话题
    map_publisher_.publish(map_);
    map_publisher_metadata_.publish(map_.info);

    end_time_ = std::chrono::steady_clock::now();
    time_used_ = std::chrono::duration_cast<std::chrono::duration<double>>(end_time_ - start_time_);
    std::cout << "发布一次地图用时: " << time_used_.count() << " 秒。\n" << std::endl;
}

4 运行

4.1 launch文件

<launch>
    <!-- 启动节点 -->
    <node name="lesson4_occupancy_grid_node"
        pkg="lesson4" type="lesson4_occupancy_grid_node" output="screen" />
    
    <!-- launch rviz -->
    <node name="rviz" pkg="rviz" type="rviz" required="true"
        args="-d $(find lesson4)/config/occupancy_grid.rviz" />
</launch>

4.2 编译与运行

下载代码后,请放入您自己的工作空间中,通过 catkin_make 进行编译.

由于是新增的包,所以需要通过 rospack profile 命令让ros找到这个新的包.

之后, 使用source命令,添加ros与工作空间的地址到当前终端下,再通过如下命令运行本篇文章对应的程序

roslaunch lesson4 make_occupancy_grid_map.launch

4.3 运行结果

启动之后,会在rviz中显示出如下画面.

可以看到,虽然ROS官方中将栅格地图的值限定为 0-100,实际上将大于100的值填入栅格中也是可以在rviz中显示出来的.

值为0-100的颜色变换为从白色到黑色,值为100-254的颜色变化为从红色到黄色.

其实,这个栅格的值可以为任意值,只要接收map信息的节点做相应的处理即可.

在这里插入图片描述

同时会在终端中打印出如下消息.

[ INFO] [1609646595.640337781]: publish occupancy map
发布一次地图用时: 0.00012029 秒。

[ INFO] [1609646596.640299474]: publish occupancy map
发布一次地图用时: 9.2979e-05 秒。

[ INFO] [1609646597.640258873]: publish occupancy map
发布一次地图用时: 9.9907e-05 秒。

可以看的,现在发布一次30*30=900个像素点的地图的时间还是很小的.

但是,当实际SLAM的过程中,如果构建100m * 100m范围的地图,分辨率为0.05的情况下,那地图的像素点将达到400万个,这时发布一次地图所需要的时间将变为 0.09秒,也就是说,当地图再大点的情况下,我们发布地图的频率将不足1Hz.

所以,大部分SLAM算法将发布地图单独设置了一个线程,并让它以较低的频率进行更新.

这样又不会阻塞历程计部分的计算,也不会让地图的更新变得越来越滞后.

5 总结与Next

本篇文章中简单实现了如何发布一个OccupancyGrid类型的地图。

体会了向地图中填入不同数值时地图在rviz中的显示情况,我也是第一次见到彩色的栅格地图。。。

体会了栅格地图遍历一次的用时,地图越大,耗时也越大。

下篇文章将借鉴GMapping中构建地图的方式,将雷达数据填充到栅格地图当中。


文章将在 公众号: 从零开始搭SLAM 进行同步更新,欢迎大家关注,可以在公众号中添加我的微信,进激光SLAM交流群,大家一起交流SLAM技术。

同时,也希望您将这个公众号推荐给您身边做激光SLAM的人们,大家共同进步。

如果您对我写的文章有什么建议,或者想要看哪方面功能如何实现的,请直接在公众号中回复,我可以收到,并将认真考虑您的建议。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零开始搭二维激光SLAM --- 栅格地图的构建 的相关文章

  • 大师兄!SLAM 为什么需要李群与李代数?

    from https mp weixin qq com s sVjy9kr 8qc9W9VN78JoDQ 作者 electech6 来源 计算机视觉life 编辑 Tony 很多刚刚接触SLAM的小伙伴在看到李群和李代数这部分的时候 都有点
  • 三维刚体变换

    欢迎访问我的博客首页 三维刚体变换 1 坐标系 1 1 空间坐标系 1 2 右手坐标系与像素坐标系 2 旋转与平移 2 1 推导旋转 2 2 推导平移 2 3 推导变换 2 4 刚体变换 2 5 坐标系旋转与向量旋转 3 链式变换 4 Ei
  • LIO-SAM:在高斯牛顿法求解过程中用SO3代替欧拉角

    LIO SAM发表于IROS2020 是一个效果非常好的惯性 激光紧耦合里程计 我打算给我们的机器人搞一个激光里程计 于是打算把LIO SAM改一改搞过来 修改过程中发现一个问题 在里程计求解 mapOptimization的LMOptim
  • 基于深度相机的三维重建技术

    本文转载自http www bugevr com zblog id 14 原创作者bugeadmin 转载至我的博客 主要是为了备份 日后查找方便 谢谢原创作者的分享 三维重建 3D Reconstruction 技术一直是计算机图形学和计
  • 【SLAM】卡尔曼滤波(Kalman Filter)

    卡尔曼滤波 Kalman filter 一种利用线性系统状态方程 通过系统输入输出观测数据 对系统状态进行最优估计的算法 由于观测数据中包括系统中的噪声和干扰的影响 所以最优估计也可看作是滤波过程 卡尔曼滤波器的原理解释如下 首先 我们先要
  • 使用EKF融合odometry及imu数据

    整理资料发现早前学习robot pose ekf的笔记 大抵是一些原理基础的东西加一些自己的理解 可能有不太正确的地方 当时做工程遇到的情况为机器人在一些如光滑的地面上打滑的情形 期望使用EKF利用imu对odom数据进行校正 就结果来看
  • 从零开始一起学习SLAM(9)不推公式,如何真正理解对极约束?

    文章目录 对极几何基本概念 如何得到极线方程 作业 此文发于公众号 计算机视觉life 原文链接 从零开始一起学习SLAM 不推公式 如何真正理解对极约束 自从小白向师兄学习了李群李代数和相机成像模型的基本原理后 感觉书上的内容没那么难了
  • 对最小二乘法的一点理解 - slam学习笔记

    我对最小二乘法的理解 在给定参数个数和函数模型之后 根据测试数据 找出与所有测试数据的偏差的平方和最小的参数 这里面应该有两个问题 1 为什么选取与真实数据平方和最小的拟合函数 2 如何求参数 为什么选取与真实数据平方和最小的拟合函数 极大
  • 经典坐标变换案例代码剖析

    题目 设有小萝卜一号和小萝卜二号位于世界坐标系中 记世界坐标系为W 小萝卜们的坐标系为R1和 R2 小萝卜一号的位姿为q2 0 35 0 2 0 3 0 1 T t1 0 3 0 1 0 1 T 小萝卜二号的位姿为q2 0 5 0 4 0
  • [SLAM四元数基础系列一] 四元数定义 Hamilton vs JPL

    四元数定义 Hamilton vs JPL 简介 四种区分方式 Hamilton vs JPL 引用 不管是卡尔曼滤波或者BA优化形式的SLAM或者VIO系统中 都需要用到单位四元数 Quaternion 来表示旋转 主要是单位四元数表示旋
  • LeGO-LOAM 系列(1): LeGO-LOAM 安装以及概述

    一 github GitHub RobustFieldAutonomyLab LeGO LOAM 二 安装依赖 1 ROS Ubuntu 64 bit 16 04 ROS Kinetic 比较常规 就不赘述了 2 gtsam Georgia
  • Lego-LOAM IMU坐标系变换的详细记录

    Lego LOAM IMU坐标系变换的详细记录 0 基础知识 1 IMU 重力加速度消除 2 相机坐标系 camera 到初始坐标系 camera init 的转换 最近看了Lego LOAM 的IMU部分 没看懂IMU的坐标系变换 看其它
  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • ORB-SLAM2:基于可识别特征的自主导航与地图构建

    目录 ORB SLAM2 基于可识别特征的自主导航与地图构建 简介 地图 A 地图特征点或3D ORB B 关键帧 C 可视化图像 位置识别 A 图像识别数据库 B 高效优化的ORB匹配 C 视觉一致性 自主导航追踪 A ORB特征获取 B
  • 快看!那个学vSLAM的上吊了! —— (一)综述

    不同于之前发布的文章 我将使用一种全新的方式 iPad Notability Blog的方式打开这个板块的大门 原因有两个 1 Notability更方便手写长公式 也方便手绘坐标系变换等等 2 之前Apple Pencil找不到了新破费买
  • LeGO-LOAM中的数学公式推导

    LeGO LOAM是一种在LOAM之上进行改进的激光雷达建图方法 建图效果比LOAM要好 但是建图较为稀疏 计算量也更小了 本文原地址 wykxwyc的博客 github注释后LeGO LOAM源码 LeGO LOAM NOTED 关于代码
  • 二.全局定位--开源定位框架livox-relocalization实录数据集测试

    相关博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 基于固态雷达的全局
  • Ubuntu18.04安装pcl(过程/坑记录式教程)

    Ubuntu18 04安装pcl 1 下载pcl 2 安装依赖项 3 编译 4 安装 5 网上教程说要安装QT5和VTK 但按照本文的 本文记录了安装时出现的问题 出错的安装命令也记录了 建议浏览一遍再参考 不要错用了错误的指令 1 下载p
  • Object SLAM: An Object SLAM Framework for Association, Mapping, and High-Level Tasks 论文解读

    是一篇来自机器人顶刊T RO的文章 发表于2023 5 An Object SLAM Framework for Association Mapping and High Level Tasks 论文 An Object SLAM Fram
  • 视觉SLAM漫谈

    视觉SLAM漫谈 1 前言 开始做SLAM 机器人同时定位与建图 研究已经近一年了 从一年级开始对这个方向产生兴趣 到现在为止 也算是对这个领域有了大致的了解 然而越了解 越觉得这个方向难度很大 总体来讲有以下几个原因 入门资料很少 虽然国

随机推荐

  • No plugin found for prefix ‘tomcat7’ in the current project and in the plugin groups

    idea中开发javaweb应用 xff0c 使用mvn tomcat7 run命令运行应用时 xff0c 需要配置tomcat的maven插件 在没有配置的情况下会出现下面的错误提示 ERROR No plugin found for p
  • C#中的IComparable和IComparer接口

    C 中 xff0c 自定义类型 xff0c 支持比较和排序 xff0c 需要实现IComparable接口 IComparable接口存在一个名为CompareTo 的方法 xff0c 接收类型为object的参数表示被比较对象 xff0c
  • LeetCode Nim游戏 题解

    题述 xff1a 你和你的朋友 xff0c 两个人一起玩 Nim 游戏 xff1a 桌子上有一堆石头 你们轮流进行自己的回合 xff0c 你作为先手 每一回合 xff0c 轮到的人拿掉 1 3 块石头 拿掉最后一块石头的人就是获胜者 假设你
  • C#接口汇总

    1 IComparable和IComparer接口 用于比较和排序 IComparable 可比较的 xff0c 实现该接口的类 xff0c 便具有 可比较的 特性 IComparer 比较器 xff0c 实现该接口的类 xff0c 是一个
  • Python操作环境变量

    1 使用os读取环境变量 import os os getenv 39 path 39 os environ get 39 path 39 os environ 39 path 39 2 遍历打印所有环境变量 通过访问os environ可
  • 教程 | 阿克曼结构移动机器人的gazebo仿真(一)

    第一章 从SOLIDWORKS中导出URDF 二轮差速小车已经完结 接下去要进入阿克曼结构移动机器人的仿真 阿克曼小车的结构也就是我们看到最多的应用最广的车型 xff0c 也称为car like robot 在这里先挖下一个大坑 xff0c
  • TIANBOT MINI机器人使用blender进行贴图并导出详细教程

    很多小伙伴在看一些仿真视频中会看到 xff0c 仿真模型栩栩如生 xff0c 但是我们自己导出的模型总是不堪入目 xff0c 哪是因为你还没学会贴图 xff0c 下面我来教大家一步一步怎么学会贴图 首先我们打开blender并设置好简体中文
  • 什么是ROS2GO随身系统?

    随着ROS xff08 Robot Operating System xff09 机器人操作系统的越来越热 xff0c 大家都跃跃欲试 想一睹ROS的风采 xff0c 感受ROS的魅力 但是挡在初学者面前的第一个难题就是如何在Ubuntu系
  • 教程 | 阿克曼结构移动机器人的gazebo仿真(二)

    第二章 配置xacro文件 0 前言 上一节已经将urdf导出来了 xff0c 这一节需要配置一下xacro文件 先看一下导出的功能包在gazebo以及rviz中显示的效果 将功能包放进工作空间进行编译 xff0c source一下环境 x
  • 教程 | 阿克曼结构移动机器人的gazebo仿真(三)

    第三章 让小车动起来 1 配置controller 在tianracer description功能包新建config文件夹时 xff0c 我们可以通过一个yaml文件smart control config yaml来声明我们所需要的co
  • 教程 | 阿克曼结构移动机器人的gazebo仿真(五)

    第四章 用xacro优化URDF并配置gazebo仿真插件 1 前言 上节用简易模型写了一个小车的URDF代码 xff0c 这一节将用xacro对其进行优化 xff0c 这里我并不打算用宏对参数进行封装 xff0c 因为我个人觉得这样看起来
  • 教程 | Jetson Xavier NX 开发板强化学习环境配置流程

    一 基本介绍 NX开发板 全名Jetson Xavier NX xff08 后简称为NX xff09 xff0c 是NVIDIA英伟达提供的模组和开发者套件 xff0c 保持Jetson Nano小巧尺寸的同时拥有相当于Jetson TX2
  • 免费教程·开源 | 从零开始制作ROS无人竞速车RACECAR教程

    一 课程前提 自动驾驶汽车即将成为交通出行的主流工具之一 xff0c 它以计算机 现代汽车产业技术为基础 xff0c 以数字化 智能化为依托实现自动化驾驶 xff0c 学习自动驾驶需要了解架构 环境感知 行为决策 规划路径 xff0c 多传
  • c++ 继承 学习总结3 继承中父类和子类同名非静态成员或者同名静态成员的处理方式

    1 继承中父类和子类有同名非静态成员的处理方式 eg include lt iostream gt using namespace std class Base public Base m A 61 100 void func cout l
  • 2022ROS暑期学校暨人工智能与机器人论坛报名及日程安排

    机器人操作系统 ROS 暑期学校自2015年举办以来 xff0c 被中国机器人业界和学界 xff0c 以及ROS开源基金会誉为除了ROSCon之外规模最大 参与人数最多 最成功的ROS线下活动 过去八年 xff0c 共吸引了全国300多所高
  • MATLAB Simulink开发ROS无人车与机器人应用 详细教程

    引言 xff1a MATLAB在机器人中的应用 现在大多数机器人开发者都会选择ROS xff0c 在ROS整个框架下 调包 极其容易 很多ROS开发者热衷于 调包 来实现功能 xff0c 却难以在机器人学的理论知识上有所突破 MATLAB的
  • DE1-SOC入门之Linux开发环境搭建

    入手DE1 SOC这块FPGA也有两三个月了 xff0c 将友晶提供的入门学习例程 代码等摸索了一下 xff0c 感觉正常的fpga和arm之间的通信 控制已经没多大问题了 可是很多时候 xff0c 事情没有自己想的那么简单 现在接手的项目
  • sensor_msgs/NavSatFix Message

    1 sensor msgs NavSatStatus Message http docs ros org en api sensor msgs html msg NavSatStatus html Navigation Satellite
  • 零基础如何入门激光SLAM

    零基础如何入门激光SLAM 最近有几个人加我 xff0c 都说是刚开始学激光slam xff0c 基本都是研一 xff0c 也有一些大四的 xff08 大四的都开始学SLAM了 xff01 xff09 情况也都差不多 xff0c 有的是课题
  • 从零开始搭二维激光SLAM --- 栅格地图的构建

    上周搬家 导致这篇文章更新的慢了点 之前的文章我们都是通过scan to scan的方式进行位姿变换的计算 接下来的文章将带领大家体验scan to map的计算位姿变换的方式 首先 来简要介绍一下什么是map 1 地图与占用栅格地图 1