《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

相关推荐
AndrewHZ6 分钟前
【图像处理基石】如何入门大规模三维重建?
人工智能·深度学习·大模型·llm·三维重建·立体视觉·大规模三维重建
Andy杨6 分钟前
20250712-1-Kubernetes 监控与日志管理-K8s日志管理与维护_笔记
笔记·容器·kubernetes
Mr_Orangechen9 分钟前
Linux 下使用 VS Code 远程 GDB 调试 ARM 程序
linux·运维·arm开发
5G行业应用10 分钟前
【赠书福利,回馈公号读者】《智慧城市与智能网联汽车,融合创新发展之路》
人工智能·汽车·智慧城市
悟空胆好小19 分钟前
分音塔科技(BABEL Technology) 的公司背景、股权构成、产品类型及技术能力的全方位解读
网络·人工智能·科技·嵌入式硬件
探讨探讨AGV19 分钟前
以科技赋能未来,科聪持续支持青年创新实践 —— 第七届“科聪杯”浙江省大学生智能机器人创意竞赛圆满落幕
人工智能·科技·机器人
撰卢25 分钟前
【个人笔记】负载均衡
运维·笔记·负载均衡
cwn_37 分钟前
回归(多项式回归)
人工智能·机器学习·数据挖掘·回归
lilian1291 小时前
linux系统mysql性能优化
linux·运维·mysql
聚客AI1 小时前
🔥 大模型开发进阶:基于LangChain的异步流式响应与性能优化
人工智能·langchain·agent