《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

相关推荐
傲世仙尊几秒前
信号量环形队列与线程池起步-把临界资源拆成很多份
linux
科研online7 分钟前
用可解释机器学习XGBoost+SHAP发SCI期刊的优势?
人工智能·机器学习·学习方法
Huangjin007_11 分钟前
【Linux 系统篇(二十五)】文件(二) 系统文件I/O详解
linux·运维·服务器
秦先生在广东12 分钟前
Hindsight:突破RAG瓶颈的仿生记忆系统,如何在Agent长期记忆中实现SOTA性能
人工智能
沐言Agent12 分钟前
太惊艳了!2 个让你的 Codex 狠狠省 Token 的开源项目,必须收藏!
人工智能·ai·开源
moxiaoran575316 分钟前
Codex控制与引导
人工智能
jingli918 分钟前
AI 浏览器会取代 App 吗?一个让 AI 干了一年重复活的人说点实话
人工智能
阡陌数智20 分钟前
大模型推理抖动深度剖析:生产环境下时延波动根因定位与根治方案
人工智能·语言模型·性能优化·推荐算法
Zzj_tju24 分钟前
混合检索为什么有效:RRF 改变了哪些排名?——SciFact 开发集冻结排名实验
人工智能·深度学习·语言模型
2601_9623811325 分钟前
历史视频朝代更替动效怎么做?把 AE 关键帧换成 AI 分镜动画的实战拆解
人工智能·nginx·音视频