栅格地图的构建lesson4

一、栅格地图介绍

 

1、栅格地图

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

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

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

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

栅格地图的示意图如下图所示

2、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    
————————————————
版权声明:本文为CSDN博主「李太白lx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tiancailx/article/details/112133226

3、ros time

 1)播放rosbag时,若参数/use_sim_time 为true,则此时

ros::WallTime::now()为当前的真实时间,也就是墙上的挂钟时间,一直在走。
ros::Time::now()为rosbag当时的时间,是由bag中/clock获取的。是仿真时间。

2)

如果正在使用 ROS 时钟时间,则根据 ROS 时钟返回时间。否则返回当前挂钟时间,挂钟理解为在一个房间/环境里面挂的钟,没有人去管他/改变它,挂钟时间我理解为系统时间。

 3)

二维坐标转成一维坐标

  // 固定列, 优先对行进行遍历
    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;
        }
    }

二、运行

occupancy_grid.cc

1、launch文件

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

<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>

2、报错

-- +++ processing catkin package: 'lesson3'
-- ==> add_subdirectory(lesson3)
-- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
-- +++ processing catkin package: 'lesson4'
-- ==> add_subdirectory(lesson4)
-- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
CMake Error at /usr/lib/x86_64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake:117 (find_package):
  Could not find a package configuration file provided by "boost_signals"
  (requested version 1.71.0) with any of the following names:

    boost_signalsConfig.cmake
    boost_signals-config.cmake

  Add the installation prefix of "boost_signals" to CMAKE_PREFIX_PATH or set
  "boost_signals_DIR" to a directory containing one of the above files.  If
  "boost_signals" provides a separate development package or SDK, be sure it
  has been installed.
Call Stack (most recent call first):
  /usr/lib/x86_64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake:182 (boost_find_component)
  /usr/local/share/cmake-3.22/Modules/FindBoost.cmake:594 (find_package)
  lesson4/CMakeLists.txt:22 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/cxf/laser_demo/laser/build/CMakeFiles/CMakeOutput.log".
See also "/home/cxf/laser_demo/laser/build/CMakeFiles/CMakeError.log".
Invoking "cmake" failed
 

解决:安装boost  , 一个C++扩展库的安装

ROS noetic 解决boost_signals报错问题_Jason.Li_0012的博客-CSDN博客

(requested version 1.71.0)  还没解决

解决2:此处将原有语句find package 注释并设置参数 Boost_INCLUDE_DIRS ,该语句的用以为告诉项目Boost库文件所在。

set(Boost_INCLUDE_DIRS /usr/include/boost)
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值