一、发布地图消息
在上一小节中我们已经获取到了激光雷达的数据,在本接中我们将学习地图数据格式和如何发布地图数据。
二、了解地图数据格式
首先登录 index.ros.org 网站搜索一下map_server消息包。您也可以直接搜这个网址 map_server - ROS Wiki ,下翻找到Published Topics。
单击第二个nav_msgs/MapMetaData info,您将进入地图信息详细解释界面。
三、创建功能包编译执行代码
1、创建功能包
cd ~/catkin_ws/src
catkin_creat_pkg learning_laser roscpp rospy nav_msgs
这里如果您是按照上一节操作的话应该已经有了这个功能包,但是您会缺少依赖项nav_msgs。
那么您可以采取以下手段添加依赖项。
a、在package.xml中添加功能包依赖
<build_depend>nav_msgs</build_depend>
<exec_depend>nav_msgs</exec_depend>
b、在CMakeLists.txt中添加依赖包
在find_package中添加 nav_msgs
c、在CMakeLists.txt创建一个运行的依赖
在catkin_package中解开注释并添加上nav_msgs
在之前的博客中也曾有过此操作: 《Ubuntu20.04环境下的ROS学习笔记6》-CSDN博客
2、编写创建地图的代码
cd ~/catkin_ws/src/learning_laser/src
touch map_pub.cpp
编写代码:
# include <iostream>
# include <ros/ros.h>
# include <nav_msgs/OccupancyGrid.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "map_pub");
ros::NodeHandle n;
ros::Publisher pub = n.advertise<nav_msgs::OccupancyGrid>("/map", 10);
ros::Rate r(1);
while (ros::ok())
{
nav_msgs::OccupancyGrid msg;
// header
msg.header.frame_id = "map"; //header中的坐标系ID
msg.header.stamp = ros::Time::now(); //header中的时间戳
// 地图描述信息
msg.info.origin.position.x = 0; //地图的偏移量
msg.info.origin.position.y = 0; //地图的偏移量 您也可以修改这里看看效果
//下面是地图的旋转量,但是这里是用四元素法表示的。
msg.info.origin.orientation.x = 0;
msg.info.origin.orientation.y = 0;
msg.info.origin.orientation.z = 0;
msg.info.origin.orientation.w = 1;
msg.info.resolution = 1.0; //地图的分辨率
msg.info.width = 4; //地图的列数 即宽度
msg.info.height = 2; //地图的行数 即高度
// 地图数据
msg.data.resize(4*2);
msg.data[0] = 100;
msg.data[1] = 100;
msg.data[2] = 0;
msg.data[3] = -1;
// 发送
pub.publish(msg);
r.sleep();
}
return 0;
}
3、修改CMakeLists.txt编译规则
add_executable(map_pub src/map_pub.cpp)
target_link_libraries(map_pub ${catkin_LIBRARIES})
4、编译并运行代码
cd ~/catkin_ws
catkin_make
source devel/setup.bash 值得一提的是,这一步如果您按照了之前的文章来做,可以省略。(《Ubuntu20.04环境下的ROS学习笔记4》-CSDN博客)到这里编译结束。
roscore
ctrl + shift + O 可以水平分屏如果您是超级终端Terminator的话(《Ubuntu20.04环境下的ROS进阶学习1》-CSDN博客)
rosrun learning_laser map_pub
ctrl + shift + O 分屏
rviz
a、添加坐标轴标识
这里添加完后出现的坐标轴就是世界坐标的原点。
b、添加地图显示
将话题改为/map
这里就是代码里发布的地图了,您可以试着将代码里的参数根据注释提示做出修改,重新观察。
四、参考
38.ROS中的栅格地图格式_哔哩哔哩_bilibili
39.在ROS中,使用C++发布自定义地图_哔哩哔哩_bilibili