一、栅格地图介绍
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.cmakeAdd 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)