运行ORB-SLAM笔记_使用篇(二)
1. 编译完成之后就可以使用了,按照说明我们可以知道,首先开启roscore
再打开一个命令窗口使用命令:rosrun ORB_SLAM ORB_SLAM PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE
其中ORB_SLAM PATH_TO_VOCABULARY:是一种树型数据结构模型,ORB-SLAM
里面主要用来做回访(loop-closure)
检 测,对于不同数据集严格来说需要离线单独处理生成,但一般成像条件都差不多所以对于不同图像数据集可以使用相同的词汇数据文件(相当于一个数据库文件,方 便快速保存和查询视觉特征信息)。虽然是TXT文件,打开就是许多数字而已。(https://answers.cosrobotics.org/question/184/guan-yu-orb_slamyun-xing-yi-ji-rgb-d-datasetde-xiang-ji-can-shu-de-wen-ti/)
PATH_TO_SETTINGS_FILE:这个很容易理解就是相机的内参;
然后我们输入命令如图所示:
我们查看ORB_SLAM节点的topic
salm@salm:~$ rtopic list -v
Published topics:
* /ORB_SLAM/Map [visualization_msgs/Marker] 1 publisher
* /ORB_SLAM/Frame [sensor_msgs/Image] 1 publisher
* /rosout [rosgraph_msgs/Log] 1 publisher
* /tf [tf2_msgs/TFMessage] 1 publisher
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
Subscribed topics:
* /camera/image_raw [sensor_msgs/Image] 1 subscriber
* /rosout [rosgraph_msgs/Log] 1 subscriber
(1)知道该节点是订阅/camera/image_raw这个topic,然后被 ORB_SLALM
节点处理后的图像帧被发布到话题 ORB_SLAM/Frame
中,可以通过使用 image_view
功能包来查看
rosrun image_view image_view image:=/ORB_SLAM/Frame _autosize:=true
(2)ORB_SLAM
节点处理得到的地图被发布到话题 /ORB_SLAM/Map
中,摄像机当前位姿和地图全局坐标原点通过 /tf
功能包分别发布到话题 /ORB_SLAM/Camera
和话题 /ORB_SLAM/World
中,通过运行 rviz
功能包来查看地图:
rosrun rviz rviz -d Data/rviz.rviz
这都是我们在订阅了/camera/image_raw才能看到的试验结果,那么我们从那里得到/camera/image_raw这个节点呢?
//
那么我就尝试首先发布一个经典的图片topic 给ORB_SLAM节点:
(1)首先进入自己的工作空间catkin_ws,然后进入src,使用catkin_pkg_create命令创建我的功能包
参考 http://wiki.ros.org/image_transport/Tutorials
http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29
$ cd catkin_ws/
$ cd src/
$ catkin_create_pkg learning_image_transport image_transport cv_bridge $ cd .. $ catkin_make $ cd src $ vi my_publisher.cpp 输入:
#include <ros/ros.h> #include <image_transport/image_transport.h> #include <opencv2/highgui/highgui.hpp> #include <cv_bridge/cv_bridge.h> //非常有用的功能包,实现ROS与OPENCV图像的转换 int main(int argc, char** argv) { ros::init(argc, argv, "image_publisher"); ros::NodeHandle nh; image_transport::ImageTransport it(nh); image_transport::Publisher pub = it.advertise("camera/image_raw", 1); //这里我们发布的主题要与ORB_SLAM节点订阅的话题一致 //cv::Mat image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR); cv::Mat image = cv::imread("/home/salm/myopencv/lena.jpg",1); //写入自己要载入的图像位置 cv::waitKey(30); sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg(); //这一句就是把图像读入并转为opencv可处理的图像 ros::Rate loop_rate(5); while (nh.ok()) { pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); } }
之后在CMakefile.txt文件添加
add_executable(my_publisher src/my_publisher.cpp)
target_link_libraries(my_publisher ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
进行catkin_make即可我们运行查看一下实现的结果:
$ rosrun learning_image_transport my_publisher
$ rosrun ORB_SLAM ORB_SLAM Data/ORBvoc.txt Data/Settings.yaml
$ rosrun image_view image_view image:=/ORB_SLAM/Frame _autosize:=true
就是这个结果,因为我也是一边学习,一边实现,我自己也不知道里面使用的算法,具体为什么会这样,这也是不断学习的原因
(2)那现在我再发布一个动态的topic 用摄像头捕捉的话题发布给ORB_SLAM,看看实现结果:
与之前的一样,仍然在src 文件下 $ vi image_converter.cpp
输入:
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp> //include the headers for OPENCV's image processing and GUI module
#include <opencv2/highgui/highgui.hpp> //
static const std::string OPENCV_WINDOW = "Image window"; //define show image gui
class ImageConverter
{
ros::NodeHandle nh_; //define Nodehandle
image_transport::ImageTransport it_; //use this to create a publisher or subscriber
image_transport::Subscriber image_sub_; //
image_transport::Publisher image_pub_;
public:
ImageConverter()
: it_(nh_)
{
// Subscrive to input video feed and publish output video feed
image_sub_ = it_.subscribe("/usb_cam/image_raw", 1,
&ImageConverter::imageCb, this);
//image_pub_ = it_.advertise("/image_converter/output_video", 1);
image_pub_ = it_.advertise("/camera/image_raw", 1);
cv::namedWindow(OPENCV_WINDOW); //Opencv HighGUI calls to create/destroy a display window on start-up / shutdon
}
~ImageConverter()
{
cv::destroyWindow(OPENCV_WINDOW);
}
void imageCb(const sensor_msgs::ImageConstPtr& msg)
{
cv_bridge::CvImagePtr cv_ptr;
try
{
cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
}
catch (cv_bridge::Exception& e)
{
ROS_ERROR("cv_bridge exception: %s", e.what());
return;
}
cv::imshow(OPENCV_WINDOW, cv_ptr->image);
cv::waitKey(3);
// Output modified video stream
image_pub_.publish(cv_ptr->toImageMsg());
}
};
int main(int argc, char** argv)
{
ros::init(argc, argv, "image_converter");
ImageConverter ic;
ros::spin();
return 0;
}
同理 添加
add_executable(image_converter src/image_converter.cpp)
target_link_libraries(image_converter ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
当然前提是电脑有摄像头,并且下载了USB摄像头的驱动:https://github.com/bosch-ros-pkg/usb_cam
输入以下命令:
$ roslaunch usb_cam usb_cam-test.launch
(在启动摄像头可能会遇到一些问题吧,比如出现 Webcam: expected picture but didn't get it...就要修改launch文件下的 "pixel_format",比如有mjpeg ,yuyv等)
$ rosrun learning_image_transport image_converter
$ rosrun ORB_SLAM ORB_SLAM Data/ORBvoc.txt Data/Settings.yaml
$ rosrun image_view image_view image:=/ORB_SLAM/Frame _autosize:=true
版权所有,转载请注明出处 http://www.cnblogs.com/li-yao7758258/p/5912663.html
运行ORB-SLAM笔记_使用篇(二)相关推荐
- python小海龟画粗细渐变的线_Python 笔记_第一篇_童子功_8. 画图工具 (小海龟 turtle)...
Python 笔记_第一篇_童子功_8. 画图工具 (小海龟 turtle) turtle 是一个简单的绘图工具 提供一个小海龟, 可以把它理解为一个机器人, 只能听懂有限的命令, 且绘图窗口的原点 ...
- 扩展坞可以把手机投到显示器吗_手机 篇二:给电脑配的 Type-C拓展坞 没想到手机也能用...
原标题:手机 篇二:给电脑配的 Type-C拓展坞 没想到手机也能用 最近,凑单买配件,入手了一个名为EDAX牌子的 Type-C拓展坞,看介绍主要用于电脑,如新款MacBook和各类Type-C接口 ...
- 运行ORB-SLAM笔记_编译篇(一)
1.下载代码 https://github.com/raulmur/ORB_SLAM/ (同时也可以看看作者的牛叉论文,我是打算先用代码,再回头看论文) 2.打开后如下 就好像是用一件新产品 ...
- 系统架构师学习笔记_第十二章_连载
第十二章 系统安全架构设计 12.1 信息系统安全架构的简单描述 信息安全的特征 是为了保证信息的 机密性.完整性.可用性.可控性.不可抵赖性. 以风险策略为基础. 12.1.1 信息安全的现状 ...
- Python笔记_第一篇_面向过程_第一部分_9.Ubuntu基础操作
第一部分 Ubuntu简介 Ubuntu(乌班图)是一个机遇Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的"Ubuntu"一词,意思是 ...
- python神奇的小海龟_Python笔记_第一篇_面向过程_第一部分_8.画图工具(小海龟turtle)...
turtle 是一个简单的绘图工具. 提供一个小海龟,可以把它理解为一个机器人,只能听懂有限的命令,且绘图窗口的原点(0,0)在中间,默认海龟的方向是右侧 海龟的命令包括三类:运动命令.笔画控制命令. ...
- 嵩天python笔记_第一篇python笔记
缩进: 它属于语法的一部分 体现代码之间的层次和所属关系,也是唯一的表示形式 一般用四个空格 注释: 单行注释:以 # 开头,其后内容为注释 多行注释:以=='''== (三个单引号),开头和结尾 中 ...
- Python笔记_第二篇_面向过程_第二部分_4.常用模块的简单使用_操作系统模块(os)和队列模块(collections)...
1. 用递归函数遍历目录: import osdef getAllDir(path,sp=" "):# 得到当前目录下所有的文件filesList = os.listdir(pat ...
- Python笔记_第一篇_面向过程_第一部分_0.开场白
*什么是Python? Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido(吉多) van Rossum于1989年发明,第一个公开版本发行于1991年.在国外应用非常的广泛,国 ...
最新文章
- CSP认证201712-4	行车路线[C++题解]:单源最短路变型、拆点、好题!
- ubuntu系统使用Anaconda安装tensorflow-gpu环境
- python根据时间和类型查找文件并将该文件复制到新的文件夹下
- ccs船级社认证费用多少_亚马逊UL507认证是什么?办理费用是多少?
- oracle sql 查询优化器,基于ORACLE成本优化器的SQL查询优化分析与应用
- Advanced techniques: creating sound, sequencing, timing, scheduling
- 【转载】推荐系统的十大挑战
- 单臂路由实验(子接口的使用)
- (转)每个人都应该读一读贝索斯的致股东信 1997-2016
- Ubuntu下Vim的常用操作命令——vi编辑器常用命令
- R数据分析:二分类因变量的混合效应,多水平logistics模型介绍
- Unity iOS使用ASTC格式纹理实践
- 计算机usb速度设置,USB3.0移动硬盘写入速度只有20M/S解决提速方法
- C++重温笔记(五): 多态与虚函数
- flask爱家租房项目开发(十二)
- 数据库理论第八章部分作业——基于《数据库系统概念》第七版
- 热塑性塑料/热塑性橡胶
- Laravel 全汉字首字母分类排序
- 计算机上播放时没声音什么故障,新买的电脑插上耳机没有声音怎么办?具体故障原因及解决方法看这里...
- 如何把采集到的数据存入mysql_数据采集教程_数据发布_如何发布到数据库MySQL_后羿采集器...
热门文章
- Vue $createElement
- 决策树模型与学习《一》
- 2022-2028年中国灭火装置行业市场前瞻与投资战略规划分析报告
- Activiti——流程变量(六)
- C++ 笔记(01)— 环境设置(安装g++、g++ 编译 C++、 生成可执行文件流程、解释器与编译器区别)
- 猫猫学iOS 之第一次打开Xcode_git配置,git简单学习
- mac 端口转发方案
- UINavigationController技巧一——修改返回按钮的标题
- 设计模式之装饰模式(Java实现)
- C#条件判断-根据条件判断要走的路-if结构