ROS只使用思岚A1激光雷达进行slam建图

使用思岚A1激光雷达

A1的ros功能包下载地址:
https://github.com/slamtec/rplidar_ros
因为只有激光雷达,需要其做SLAM的话,就需要有一个laser_scan_matcher工具,其就能解算的我需要的里程计信息。
其他具体的操作过程我也是借鉴了这位大佬的博文:
https://blog.csdn.net/VampireWolf/article/details/90042517
以及另外一个大佬的:
https://blog.csdn.net/weixin_46781669/article/details/107738966?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
注意:串口权限一定要注意:

sudo chmod 777 /dev/ttyUSB0

(ttyUSB0根据自己的串口来改)
特别注意一下几个问题:
(1)问题1

ERROR: cannot launch node of type [gmapping/slam_gmapping]: gmapping
ROS path [0]=/opt/ros/melodic/share/ros ROS path
[1]=/home/derek/catkin_ws/src ROS path [2]=/opt/ros/melodic/share

没有安装gmapping功能包(ros版本自己换成自己的),解决:

sudo apt-get install ros-melodic-gmapping

(2)问题2:

[ERROR] [1619596653.001403083]: Error, operation time out.
RESULT_OPERATION_TIMEOUT! [rplidarNode-2] process has died [pid
12744, exit code 255, cmd
/home/derek/catkin_ws/devel/lib/rplidar_ros/rplidarNode
__name:=rplidarNode __log:=/home/derek/.ros/log/5fe04fd4-a7f7-11eb-aabc-000c29602675/rplidarNode-2.log].
log file:
/home/derek/.ros/log/5fe04fd4-a7f7-11eb-aabc-000c29602675/rplidarNode-2*.log

我的问题是出来波特率的问题上,思岚A1是115200,所以启动代码的中设置为115200,但是对于这种问题其实还有其他原因导致,这位大佬的博文其实说得比较完整:
https://www.freesion.com/article/35451398417/
最后的实验效果:
ROS只使用思岚A1激光雷达进行slam建图_第1张图片
ROS只使用思岚A1激光雷达进行slam建图_第2张图片

查看树状图:

rosrun rqt_tf_tree rqt_tf_tree

ROS只使用思岚A1激光雷达进行slam建图_第3张图片

如何获取/TF数据

这里需要知道的一点是,/TF有其封装好的发布器和订阅器,因为我只用到订阅,所以这里说一下如何订阅/TF话题消息。(其他可以去看下ros wiki)
注意1:需要在CmakeLists.txt中添加 tf 包
注意2:以下两个定义必须放在ros.init()后面,不然会出现错误You must call ros::init() before creating the first NodeHandle。。。这个错误在catkin_make时不会检测出来,只会在运行节点时才会出现。

tf::TransformListener listener;
tf::StampedTransform transform;

与一般的订阅反馈函数机制不一样,主要代码如下:

#include "ros/ros.h"
#include //姿态数据
#include  //包含的tf的监听器

ros::Publisher pub;

geometry_msgs::Pose pose_msg;//发送给Unity的tf的transform数据

int main(int argc, char **argv) 
{
  ros::init(argc, argv, "deal_with_laser");

  ros::NodeHandle node;

  tf::TransformListener listener;//定义一tf监听器消息

  pub = node.advertise("/pose_tf_data",1000);

  ros::Rate rate(10);

  while (node.ok()){
    tf::StampedTransform transform;
    try{
      listener.waitForTransform("odom", "base_link",ros::Time(),ros::Duration(5.0));//这句很重要
      listener.lookupTransform("odom", "base_link",ros::Time(0), transform);//lookupTransform查找到的是target到source坐标变换,对应父子坐标系
    }
    catch (tf::TransformException &ex) {
      ROS_ERROR("%s",ex.what());
      ros::Duration(1.0).sleep();
      continue;
    }  
     pose_msg.position.x = transform.getOrigin().x();//获取Translation的几个数据的格式
     pose_msg.position.y = transform.getOrigin().y();
     pose_msg.position.z = transform.getOrigin().z();
     
     pub.publish(pose_msg);

     rate.sleep();

    }

   return 0;	
}

注意:

listener.waitForTransform(“odom”,
“base_link”,ros::Time(),ros::Duration(5.0));//这句很重要
listener.lookupTransform(“odom”, “base_link”,ros::Time(0), transform);

说一下两个问题:
(1)waitForTransform()函数用于等待,这个必须加,不然会出现一下错误:

[ERROR] [1619628231.521199770]: “base_link” passed to lookupTransform argument target_frame does not exist.

(2)两个函数

lookupTransform(参数1,参数2,参数3,参数4)
waitForTransform(参数1,参数2,参数3,参数4)

两个的参数说明:主要是 参数1 与 参数2 的关系,参数1是参数2的父级frame(参数位置不要反了)。
这里可以通过查看tf_tree结构看出:(在哪个文件夹下开终端执行以下代码,tf关系图会被创在那儿)

rosrun tf view_tf

关于在jetson nano上编译时出现的问题

(1)提示找不到自定义的ROS消息类型
原因:在我们拥有多个package的时候,我们定义了一个消息或者服务,并在代码中使用了这个消息或者服务。如果是单独编译这个包,编译 通过。但是如果是多个包一起编译,就会出现找不到相关头文件的错误。
解决:先单独编译拥有自定义ROS消息类型的功能包,编译通过后再加入其他功能包进行编译。
(2)编译带有自定义ROS类型的功能包,提示自定义的消息类型.h头文件找不到,这是就需要关注.h的引用格式:
一般出现出现错误的是双引号引用:#include “…h”,出现找不到(前是CMake里没有错误),将其改为#include <…h>,问题解决。

你可能感兴趣的:(ROS探索,其他)