ROS学习记录:C++节点发布自定义地图

前言

ROS栅格地图格式

在了解了ROS地图消息包的数据结构后(链接在上),本文将编写一个节点,发布地图消息包,看看在RViz中显示是什么效果。

一、准备

1、为了简单起见,发布一个两行四列的地图

2、为了便于观测,只对地图第一行进行赋值(注意,第一行是从下往上数),第二行保持空白。

3、根据ROS定义的栅格占据值,有障碍物占据的栅格值为100,没有障碍物的为0,未知状态的为-1.

4、进行如下赋值,则0和1号格有障碍物,2号格没有,3号格未知。

二、实现步骤

三、操作

1、输入cd catkin_ws1/src/ 进入工作空间的src目录

3、输入code .打开VScode

4、在map_pkg软件包的src目录下创建节点代码文件map_pub_node.cpp

5、在map_pub_node.cpp节点文件中,写入如下代码

cpp 复制代码
#include <ros/ros.h>// 引入ROS和导航消息
#include <nav_msgs/OccupancyGrid.h>

int main(int argc, char *argv[])
{
    ros::init(argc,argv,"map_pub_node");// 初始化ROS节点
    ros::NodeHandle n;
    ros::Publisher pub = n.advertise<nav_msgs::OccupancyGrid>("/map",10);// 创建一个名为/map的OccupancyGrid类型的话题发布者

    ros::Rate r(1);// 设置发布频率为1Hz
    while (ros::ok())
    {
        nav_msgs::OccupancyGrid msg;// 创建一个OccupancyGrid类型的消息

        // 设置消息的帧ID和时间戳
        msg.header.frame_id = "map";
        msg.header.stamp = ros::Time::now();

        // 设置地图的原点坐标和分辨率
        msg.info.origin.position.x = 0;
        msg.info.origin.position.y = 0;
        msg.info.resolution = 1.0;

        // 设置地图的宽度和高度
        msg.info.width = 4;
        msg.info.height = 2;

        // 设置地图的数据,这里假设地图大小为4x2,并赋予一些示例数据
        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;
}

6、在CMakeLists.txt文件末尾,添加如下编译规则

cpp 复制代码
add_executable(map_pub_node src/map_pub_node.cpp)
target_link_libraries(map_pub_node
  ${catkin_LIBRARIES}
)

7、进入工作空间,输入source ./devel/setup.bash设置ROS的环境变量,以便在当前的终端窗口中正确运行ROS软件包。

8、输入catkin_make进行编译

9、编译成功

10、接下来运行节点,首先重新打开一个终端,启动roscore

11、再打开一个终端,进入工作空间,先输入source ./devel/setup.bash设置环境变量,再输入rosrun map_pkg map_pub_node运行节点。

12、再打开一个终端,输入rviz运行rviz

13、在rviz中添加一个坐标轴标识

14、这个标识的位置,便是世界坐标系的原点

15、点击这个,添加地图显示

16、将地图消息的话题名称设置为实验节点发布的/map

17、可以看到地图显示出来了,跟地图规划时进行对比,发现是一样的,说明地图创建成功了。


18、这两行代码是设置地图原点(就是地图的左下角)相对于世界坐标系的偏移量,我们现在设置的都是0,故地图的原点是和世界坐标系原点重合的

19、对偏移量x进行修改,并保存

20、按Ctrl+Z打断刚才运行的节点

21、输入catkin_make进行编译

22、编译成功

23、重新运行节点

24、再查看rviz,发现地图向右移动了一个格子。

相关推荐
As977_2 分钟前
前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)
前端·css·学习
ajsbxi4 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
Rattenking5 分钟前
React 源码学习01 ---- React.Children.map 的实现与应用
javascript·学习·react.js
&岁月不待人&20 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove23 分钟前
G1垃圾回收器日志详解
java·开发语言
dsywws28 分钟前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
道法自然040228 分钟前
Ethernet 系列(8)-- 基础学习::ARP
网络·学习·智能路由器
无尽的大道31 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒35 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~38 分钟前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio