0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用OptiTrack光学跟踪系统和Turtlebot机器人进行视觉SLAM定位实验

3D视觉工坊 来源:3D视觉工坊 2023-06-13 09:24 次阅读

本文旨在介绍使用OptiTrack光学跟踪系统和Turtlebot机器人进行视觉SLAM定位实验的详细流程,包括实验平台搭建过程、数据处理过程以及SLAM估计评估方法。

由于涉及知识较多,部分内容只给出了相关参考博文链接。

1 实验平台搭建

实验平台包括OptiTrack光学跟踪系统和Turtlebot数据采集平台两部分,OptiTrack系统用于获取机器人运动轨迹真值,Turtlebot数据采集平台用于录制图像数据。

1.1 OptiTrack光学跟踪系统介绍

OptiTrack是美国公司NaturalPoint公司研制的高性能光学跟踪系统,可以获取场地中物体的亚像素级位置,目前TUM等公开数据集的轨迹真值均通过OptiTrack系统获取。

OptiTrack由固定在场地上方的多个Prime相机、荧光标记球、Motive处理软件组成,使用过程中,将多个荧光标记球粘在物体上,Prime相机以每秒数百帧的速率拍摄荧光标记球,Motive实时地解算出物体在场景中的位姿。OptiTrack系统的原理如图所示。

1.2 Turtlebot数据采集平台介绍

本实验所使用的Turtlebot数据采集平台如图所示,共由五部分组成:笔记本、Turtlebot机器人、深度相机、荧光标记球、游戏手柄。

其中笔记本是该平台的核心,用于向各设备发送指令,实现数据采集平台的各项功能;

Turtlebot机器人是一款轻量级机器人开发套件,在实验中作为移动平台;

深度相机是机器人的传感器,在实验中用于录制深度和彩色图像数据;

荧光标记球用于结合OptiTrack系统获取机器人位姿;

无线游戏手柄用来控制机器人的运动。各个设备均通过笔记本相连。

1.3 实验平台搭建:

只有知道轨迹和图像的时间戳,才能知道轨迹与估计轨迹之间的对应关系,进而评估SLAM系统的定位性能。

OptiTrack系统估计的位姿输出在上位机上,而相机图像数据输出在Turtlebot机器人搭载的笔记本上,需要将位姿数据传输到笔记本上,通过ROS统一录制数据,实现图像与位姿之间的匹配。

详细配置过程见:

https://blog.csdn.net/weixin_41536025/article/details/89913961

这里只介绍其工作原理

c163aad0-0975-11ee-962d-dac502259ad0.png

上图中,上位机安装有Motive软件,通过交换机获取OptiTrack系统的数据。通过Motive软件中的设置,将机器人位姿数据经过路由器发布在局域网中。

Turtlebot机器人搭载的笔记本通过局域网获取机器人位姿数据,并用ROS的rosbag工具录制深度相机话题和位姿话题。可能用到的命令包括:


配置笔记本防火墙的命令:(只需要配置一次)

sudo ufw status  #查看防火墙
sudo ufw enable  #打开防火墙
sudo ufw disable #关闭防火墙

开始发布optiTrack位姿的命令,其中192.168.1.104 为路由器的ip地址,笔记本需要通过wifi连接在路由器的局域网中

roslaunch vrpn_client_ros sample.launch server:=192.168.1.104 #获取optiTrack位姿数据

开始发布Realsense相机的RGB-D图像的命令,其中s_d435_camera_our.launch为编写的launch文件,它记录了各种ros命令以及参数配置信息,需要认真配置该文件,确保发布的数据“深度-彩色匹配”后的图像。

filters:=colorizer是指发布的深度图像的格式,这里是指彩色表示深度值的大小。

roslaunch realsense2_camera rs_d435_camera_our.launch filters:=colorizer #发布realsense相机的图像话题

使用rosbag命令录制图像数据与位姿数据,并保存为test.bag文件。其中/camera/color/image_raw为彩色图像话题名称

/camera/aligned_depth_to_color/image_raw 为深度图像话题名称, /vrpn_client_node/RigidBody1/pose为optiTrack位姿的话题名称,各名称需要根据实际情况修改。

-O test是指将数据保存为test.bag。

rosbag record subset /camera/color/image_raw /camera/aligned_depth_to_color/image_raw /vrpn_client_node/RigidBody1/pose -O test

2 实验设备标定

2.1 Optitrack光学跟踪系统标定:

在使用OptiTrack光学定位系统前进行标定,标定有几个目的:其一相当于对软件的初始化,为了让系统确定摄像头的采集范围;

其二确定软件内部坐标的精度,使软件根据数据生成一个3D空间;其三对所标记的物体进行空间坐标的计算。

详细标定过程见:

https://blog.csdn.net/zeye5731/article/details/104106696

标定后,在Motive中为机器人建立刚体,即可获取机器人的位姿。

下图为软件运行结果,蓝色为四个Prime相机,绿线为相机对机器人的观测路径,下方为四相机观测到的红外图像。

c16f09e8-0975-11ee-962d-dac502259ad0.png

2.2 相机标定:

深度相机在使用前需要进行标定,需要标定的参数有彩色摄像头的内参、深度摄像头的内参以及两者的外参。

相机在使用前需要进行标定的原因是每个相机在加工制和组装过程中都会存在一定的误差,这使得每个相机的成像平面,相机坐标系都会略有不同,对相机标定后,可校正相机的畸变,获得更为精确的图像,从而能够更为准确的进行定位与建图。

在实际使用过程中,一般只对彩色摄像头进行标定,其他采用厂商提供的默认参数即可。

使用Matlab标定相机的过程可参考:

https://blog.csdn.net/m0_56817529/article/details/127819167

c179f704-0975-11ee-962d-dac502259ad0.png

3 实验数据处理

实验使用rosbag工具采集图像和位姿数据,需要将其转换为TUM数据集格式,才能进一步运行SLAM算法和评估轨迹精度。

该过程包括两部分:其一为将图像保存为TUM格式,并使用TUM提供的associate.py实现深度图与彩色图之间的配准;其二为将位姿数据保存为TUM格式的轨迹真值groundtruth.txt。

3.1 RGB-D相机数据处理:

将.bag格式的图像数据转换为TUM格式数据的过程见本人之前的博文:

https://www.guyuehome.com/35920

该博文详细地介绍了转换过程、ROS程序、测试过程。转换结果如下图所示,包括深度图像depth、彩色图像rgb、深度图像路径depth.txt、彩色图像路径rgb.txt。

c17f841c-0975-11ee-962d-dac502259ad0.png

之后下载TUM提供的associate.py,实现深度图像与彩色图像之间的时间戳对齐,得到associate.txt

python associate.py rgb.txt depth.txt > associate.txt

3.2 Optitrack位姿数据处理:

将rosbag数据转换为TUM格式的轨迹真值groundtruth.txt的过程与3.1类似,也是编写一个ROS节点,订阅Optitrack位姿话题,并将数据保存在txt文件中。

具体过程为:


1.编写optitrack2tum 节点,修改下文程序中的路径,并用catkin_make命令编译工作空间


2.运行optitrack2tum节点

rosrun optitrack2tum opt2tum

3.播放rosbag数据

 rosbag play ./rgbd_dataset_fsdf.bag -r 0.3 #-r 0.3是指0.3倍速播放数据,太快会导致数据来不及保存

可以在播放数据时同时运行两个节点,保存RGB-D图像和Optitrack位姿数据。此外,也可以将路径作为参数传递给程序,避免处理不同数据时对程序的修改。

c18eb7ca-0975-11ee-962d-dac502259ad0.png

optitrackToTUM.cpp文件编写如下:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;


string Path = "/home/qin/下载/Dataet/BigPaper/0313/0313_canting/";
string pathGroungTruth = Path + "groundtruth.txt";


string pose_topic = "/vrpn_client_node/RigidBody1/pose";




void chatterCallback(const geometry_msgs::ConstPtr& msg) //Note it is geometry_msgs::PoseStamped, not std_msgs::PoseStamped
{
  ROS_INFO("I heard the pose from the robot"); 
  ROS_INFO("the position(x,y,z) is %f , %f, %f", msg->pose.position.x, msg->pose.position.y, msg->pose.position.z);
  ROS_INFO("the orientation(x,y,z,w) is %f , %f, %f, %f", msg->pose.orientation.x, msg->pose.orientation.y, msg->pose.orientation.z, msg->pose.orientation.w);
  ROS_INFO("the time we get the pose is %f", msg->header.stamp.sec + 1e-9*msg->header.stamp.nsec);


  std::cout<<"
 
"<header.stamp.toSec(); 
    double time = msg->header.stamp.toSec();
    of<pose.position.x <<" "<pose.position.y<<" "<< msg->pose.position.z<<" ";
       of<pose.orientation.x<<" "<< msg->pose.orientation.y <<" "<pose.orientation.z <<" "<pose.orientation.w ;
  }
}




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


  ofstream of;
  of.open(pathGroungTruth, std::app);
  if(of.fail()){
    ROS_INFO("Fail to open file!!");
  }else{
    of<<"#------------start a new groundTruth-----------------"<

CMakeList.txt文件编写如下:

cmake_minimum_required(VERSION 3.0.2)
project(optitrack2tum)


## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)


## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
 roscpp
 geometry_msgs
)




## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)




## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()


################################################
## Declare ROS messages, services and actions ##
################################################


## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
##  your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
##  * add a build_depend tag for "message_generation"
##  * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
##  * If MSG_DEP_SET isn't empty the following dependency has been pulled in
##   but can be declared for certainty nonetheless:
##   * add a exec_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
##  * add "message_generation" and every package in MSG_DEP_SET to
##   find_package(catkin REQUIRED COMPONENTS ...)
##  * add "message_runtime" and every package in MSG_DEP_SET to
##   catkin_package(CATKIN_DEPENDS ...)
##  * uncomment the add_*_files sections below as needed
##   and list every .msg/.srv/.action file to be processed
##  * uncomment the generate_messages entry below
##  * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)


## Generate messages in the 'msg' folder
# add_message_files(
#  FILES
#  Message1.msg
#  Message2.msg
# )


## Generate services in the 'srv' folder
# add_service_files(
#  FILES
#  Service1.srv
#  Service2.srv
# )


## Generate actions in the 'action' folder
# add_action_files(
#  FILES
#  Action1.action
#  Action2.action
# )


## Generate added messages and services with any dependencies listed here
# generate_messages(
#  DEPENDENCIES
#  sensor_msgs#  std_msgs
# )


################################################
## Declare ROS dynamic reconfigure parameters ##
################################################


## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
##  * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
##  * add "dynamic_reconfigure" to
##   find_package(catkin REQUIRED COMPONENTS ...)
##  * uncomment the "generate_dynamic_reconfigure_options" section below
##   and list every .cfg file to be processed


## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
#  cfg/DynReconf1.cfg
#  cfg/DynReconf2.cfg
# )


###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
 CATKIN_DEPENDS roscpp  geometry_msgs
# DEPENDS system_lib
)


###########
## Build ##
###########


## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
 ${OpenCV_INCLUDE_DIRS}
 ${catkin_INCLUDE_DIRS}
)




## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})


## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide






add_executable(opt2tum src/optitrackToTUM.cpp)
target_link_libraries(opt2tum ${catkin_LIBRARIES} ${OpenCV_LIBS})
 #add_dependencies(opt2tum ${PROJECT_NAME}_gencpp)

4 SLAM轨迹评估

使用EVO轨迹轨迹的详细过程可参考博文:

https://blog.csdn.net/xiaojinger_123/article/details/120136618


例如,使用以下命令绘制SLAM算法轨迹轨迹与真实轨迹的对比图。

其中evo_ape用来计算绝对轨迹误差,tum为所使用的数据格式,ourslam.txt为SLAM算法估计的轨迹,groundtruth.txt为3,2节获取到的轨迹真值,-p表示绘制误差曲线,-va表示详细模式,且使用SE(3)对齐。

evo_ape tum ourslam.txt groundtruth.txt -p -va

c1976550-0975-11ee-962d-dac502259ad0.png
责任编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    206

    文章

    27033

    浏览量

    201409
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87600
  • SLAM
    +关注

    关注

    22

    文章

    390

    浏览量

    31591

原文标题:基于OptiTrack跟踪系统和Turtlebot机器人的视觉SLAM定位评估

文章出处:【微信号:3D视觉工坊,微信公众号:3D视觉工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在未知环境中,机器人如何定位、建图与移动?

    导航与智能移动的机器人成为研究的热点和重点。对于已知环境中的机器人自主定位和已知机器人位置的地图创建已经有了一些实用的解决方法。然而在很多环境中,
    发表于 09-21 14:26

    零基础学习turtlebot3机器人1

    还有很多机器人,比如google的机器人(主要是仿生,且不容易摔倒,摔倒了也能自己爬起来)。我喜欢的方向是机器视觉,主要目标是让TurtleBot
    发表于 06-08 15:27

    SLAM不等于机器人自主定位导航

    和即时定位问题,而自主导航需要解决的是智能移动机器人与环境进行自主交互,尤其是点到点自主移动的问题,这需要更多的技术支持。 要想解决机器人智能移动这个问题,除了要有
    发表于 08-24 16:56

    服务机器人是如何实现自主定位导航的?

    SLAM实现到扫地机器人所需要的这些功能,还是有非常多的工作要做的。  针对扫地机器人,SLAMTEC将其特有的路径规划功能预先内置在SLAMWARE中,方便厂家进行整合,不需要
    发表于 10-10 16:29

    机器人完美建图的SLAM 3.0到底是何方神圣?

    姿变化拓扑地图,相关的拓扑信息  | 主动式回环闭合纠正  当机器人运动到已经探索过的原环境时, SLAM 3.0可依赖内部的拓扑图进行主动式的闭环检测。当发现了新的闭环信息后,SLAM
    发表于 01-21 10:57

    想设计炫酷的移动机器人视觉定位设计方案分享给你!

    针对移动机器人的局部视觉定位问题进行了研究。首先通过移动机器人视觉
    发表于 06-01 08:00

    LabVIEW 的Tripod 机器人视觉处理和定位研究

    为对几何体的识别和抓放过程ꎮ利用边缘提取、滤波去噪、圆心检测等算法采用LabVIEW视觉模块及其库函数进行了图像的预处理、特征提取以及中心点定位ꎮ研究结果表明基于LabVIEW的Tripod
    发表于 06-01 06:00

    机器人视觉系统组成及定位算法分析

    量计算如计算密度直方图分布、平均值和协方差矩阵等。在进行直方图均衡器化、面积计算、分类和K-L变换时,常常要进行这些统计量计算。3.视觉导航定位系统
    发表于 06-08 08:30

    【Toybrick RK3399Pro AI开发板试用申请】机器人激光与视觉融合的导航模块

    前所未有的行动能力。激光SLAM视觉SLAM融合必将带来机器人技术和人工智能技术的真正革命,也将使得机器人
    发表于 07-03 10:50

    基于机器视觉的智能导览机器人控制系统设计

    、体积和质量小等要求,因此上位机选用PC104系统,其软件用C语言编程。采用USB摄像头,采集机器人前方的视觉信息,为机器人视觉导航,路径规
    发表于 07-04 08:30

    基于图像的机器人视觉伺服系统该怎么设计?

      制造出像一样具有智能的能替代人类劳动的机器人,一直是人类的梦想,人类获取的信息80%以上是通过视觉。因此,在智能机器人的研究中,具有视觉
    发表于 09-27 08:07

    服务机器人视觉系统怎么设计?

    跟踪等领域。不同种类的机器人由于工作的重点不一样,它的视觉系统在软件或硬件上都有着细微的差别。本文研究基于服务机器人的单目视觉系统。它处理的
    发表于 04-07 07:27

    拳头机器人视觉线跟踪系统介绍

    在物流搬运行业,拳头机器人由于其独特的并联结构,常用于高速整列、装箱等场合。其中,拳头机器人视觉线跟踪技术正得到广泛的应用,如下图所示: 
    发表于 08-06 06:30

    激光SLAM视觉SLAM有什么区别?

    机器人定位导航中,目前主要涉及到激光SLAM视觉SLAM,激光SLAM在理论、技术和产品落地上都较为成熟,因而成为现下最为主流的
    发表于 07-05 06:41

    基于视觉机器人SLAM入门实践

    嵌入式系统开发与应用——基于视觉机器人SLAM入门实践1一、OpenCV的安装与配置1. 下载OpenCV3.4.1并解压到ubuntu相应目录上2. 下载安装依赖库和编译工具cma
    发表于 12-16 08:16