《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

相关推荐
llkk星期五23 分钟前
Mujoco xml < sensor>
xml·机器人
乌旭1 小时前
量子计算与GPU的异构加速:基于CUDA Quantum的混合编程实践
人工智能·pytorch·分布式·深度学习·ai·gpu算力·量子计算
deephub2 小时前
CLIMB自举框架:基于语义聚类的迭代数据混合优化及其在LLM预训练中的应用
人工智能·深度学习·大语言模型·聚类
豆沙沙包?3 小时前
5.学习笔记-SpringMVC(P61-P70)
数据库·笔记·学习
思通数科AI全行业智能NLP系统4 小时前
AI视频技术赋能幼儿园安全——教师离岗报警系统的智慧守护
大数据·人工智能·安全·目标检测·目标跟踪·自然语言处理·ocr
struggle20254 小时前
deepseek-cli开源的强大命令行界面,用于与 DeepSeek 的 AI 模型进行交互
人工智能·开源·自动化·交互·deepseek
每次的天空5 小时前
Android学习总结之Room篇
android·学习·oracle
ocr_sinosecu15 小时前
OCR定制识别:解锁文字识别的无限可能
人工智能·机器学习·ocr
白泽来了5 小时前
2个小时1.5w字| React & Golang 全栈微服务实战
笔记·go·react
奋斗者1号6 小时前
分类数据处理全解析:从独热编码到高维特征优化
人工智能·机器学习·分类