当前位置:   article > 正文

ubuntu18.04系统ros melodic 安装orbslam2,Astra相机的ROS环境_deptmap values factor

deptmap values factor

ubuntu18.04 安装orbslam2,rosbag,Astra相机的ROS环境

 ubuntu20.04系统 ros noetic下安裝orbslam2 打开下面链接:

CSDNhttps://mp.csdn.net/mp_blog/creation/editor/123602940

orbslam2安装

 1.安装Pangolin

  1. git clone https://github.com/stevenlovegrove/Pangolin.git
  2. cd Pangolin
  3. mkdir build
  4. cd build
  5. cmake -DCPP11_NO_BOOST=1 ..
  6. # 执行编译,这里的参数根据cpu核心数来,8核的就是-j8
  7. make -j4
  8. # 编译完之后,执行安装
  9. sudo make install

2.安装Eigen

sudo apt-get install libeigen3-dev

引用Eigen库只需要添加其头文件即可(不需要链接库文件),即在 CMakeLists.txt 文件中只要包含如下内容即可(当前开源项目已添加,不需要重复添加):

include_directories("/usr/include/eigen3")

如果不能确定eigen3的实际安装位置,可以通过以下命令进行定位:

  1. sudo updatedb
  2. locate eigen3

安装OpenCV

ROS版已集成

对于Ubuntu18.04的ROS环境melodic中,已经默认集成了OpenCV-3.2.0,ORB_SLAM2需要的OpenCV版本>2.4.3即可,此时可以不用再独立安装OpenCV了

独立运行环境

如果不想依赖ROS环境,可以独立编译安装OpenCV,首先下载相关的源码:

虽然OpenCV官方源码在github上,但是我们建议在gitee上下载OpenCV-3.4.9的源码,速度快:登录 - Gitee.com

同时下载OpenCV的扩展模块opencv_contrib包:登录 - Gitee.com

下载完成后,这里给出OpenCV-3.4.9的环境编译及安装的文档链接

下载编译ORB_SLAM2

  1. git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
  2. cd ORB_SLAM2
  3. chmod +x build.sh
  4. ./build.sh

由于作者未考虑Ubuntu18.04的兼容问题,因而需要手动在以下文件添加一个include头:

include/System.h 中添加:#include <unistd.h>

添加完成之后再重新执行编译脚本即可

如果正常编译完成,则lib目录下会生成libORB_SLAM2.so库,Examples目录下会生成对应的可执行程序 mono_tum, mono_kitti, mono_euroc, stereo_kitti, stereo_euroc, rgbd_tum。

双目相机和深度图相机的图像预处理:

orbslam_camera

编译配置

可以在执行cmake和make编译命令之前,在根目录的 CMakeLists.txt 文件中(12行)添加以下两行配置,

来屏蔽大量的代码过时警告(对编译结果没有影响),方便编译出错时候排查问题。

  1. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
  2. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated")

ORB_SLAM2的ROS

编译ROS节点

首先编译以下节点:mono, monoAR, stereo and RGB-D

  1. 添加节点的源码路径到 ROS_PACKAGE_PATH 中,打开文件 .bashrc 并将如下内容添加到末尾,这里要将其中的 PATH/ORB_SLAM2 替换成你自己的源码路径,并确保以下内容在文件的 source /opt/ros/melodic/setup.bash 之后,即

    编辑文件

gedit ~/.bashrc

追加以下内容

  1. source /opt/ros/melodic/setup.bash
  2. export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/3rdparty/ORB_SLAM2/Examples/ROS

执行 

source ~/.bashrc

 使上述配置生效

执行源码目录下的 build_ros.sh 脚本

  1. cd pwd /home/iimt/3rdparty/ORB_SLAM2
  2. chmod +x build_ros.sh
  3. ./build_ros.sh

在Ubuntu18.04之前的系统上没有问题,但是在Ubuntu18.04及以后的系统上,会出现编译报错,先解决保存问题,重新编译即可。

错误处理

如果运行 build_ros.sh 报出如下错误

libboost

  1. /usr/bin/ld: CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
  2. /usr/lib/x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line
  3. collect2: error: ld returned 1 exit status
  4. CMakeFiles/Stereo.dir/build.make:217: recipe for target '../Stereo' failed
  5. make[2]: *** [../Stereo] Error 1
  6. CMakeFiles/Makefile2:131: recipe for target 'CMakeFiles/Stereo.dir/all' failed
  7. make[1]: *** [CMakeFiles/Stereo.dir/all] Error 2
  8. make[1]: *** Waiting for unfinished jobs....

确保boost环境已安装

sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev

打开 /home/iimt/3rdparty/ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt 并在如下位置添加一行 -lboost_system

  1. set(LIBS
  2. ${OpenCV_LIBS}
  3. ${EIGEN3_LIBS}
  4. ${Pangolin_LIBRARIES}
  5. ${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
  6. ${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
  7. ${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
  8. -lboost_system
  9. )

修改保存并重新编译即可

./build_ros.sh

运行节点

运行如下节点 之前,我们要先开启相机设备节点,保证有相机数据发布在 /camera/image_raw 话题,这样我们才能看到图像内容并进行建图和定位。

在源码中 /home/iimt/3rdparty/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/ros_mono.cc 可以看到订阅的话题,我们可以改成 /camera/rgb/image_raw,就不需要改astrapro_su_rgb.launch中的话题名了

  1. //加载内参,运行orbslam时用这个,会提共 /camera/image_raw 节点 ,在astrapro_su_rgb.launch中 :把camera/image_raw 映射成了camera/rgb/image_ra可以显示点云,但是运行orbslam时需要 camera/image_raw需要这个节点,所以要注释掉,具体进launch文件看;用rqt_image_view查看时刷新一下节点
  2. roslaunch astra_camera astrapro_su_rgb.launch
单目案例 必须在当前源码目录下 cd /home/iimt/3rdparty/ORB_SLAM2 右键打开控制台 然后执行下面命令,否则找不到 Mono Vocabulary/ORBvoc.txt 磁带数据 ,astra.yaml用

把相机内参放里面 astra.yaml

单目案例

rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/astra.yaml

建图时速度必须慢,且时连惯的,不然会出现帧丢失

红色点是当时现在看到的特帧点点,黑色点是之前保存过点点只是现在没有看到;

勾选最后一个 localization时开启定位功能,不会再更新地图了

单目AR案例

rosrun ORB_SLAM2 MonoAR Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/astra.yaml

需要旋转平移初始话相机

insert cube 插入一个立方体

勾选 Draw Points 显示角点

由于是实时获取的深度数据,此时深度数据缩放因数DepthMapFactor要确保为1.0。

则我们把原来的 ./Examples/ROS/ORB_SLAM2/Asus.yaml 复制一份为 ./Examples/ROS/ORB_SLAM2/astra.yaml 。并且主要要修改以下四个值

  1. Camera.fx
  2. Camera.fy
  3. Camera.cx
  4. Camera.cy

这四个值实际上是通过相机标定得来的,这个在相机相关章节0会有原理讲解及实现。

Astra奥比中光相机的 astra.yaml 参考配置文件如下:

  1. %YAML:1.0
  2. #--------------------------------------------------------------------------------------------
  3. # Camera Parameters. Adjust them!
  4. #--------------------------------------------------------------------------------------------
  5. # Camera calibration and distortion parameters (OpenCV)
  6. Camera.fx: 577.54679
  7. Camera.fy: 578.63325
  8. Camera.cx: 310.24326
  9. Camera.cy: 253.65539
  10. Camera.k1: 0.0
  11. Camera.k2: 0.0
  12. Camera.p1: 0.0
  13. Camera.p2: 0.0
  14. Camera.width: 640
  15. Camera.height: 480
  16. # Camera frames per second
  17. Camera.fps: 30.0
  18. # IR projector baseline times fx (aprox.)
  19. Camera.bf: 40.0
  20. # Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
  21. Camera.RGB: 1
  22. # Close/Far threshold. Baseline times.
  23. ThDepth: 40.0
  24. # Deptmap values factor
  25. DepthMapFactor: 1.0
  26. #--------------------------------------------------------------------------------------------
  27. # ORB Parameters
  28. #--------------------------------------------------------------------------------------------
  29. # ORB Extractor: Number of features per image
  30. ORBextractor.nFeatures: 1000
  31. # ORB Extractor: Scale factor between levels in the scale pyramid
  32. ORBextractor.scaleFactor: 1.2
  33. # ORB Extractor: Number of levels in the scale pyramid
  34. ORBextractor.nLevels: 8
  35. # ORB Extractor: Fast threshold
  36. # Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
  37. # Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
  38. # You can lower these values if your images have low contrast
  39. ORBextractor.iniThFAST: 20
  40. ORBextractor.minThFAST: 7
  41. #--------------------------------------------------------------------------------------------
  42. # Viewer Parameters
  43. #--------------------------------------------------------------------------------------------
  44. Viewer.KeyFrameSize: 0.05
  45. Viewer.KeyFrameLineWidth: 1
  46. Viewer.GraphLineWidth: 0.9
  47. Viewer.PointSize:2
  48. Viewer.CameraSize: 0.08
  49. Viewer.CameraLineWidth: 3
  50. Viewer.ViewpointX: 0
  51. Viewer.ViewpointY: -0.7
  52. Viewer.ViewpointZ: -1.8
  53. Viewer.ViewpointF: 500

RGBD

深度相机建图和导航

由于之前的单目相机Mono节点默认接收的RGB图像节点名称为 /camera/image_raw ,而深度相机RGB-D节点默认接收的RGB图像节点和深度Depth节点为 /camera/rgb/image_raw 和 /camera/depth_registered/image_raw,此时如果我们还是用之前的相机,就需要修改之前相机的RGB图像发布话题名称。

故,推荐将文件 ./Examples/ROS/ORB_SLAM2/src/ros_rgbd.cc 的以下部分内容:

  1. ros::NodeHandle nh;
  2. message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, "/camera/rgb/image_raw", 1);
  3. message_filters::Subscriber<sensor_msgs::Image> depth_sub(nh, "/camera/depth_registered/image_raw", 1);

修改为:这样可以自己传入订阅的参数

  1. //加上"~"号后可以传入参数
  2. ros::NodeHandle nh("~");
  3. std::string rgb_topic = nh.param<std::string>("rgb", "/camera/rgb/image_raw");
  4. std::string depth_topic = nh.param<std::string>("depth", "/camera/depth_registered/image_raw");
  5. cout << "rgb: " << rgb_topic << endl;
  6. cout << "depth: " << depth_topic << endl;
  7. message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, rgb_topic, 1);
  8. message_filters::Subscriber<sensor_msgs::Image> depth_sub(nh, depth_topic, 1);

然后在项目跟路径执行以下命令,重新编译ros环境:

./build_ros.sh

这样,我们就可以指定任意的rgb话题和depth话题了(当然,如果没有指定则会使用默认值)。

从相机发布数据

启动Astra相机

执行以下命令启动相机

roslaunch astra_camera astrapro_su.launch

启动后,可以通过执行 rosrun rqt_image_view rqt_image_view 确保以下两种数据是否可见

1、RGB彩色数据:/camera/rgb/image_raw

2、Depth深度数据:/camera/depth_registered/image_raw

启动RGBD节点

此时,我们可以使用以下方式启动RGBD节点:

roslaunch astra_camera astrapro_su.launch
  1. cd /home/iimt/3rdparty/ORB_SLAM2 右键打开控制台
  2. rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/astra.yaml _rgb:=/camera/rgb/image_raw _depth:=/camera/depth_registered/image_raw

roslaunch astra_camera astrapro_su_rgb.launch
  1. cd /home/iimt/3rdparty/ORB_SLAM2 右键打开控制台
  2. rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/astra.yaml _rgb:=/camera/image_raw _depth:=/camera/depth_registered/image_raw

从bag中发布数据

我们可以直接在该网站 Computer Vision Group - Dataset Download 中下载到bag数据。

我们以 rgbd_dataset_freiburg1_xyz.bag 为例,下载后,可以使用 rosbag info xxx.bag 命令查看到彩色数据和深度数据:

  1. ty@ty-PC:~/Workspace/SLAM/Res$ rosbag info rgbd_dataset_freiburg1_xyz.bag
  2. path: rgbd_dataset_freiburg1_xyz.bag
  3. version: 2.0
  4. duration: 30.4s
  5. start: May 10 2011 20:38:18.38 (1305031098.38)
  6. end: May 10 2011 20:38:48.81 (1305031128.81)
  7. size: 480.4 MB
  8. messages: 25626
  9. compression: bz2 [1598/1598 chunks; 29.14%]
  10. uncompressed: 1.6 GB @ 54.1 MB/s
  11. compressed: 479.4 MB @ 15.8 MB/s (29.14%)
  12. types: sensor_msgs/CameraInfo [c9a58c1b0b154e0e6da7578cb991d214]
  13. sensor_msgs/Image [060021388200f6f0f447d0fcd9c64743]
  14. sensor_msgs/Imu [6a62c6daae103f4ff57a132d6f95cec2]
  15. tf/tfMessage [94810edda583a504dfda3829e70d7eec]
  16. visualization_msgs/MarkerArray [f10fe193d6fac1bf68fad5d31da421a7]
  17. topics: /camera/depth/camera_info 798 msgs : sensor_msgs/CameraInfo
  18. /camera/depth/image 798 msgs : sensor_msgs/Image
  19. /camera/rgb/camera_info 798 msgs : sensor_msgs/CameraInfo
  20. /camera/rgb/image_color 798 msgs : sensor_msgs/Image
  21. /cortex_marker_array 3034 msgs : visualization_msgs/MarkerArray
  22. /imu 15158 msgs : sensor_msgs/Imu
  23. /tf 4242 msgs : tf/tfMessage

代码段 小部件可以看到彩色和深度分别对应的话题为:/camera/rgb/image_color 和 /camera/depth/image

启动bag数据

  1. //需要进入数据所在目录
  2. cd /home/iimt/3rdparty/ORB_SLAM2/data
  3. rosbag play --pause -l rgbd_dataset_freiburg1_xyz.bag

这里启动之后,需要按下空格才会真正发布数据。-l 参数表示循环播放该数据包,可以去掉。按s会进一帧

--pause:这个不指定的话,一开始就会执行发布数据; 指定这个参数后启动 按空格后执行读取后播放数据

-l :loop的缩写:论循重新播放不结束,不加-l会播放结束

启动RGBD节点

此时,我们可以使用以下方式启动RGBD节点,但是我们要注意先准备一个新的相机参数yaml文件

  1. cd /home/iimt/3rdparty/ORB_SLAM2 右键打开控制台
  2. rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1_rosbag.yaml _rgb:=/camera/rgb/image_color _depth:=/camera/depth/image

注意这里我们修改了相机配置文件彩色图话题深度图话题

如果深度的数据不动说明深度的配置有问题:更改深度值的缩放比例

这里的相机配置文件有所修改,我们要将 Examples/RGB-D/TUM1.yaml 复制一份为 Examples/RGB-D/TUM1_rosbag.yaml 将其中的一行DepthMapFactor改为如下值:

  1. # Deptmap values factor
  2. DepthMapFactor: 1.0

效果如下:

rosbag使用

osbag简介 //需要进入数据所在目录

rosbag 既可以指命令行中数据包相关命令,也可以指 c++/python 的 rosbag 库。

rosbag 主要用于记录、回放、分析 rostopic 中的数据。它可以将指定 rostopic 中的数据记录到 .bag 后缀的数据包中,便于对其中的数据进行离线分析和处理。

对于订阅( subscribe) 某个 topic 的节点来说,它无法区分这个 topic 中的数据到底是实时获取的数据还是从 rosbag 中回放的数据。这就有助于我们基于离线数据快速重现曾经的实际场景,进行可重复、低成本的分析和调试。

记录数据

  1. //需要进入存放数据的目录
  2. cd ~/bagfiles
  3. //记录所有topic的数据,建议不要一次性录制所有数据,深度数据可能会录制失败,数据量也非常大11s达到250m
  4. rosbag record -a

-a 选项表示将当前发布的所有 topic 数据都录制保存到一个 rosbag 文件中,录制的数据包名字为日期加时间。也可以只记录某些感兴趣的 topic

rosbag record /topic_name1 /topic_name2 /topic_name3

示例:录制参色图与深度图及内参

  1. //需要进入存放数据的目录
  2. cd /home/iimt/3rdparty/ORB_SLAM2/data
  3. rosbag record /camera/rgb/image_raw /camera/depth_registered/image_raw /camera/rgb/camera_info /camera/depth/camera_info

ctrl+c 停止后会自动保存

如果要指定生成数据包的名字,则用-O /-o 参数,如下:

  1. //需要进入存放数据的目录
  2. cd ~/bagfiles
  3. rosbag record -O filename.bag /topic_name1

如果在 launch 文件中使用 rosbag record 命令,如下:

<node pkg="rosbag" type="record" name="bag_record" args="/topic1 /topic2"/> 

查看数据包信息

rosbag info指令可以显示数据包中的信息:

rosbag info filename.bag

以yaml格式查看

rosbag info -y filename.bag

回放数据

回放数据包中的 topic

rosbag play <bagfile>

如果想改变消息的发布速率,可以用下面的命令,-r 后面的数字对应播放速率。

rosbag play -r 2 <bagfile>

如果希望 rosbag 循环播放,并且开始的时候暂停,可以用命令,-r播放速度会更快

rosbag play -l --pause <bagfile>  # -l== --loop

示例:

  1. //需要进入数据所在目录
  2. cd /home/iimt/3rdparty/ORB_SLAM2/data
  3. //加载读取rosbag数据
  4. rosbag play --pause -l rgbd_dataset_freiburg1_xyz.bag
  5. //查看和使用视频数据
  6. rosrun rqt_image_view rqt_image_view
  7. cd /home/iimt/3rdparty/ORB_SLAM2 右键打开控制台
  8. rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1_rosbag.yaml _rgb:=/camera/rgb/image_color _depth:=/camera/depth/image

如果只播放感兴趣的 topic ,则用命令

rosbag play <bagfile> --topic /topic1

在上述播放命令执行期间,空格键可以暂停播放。

OctoMap-基于八叉树的地图

八叉树是用于在3D视觉中细分空间的数据结构。每个立方体都可以逐级地细分为8个子立方体,直到达到了给定的最小体积(体素)尺寸。且该最小体积(体素)决定了八叉树的分辨率。

An Efficient Probabilistic 3D Mapping Framework Based on Octrees

octomap的作用:

  • 通过点云生成占用空间小、内容紧凑的地图,节省空间
  • 合并了融合后的点云出现的重叠细节,提高运算效率
  • 方便用于进行路径规划、导航、碰撞检测

一般场景比较大时,采用较低的分辨率,意味着方块更少,且更大。场景较小时,采用高分辨率,提高精度

以上是一个八叉树的存储示例,左侧为体积模型,右侧为树状表示结构

octomap_demo.png

octomap_demo2.png

使用方法

源码地址:https://github.com/OctoMap/octomap 这里我们直接使用ros版的OctoMap,然后接收点云话题,将之转成octomap并显示。

ROS安装octomap

这里 $ROS_DISTRO 代表你电脑上的ros版本,可以通过 echo $ROS_DISTRO 查看具体代表的版本,如果命令没有输出内容,可以根据不同的ubuntu系统,替换成字符串即可:

  • Ubuntu14.04 -> indigo
  • Ubuntu16.04 -> kinetic
  • Ubuntu18.04 -> melodic
  1. sudo apt-get install ros-$ROS_DISTRO-octomap-ros
  2. sudo apt-get install ros-$ROS_DISTRO-octomap-msgs
  3. sudo apt-get install ros-$ROS_DISTRO-octomap-server

给rviz安装插件用于显示octomap

sudo apt-get install ros-$ROS_DISTRO-octomap-rviz-plugins

下载并编译ROS节点

  1. cd catkin_ws/src
  2. git clone https://gitee.com/tangyang/pointcloud_publisher.git
  3. cd ..
  4. catkin_make

pointcloud_publisher代码的作用:

  1. 将点云文件内容数据发布到话题 /pointcloud/output
  2. 使用octomap_server_node接收数据并生成Octomap
  3. 使用rviz查看点云及对应的Octomap

启动节点并预览

roslaunch pointcloud_publisher demo.launch

使用其他点云

我们可以将其他.pcd文件拷贝到 pointcloud_publisher/data 目录下,然后修改 launch/demo.launch 中的path参数即可:

<param name="path" value="$(find pointcloud_publisher)/data/room_scan1.pcd" type="str" />

pointcloud_mapping

此章节我们学习实时将rosbag或是相机发布的rgb彩色图和depth深度图合成点云图,并根据相机的位姿信息对点云进行融合。

生成点云后,将点云数据发布到 /pointcloud_mapping/Local/PointCloudOutput 话题,通过 octomap_server_node 节点生成对应的八叉树拓扑图

具体流程如下:

1、产生新的关键帧

2、构建关键帧对应的点云图

3、将新的点云图和旧的进行叠加

4、更新八叉树拓扑图

5、更新相机位姿

IO介绍

配置信息

  1. 相机内参
  2. 配置信息

输入数据:

  1. 彩色图 :/RGBD/RGB/Image
  2. 深度图:/RGBD/Depth/Image
  3. 相机位姿:/RGBD/CameraPose

输出数据:

  1. 变换后的点云
  2. 点云转换得到的八叉树图

使用方式

使用rosbag作为输入源

1、查看rosbag发布的数据 `

该数据集可以在这个链接下载:

https://vision.in.tum.de/rgbd/dataset/freiburg1/rgbd_dataset_freiburg1_room.bag

使用命令:rosbag info rgbd_dataset_freiburg1_room.bag

  1. ty@ty-PC:~/Lesson/SLAM/orbslam_01/Resource/data$ rosbag info rgbd_dataset_freiburg1_room.bag
  2. path: rgbd_dataset_freiburg1_room.bag
  3. version: 2.0
  4. duration: 49.3s
  5. start: May 10 2011 20:51:46.96 (1305031906.96)
  6. end: May 10 2011 20:52:36.24 (1305031956.24)
  7. size: 845.5 MB
  8. messages: 41803
  9. compression: bz2 [2724/2724 chunks; 30.08%]
  10. uncompressed: 2.7 GB @ 56.9 MB/s
  11. compressed: 843.8 MB @ 17.1 MB/s (30.08%)
  12. types: sensor_msgs/CameraInfo [c9a58c1b0b154e0e6da7578cb991d214]
  13. sensor_msgs/Image [060021388200f6f0f447d0fcd9c64743]
  14. sensor_msgs/Imu [6a62c6daae103f4ff57a132d6f95cec2]
  15. tf/tfMessage [94810edda583a504dfda3829e70d7eec]
  16. visualization_msgs/MarkerArray [f10fe193d6fac1bf68fad5d31da421a7]
  17. topics: /camera/depth/camera_info 1361 msgs : sensor_msgs/CameraInfo
  18. /camera/depth/image 1360 msgs : sensor_msgs/Image
  19. /camera/rgb/camera_info 1362 msgs : sensor_msgs/CameraInfo
  20. /camera/rgb/image_color 1362 msgs : sensor_msgs/Image
  21. /cortex_marker_array 4914 msgs : visualization_msgs/MarkerArray
  22. /imu 24569 msgs : sensor_msgs/Imu
  23. /tf 6875 msgs : tf/tfMessage

可见其中rgb图像话题对应

/camera/rgb/image_color      1362 msgs    : sensor_msgs/Image 

depth深度图像话题对应

  1. cd /home/iimt/3rdparty/ORB_SLAM2/data
  2. rosbag play -l --pause rgbd_dataset_freiburg1_room.bag

!注意:这里启动后数据暂时不会发布,等下边的接收及处理节点启动起来后,再到这个控制台按下空格,才真正发布数据!

3、启动数据处理节点

这里要使用添加新功能后的ORB_SLAM2版本:poplartang/ORB_SLAM2

新加功能:

ros_rgbd_pose.cc与ros_rgbd.cc对比 追踪rgbd进行彩色和深度图的地图的构建和定位修改后同时支持输出(4×4的位姿)相机到世界作表系或世界坐标系到相机的表达 

指定输入的rgb话题和depth话题(刚刚通过rosbag info xxx.bag得到的)

  1. cd /home/iimt/3rdparty/ORB_SLAM2
  2. rosrun ORB_SLAM2 RGBD_pose Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/TUM1_rosbag.yaml _rgb:=/camera/rgb/image_color _depth:=/camera/depth/image

过一小会儿,会有两个新的窗口打开,暂时没有数据内容,因为我们还未真正发布数据。

4、启动点云及Octomap渲染节点

由于我们启动的rosbag的名称rgbd_dataset_freiburg1_room.bag中包含数字1,说明对应的相机设备为tum1,故使用tum1.launch(其中不同的只是相机内参)

这里要先确认你的octomap环境已经配置好,参考链接:

poplartang/pointcloud_publisher

# 下载代码

  1. cd src
  2. git clone https://gitee.com/tangyang/pointcloud_mapping.git
  3. cd ..
  4. catkin_make -j4
roslaunch pointcloud_mapping tum1.launch

此时会有一个rviz窗口和一个点云的viewer窗口启动

5、最后,回到rogbag控制台,按下空格!

刚刚开启的那些窗口,应该开始进行实时建图与定位,且都会显示出数据了。

orb_slam2:

orbslam2.png

点云与Octomap:

octomap.png

使用相机作为输入源

1、插上相机设备

很多时候,忘了把相机连接电脑,也是出问题的原因。

2、启动相机节点

这里使用的是奥比中光的Astra相机(乐视体感相机),代码:poplartang/ros_astra_camera

  1. # roslaunch astra_camera astrapro.launch
  2. roslaunch astra_camera astrapro_su.launch

3、启动数据处理节点

这里同样要使用添加新功能后的ORB_SLAM2版本:poplartang/ORB_SLAM2

指定输入的rgb话题和depth话题(可以通过rqt_image_view查看确认)

  1. cd /home/iimt/3rdparty/ORB_SLAM2
  2. rosrun ORB_SLAM2 RGBD_pose Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/astra.yaml _rgb:=/camera/rgb/image_raw _depth:=/camera/depth_registered/image_raw

过一小会儿,会有两个新的窗口打开。

这里的_rgb_depth参数其实也可以不写,因为代码中这两个的默认值就和我们指定的是一样的。

4、启动点云及Octomap渲染节点

这里要先确认你的octomap环境已经配置好,参考链接:poplartang/pointcloud_publisher

  1. cd /home/iimt/workspace/workspace_ros_guidance
  2. catkin_make
  3. source devel/setup.sh
  4. roslaunch pointcloud_mapping astra.launch

如果没有数据就移动摄像头,因为没有数据更新

此时会有一个rviz窗口和一个点云的viewer窗口启动

ctrl+c 退出后保存不了数据,需要解决
保存数据的路径配置:
 <param name="node_path" type="string" value="$(find pointcloud_mapping)"/>

!注意:

如果点云没有更新或rviz界面没有变化,但是slam页面又是正常有数据的,那说明关键帧还没有生成,拿起摄像头转一些角度动一动就可以了。

查看融合后的点云

在使用点云渲染节点 pointcloud_mapping 后,会在其源码目录输出.pcd文件,我们可以使用pcl_viewer进行查看

pcl_viewer src/pointcloud_mapping/resultPointCloudFile.pcd

其他

可以在执行cmake和make编译命令之前,在根目录的 CMakeLists.txt 文件中(12行)添加以下两行配置,来屏蔽大量的代码过时警告(对编译结果没有影响),方便编译出错时候排查问题。

  1. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
  2. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated")

----------------------------------------------

Astra相机的ROS环境

搭建ROS环境

我们也可以直接使用官网提供的ros驱动进行开发,目前支持ROS Kinetic 和 Melodic

Astra相机的ros驱动源码地址:https://github.com/orbbec/ros_astra_camera,我们当前以 Melodic 为例(即Ubuntu18.04下的ROS环境),推荐到Github代下服务高速下载源码。

  1. 安装ROS
  2. 安装依赖

    这里要确保通过 echo $ROS_DISTRO 可以输出 melodic

  1. sudo apt install ros-$ROS_DISTRO-rgbd-launch \
  2. ros-$ROS_DISTRO-libuvc \
  3. ros-$ROS_DISTRO-libuvc-camera \
  4. ros-$ROS_DISTRO-libuvc-ros

创建工作空间

  1. mkdir -p ~/catkin_ws/src
  2. cd ~/catkin_ws/
  3. catkin_make
  4. source devel/setup.bash

在ROS工作空间释放源码(可以直接下载此链接解压到src目录)

  1. cd ~/catkin_ws/src
  2. git clone https://github.com/orbbec/ros_astra_camera

执行脚本,添加相机设备rule

  1. roscd astra_camera
  2. ./scripts/create_udev_rules

编译astra_camera

  1. cd ~/catkin_ws
  2. catkin_make --pkg astra_camera

启动节点

在启动节点前,首先要根据设备的id,修改一下启动参数。我们打开launch文件 launch/astrapro.launch 其中有一部分配置如下:

  1. //未加载内参,不能显示点云图
  2. roslaunch astra_camera astrapro.launch
  3. //加载内参,显示点云图
  4. roslaunch astra_camera astrapro.launch
  5. //加载内参,运行orbslam时用这个,会提共 /camera/image_raw 节点 ,在astrapro_su_rgb.launch中 :把camera/image_raw 映射成了camera/rgb/image_ra可以显示点云,但是运行orbslam时需要 camera/image_raw需要这个节点,所以要注释掉,具体进launch文件看,用rqt_image_view查看时刷新一下节点
  6. roslaunch astra_camera astrapro_su_rgb.launch
  1. <!-- Push down all topics/nodelets into "camera" namespace -->
  2. <group ns="$(arg camera)">
  3. <node pkg="astra_camera" type="camera_node" name="$(arg camera)_rgb">
  4. <!-- Parameters used to find the camera -->
  5. <param name="vendor" value="0x2bc5"/>
  6. <param name="product" value="0x0501"/>
  7. ....
  8. </node>

这里是通过 vendor (贴牌)和 product (产品id) 来启动设备的,所以我们要使用 lsusb 命令,来查看相机的这两个信息:

  1. ty@ty-PC:~/Workspace/ROS/catkin_ws$ lsusb
  2. Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
  3. Bus 001 Device 003: ID 5986:066d Acer, Inc
  4. Bus 001 Device 002: ID 8087:0a2a Intel Corp.
  5. Bus 001 Device 007: ID 1532:0037 Razer USA, Ltd
  6. Bus 001 Device 006: ID 2bc5:0502
  7. Bus 001 Device 005: ID 2bc5:0403
  8. Bus 001 Device 004: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
  9. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

我们通过对比插上设备前和插上设备后可以发现这里多出两行设备及对应总线:

  1. Bus 001 Device 006: ID 2bc5:0502
  2. Bus 001 Device 005: ID 2bc5:0403

此时,这里 2bc5:0502 代表彩色摄像头,2bc5:0403 代表深度摄像头,我们修改文件 launch/astrapro.launch 的以下内容:

<param name="product" value="0x0501"/>

替换为:

<param name="product" value="0x0502"/>

保存后,执行以下命令启动:

roslaunch astra_camera astrapro.launch

此时还暂时不能看到图像,需要通过订阅话题查看图像

预览图像及点云图

使用rqt_image_view 刷新一下节点

rosrun rqt_image_view rqt_image_view

选择彩色RGB原始图话题/camera/rgb/image_raw

Untitled.png

选择深度Depth原始图话题/camera/depth/image_raw

Astra/Untitled%201.png

配置相机内参文件

由于相机本身需要一些畸变配置文件来进行去畸变,所以可以通过设置如下配置,设置彩色相机和深度相机的配置文件:

1、拷贝 camera.yaml 文件和 depth.yaml 文件到cfg目录

camera.yaml

depth.yaml

2、修改 launch/astrapro.launch 文件

  1. <arg name="rgb_camera_info_url" default="" />
  2. <arg name="depth_camera_info_url" default="" />
  3. <!-- 修改为 -->
  4. <arg name="rgb_camera_info_url" default="file://$(find astra_camera)/cfg/camera.yaml" />
  5. <arg name="depth_camera_info_url" default="file://$(find astra_camera)/cfg/depth.yaml" />
  1. <param name="camera_info_url" value="" />
  2. 修改为
  3. <param name="camera_info_url" type="string" value="$(arg rgb_camera_info_url)" />

使用rviz

拷贝 astra_camera.rviz 文件到项目的rviz目录

 astra_camera.rviz

代码段 小部件

  1. //加载了内参,可以显示点云图
  2. roslaunch astra_camera astrapro_su.launch
  3. //加载内参,运行orbslam时用这个,会提共 /camera/image_raw 节点 ,在astrapro_su_rgb.launch中 :把camera/image_raw 映射成了camera/rgb/image_ra可以显示点云,但是运行orbslam时需要 camera/image_raw需要这个节点,所以要注释掉,具体进launch文件看;用rqt_image_view查看时刷新一下节点
  4. roslaunch astra_camera astrapro_su_rgb.launch

 rviz -d src/slam_vslam/ros_astra_camera/rviz/astra_camera.rviz

astra_rviz

如果之前没有配置相机内参,则这里不会显示点云图

保存点云

由于点云图像发布的话题为,我们可以通过订阅此话题来保存点云数据。

即使用pcl_ros包下的pointcloud_to_pcd节点实时捕获,详见此链接

rosrun pcl_ros pointcloud_to_pcd input:=/camera/depth_registered/points

查看点云 上面命令捕捉到点云后会打印出点云的名字160482605021468.pcd

pcl_viewer 160482605021468.pcd

此命令会实时将指定话题的点云保存到当前目录,所以要注意使用Ctrl+C停止

pcl_ros

如上,可见该命令执行过之后,很快就保存了3个pcd文件到当前目录,我们可以通过pcl_viewer工具预览点云。

-------------------

做:alias linux

Linux alias命令用于设置指令的别名

 alias 别名设置保存到文件:/root/.bashrc里面就可以了上述命令,使每次都能够自动生效。

若要修改用户(而非全部用户)自己的alias,修改~/.bashrc文件

  1. sudo gedit ~/.bashrc
  2. //在最后加入这一行
  3. alias sd='source devel/setup.sh'

source ~/.bashrc

安装一下才有 pcl_viewer 命令

sudo apt install pcl-tools

代下服务

1.

github下载链接

https://shrill-pond-3e81.hunsh.workers.dev

把git中的右键拷贝压缩包下载路径到这个网站上

2.

http://gitd.cc/

把后缀.git的克隆路径直接放进来

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/280361
推荐阅读
相关标签
  

闽ICP备14008679号