《Ubuntu20.04环境下的ROS进阶学习4》

一、发布地图消息

在上一小节中我们已经获取到了激光雷达的数据,在本接中我们将学习地图数据格式和如何发布地图数据。

二、了解地图数据格式

首先登录 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

编写代码:

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

相关推荐
AKAMAI几秒前
加速采用安全的企业级 Kubernetes 环境
人工智能·云计算
Aspect of twilight12 分钟前
深度学习各种优化器详解
人工智能·深度学习
徽44018 分钟前
农田植被目标检测数据标注与模型训练总结2
人工智能·目标检测·目标跟踪
Elastic 中国社区官方博客26 分钟前
Elasticsearch 中使用 NVIDIA cuVS 实现最高快 12 倍的向量索引速度:GPU 加速第 2 章
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·数据库架构
colus_SEU27 分钟前
【编译原理笔记】5.2 SDT Schemes
笔记·编译原理
赖small强34 分钟前
【Linux C/C++开发】 GCC -g 调试参数深度解析与最佳实践
linux·c语言·c++·gdb·-g
white-persist44 分钟前
VSCode 快捷键大全:从设计理念到场景化高效运用(详细解析)(文章末尾有vim快捷键大全)
linux·ide·vscode·python·编辑器·系统安全·vim
jkyy20141 小时前
线上线下融合、跨场景协同—社区健康医疗小屋的智能升级
大数据·人工智能·物联网·健康医疗
Radan小哥1 小时前
Docker学习笔记—day011
笔记·学习·docker
苏州知芯传感1 小时前
当AI遇见MEMS:机器学习如何优化微振镜的控制与可靠性预测
人工智能·机器学习·3d·mems·微振镜