Report/Docs/2024-12-26/README.md

8.0 KiB
Raw Blame History

一.ROS

1.栅格地图格式

机器人导航所使用的地图数据是ROS系统中的map_server节点在话题/map中发布的数据。

消息类型是nav_msgs消息包的OccupancyGrid占据栅格小格子+数字,数字表示是否有障碍物。

image-20241217142513695

栅格地图:

在地面画上栅格,然后根据栅格中是否有障碍物给栅格填色。然后把障碍物移走,剩下的就是栅格地图。

image-20241217142902943

栅格划分可大可小,栅格越小,区域划分就越精细,越接近障碍物轮廓。理论上栅格足够小,栅格就可以无限趋近于障碍物轮廓。但是栅格变小,就会使栅格的数量变多,机器人的计算量就会变大。所以一般会给栅格设置一个合适的尺寸。

image-20241217143051922

栅格尺寸单个栅格的边长体现了地图的精细程度用来表示栅格地图的分辨率。ros中分辨率默认0.05m。

image-20241217143802121

image-20241217143826147

栅格数组+行列数信息就可以表述一个栅格地图。这个就是OccupancyGrid消息包中的数据内容。

2.c++节点发布地图

地图样式:

image-20241217145212886

image-20241217145427763

实现步骤:

image-20241217145516084

首先创建软件包:

image-20241217152200101

完整代码:

#include <ros/ros.h>
#include <nav_msgs/OccupancyGrid.h>

int main(int argc, char *argv[])
{
    ros::init(argc, argv, "map_pub_node");
    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
        //坐标系设置为map
        msg.header.frame_id = "map";
        //时间戳设置为当前时间
        msg.header.stamp = ros::Time::now();
        
        //描述信息 info
        //原点位置
        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;        //地图高度

        //地图数据赋值 data
        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;
}

地图赋值注意起始点位置为0开始

image-20241217154319974

修改编译规则:

add_executable(map_pub_node src/map_pub_node.cpp)

target_link_libraries(map_pub_node

 ${catkin_LIBRARIES}

)

catkin_make编译没有报错即成功编译。

然后启动roscore另一个终端启动刚刚的节点

image-20241217155621500

再启动rviz订阅/map

8df7a9d835166eb7ccc8128e017defc9_720

发现可以正常显示地图。

3.Hector_Mapping

wiki:hector_mapping - ROS Wiki

Hector_Mapping是开源的一个软件包可以在只有激光雷达的情况下获取实际的地图。在上面的网站中有一个样例视频。

流程:

image-20241217172054317

运行仿真环境roslaunch wpr_simulation wpb_stage_slam.launch

打开rviz添加机器人、雷达、地图订阅相应节点。

859d94cfc7aed9acc24eb582770b7c12

打开wps_robot_steering控制机器人直到完全扫描出地图

b382d7ca7e9d126c673834b4fcded82f

实测:运行之前写的避障算法也可以成功躲开障碍物,完成构图。

编译成功后尝试运行roslaunch slam_pkg hector.launch

image-20241218103118759

4.里程计

在机器人建图的过程中,如果有一段长直的路,周围的参照物始终不变,那么激光雷达会认为参照物不表,机器人没有动,建图就不会再继续进行。

image-20241218141337149

对于机器人来说激光雷达虽然没有识别特征但是轮子还在运动。此时里程计odometry就可以计算位移信息位移=圈数*周长。里程计不是硬件设备而是软件算法在机器人的驱动节点中运行根据电机转动数据计算位移信息并将位移信息以TF消息包的形式发送到TF话题中。但是这个只是数值计算轮子可能在真实情况出现变化从而产生误差此时就应该通过激光雷达等方式继续吻合障碍物的特征。

Gmapping

里程计输出的是odom到base_footprint的TF计算的机器人位移已经和机器人的底盘投影中心连接上无法再从base_footprint到机器人地盘再插入新的TF。如下图

image-20241218142730698

因此slam一般会迁就里程计。在计算的过程中slam节点最终要输出的是map到base_footprint所以slam移动了绿色部分的TF到odom节点之前也就是右边框出的部分。

image-20241218143115800

这样map到odom的TF和里程计的TF一连起来就形成了map到base_footprint的TF

image-20241218144456128

这个就是Gmapping的核心算法。

在hector中直接将雷达点云贴合障碍物轮廓得出的机器人位移作为最终结果。在TF树中是下面这一段

image-20241218145823603

在gmapping中机器人的位移主要由里程计推算激光点阵只适用于修正里程计的误差。而在hector中只使用雷达点云和障碍物配准的方法进行定位但是在输出时也会输出一段map到odom的TF用于修正里程计不断增长的TF使base_footprint和scanmatcher_frame保持一致但是实际上是为了保持一致而保持一致。

可以使用指令roslaunch wpr_simulation wpb_corridor_gmapping.launch

roslaunch wpr_simulation wpb_corridor_hector.launch来进行对比。

里程计的思想就是利用不同形式的定位方法减少单一SLAM算法的缺陷减少误差或增加稳定性。

5.Gmapping进行SLAM建图

gmapping软件包

可以看到gmapping订阅的话题只有两个

image-20241218153441206

1.tf坐标系转换关系有两个。

①雷达坐标系到底盘坐标系的base_link但是雷达坐标系没有规定具体名称需要跟雷达数据包的header里的frame_id保持一致。

image-20241218153647577

②里程计输出的TF。

image-20241218153838867

2.scan激光雷达的数据话题。

gmapping输出的话题有3个

image-20241218154015883

其中,第三个是机器人定位置信度,值越大,错误的可能性越大。

运行gmapping的需求列表

image-20241218155728149

首先运行仿真环境roslaunch wpr_simulation wpb_stage_robocup.launch

然后运行gmapping软件包的slam_gmapping节点:rosrun gmapping slam_gmapping

然后启动rviz添加机器人模型、雷达、地图

之后使用键盘控制机器人使用gmapping算法建图。rosrun wpr_simulation keyboard_vel_ctrl。

c3b506a1b59458f4e0162728b0eab131

二.LD14的配置与使用

把激光雷达LD14按照文档接线使用测试软件检验发现雷达可以正常使用。

image-20241225223147349

使用LD14在小车上进行cartographer建图。用键盘操控小车在办公室运动然后得到办公室的地图

微信图片_20241225150650

为了清楚显示建图结果只保留了TF坐标系和路径以及地图和激光雷达点阵。可以看到在室内可以正常完成建图操作部分没有显示的边缘是因为玻璃透光导致距离过远没有办法接收到反射回来的激光。