0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用OptiTrack光學(xué)跟蹤系統(tǒng)和Turtlebot機器人進行視覺SLAM定位實驗

3D視覺工坊 ? 來源:3D視覺工坊 ? 2023-06-13 09:24 ? 次閱讀

本文旨在介紹使用OptiTrack光學(xué)跟蹤系統(tǒng)和Turtlebot機器人進行視覺SLAM定位實驗的詳細(xì)流程,包括實驗平臺搭建過程、數(shù)據(jù)處理過程以及SLAM估計評估方法。

由于涉及知識較多,部分內(nèi)容只給出了相關(guān)參考博文鏈接。

1 實驗平臺搭建

實驗平臺包括OptiTrack光學(xué)跟蹤系統(tǒng)和Turtlebot數(shù)據(jù)采集平臺兩部分,OptiTrack系統(tǒng)用于獲取機器人運動軌跡真值,Turtlebot數(shù)據(jù)采集平臺用于錄制圖像數(shù)據(jù)。

1.1 OptiTrack光學(xué)跟蹤系統(tǒng)介紹

OptiTrack是美國公司NaturalPoint公司研制的高性能光學(xué)跟蹤系統(tǒng),可以獲取場地中物體的亞像素級位置,目前TUM等公開數(shù)據(jù)集的軌跡真值均通過OptiTrack系統(tǒng)獲取。

OptiTrack由固定在場地上方的多個Prime相機、熒光標(biāo)記球、Motive處理軟件組成,使用過程中,將多個熒光標(biāo)記球粘在物體上,Prime相機以每秒數(shù)百幀的速率拍攝熒光標(biāo)記球,Motive實時地解算出物體在場景中的位姿。OptiTrack系統(tǒng)的原理如圖所示。

1.2 Turtlebot數(shù)據(jù)采集平臺介紹

本實驗所使用的Turtlebot數(shù)據(jù)采集平臺如圖所示,共由五部分組成:筆記本、Turtlebot機器人、深度相機、熒光標(biāo)記球、游戲手柄。

其中筆記本是該平臺的核心,用于向各設(shè)備發(fā)送指令,實現(xiàn)數(shù)據(jù)采集平臺的各項功能;

Turtlebot機器人是一款輕量級機器人開發(fā)套件,在實驗中作為移動平臺;

深度相機是機器人的傳感器,在實驗中用于錄制深度和彩色圖像數(shù)據(jù);

熒光標(biāo)記球用于結(jié)合OptiTrack系統(tǒng)獲取機器人位姿;

無線游戲手柄用來控制機器人的運動。各個設(shè)備均通過筆記本相連。

1.3 實驗平臺搭建:

只有知道軌跡和圖像的時間戳,才能知道軌跡與估計軌跡之間的對應(yīng)關(guān)系,進而評估SLAM系統(tǒng)的定位性能。

OptiTrack系統(tǒng)估計的位姿輸出在上位機上,而相機圖像數(shù)據(jù)輸出在Turtlebot機器人搭載的筆記本上,需要將位姿數(shù)據(jù)傳輸?shù)焦P記本上,通過ROS統(tǒng)一錄制數(shù)據(jù),實現(xiàn)圖像與位姿之間的匹配。

詳細(xì)配置過程見:

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

這里只介紹其工作原理

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

上圖中,上位機安裝有Motive軟件,通過交換機獲取OptiTrack系統(tǒng)的數(shù)據(jù)。通過Motive軟件中的設(shè)置,將機器人位姿數(shù)據(jù)經(jīng)過路由器發(fā)布在局域網(wǎng)中。

Turtlebot機器人搭載的筆記本通過局域網(wǎng)獲取機器人位姿數(shù)據(jù),并用ROS的rosbag工具錄制深度相機話題和位姿話題??赡苡玫降拿畎ǎ?/p>


配置筆記本防火墻的命令:(只需要配置一次)

sudo ufw status  #查看防火墻
sudo ufw enable  #打開防火墻
sudo ufw disable #關(guān)閉防火墻

開始發(fā)布o(jì)ptiTrack位姿的命令,其中192.168.1.104 為路由器的ip地址,筆記本需要通過wifi連接在路由器的局域網(wǎng)中

roslaunch vrpn_client_ros sample.launch server:=192.168.1.104 #獲取optiTrack位姿數(shù)據(jù)

開始發(fā)布Realsense相機的RGB-D圖像的命令,其中s_d435_camera_our.launch為編寫的launch文件,它記錄了各種ros命令以及參數(shù)配置信息,需要認(rèn)真配置該文件,確保發(fā)布的數(shù)據(jù)“深度-彩色匹配”后的圖像。

filters:=colorizer是指發(fā)布的深度圖像的格式,這里是指彩色表示深度值的大小。

roslaunch realsense2_camera rs_d435_camera_our.launch filters:=colorizer #發(fā)布realsense相機的圖像話題

使用rosbag命令錄制圖像數(shù)據(jù)與位姿數(shù)據(jù),并保存為test.bag文件。其中/camera/color/image_raw為彩色圖像話題名稱

/camera/aligned_depth_to_color/image_raw 為深度圖像話題名稱, /vrpn_client_node/RigidBody1/pose為optiTrack位姿的話題名稱,各名稱需要根據(jù)實際情況修改。

-O test是指將數(shù)據(jù)保存為test.bag。

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

2 實驗設(shè)備標(biāo)定

2.1 Optitrack光學(xué)跟蹤系統(tǒng)標(biāo)定:

在使用OptiTrack光學(xué)定位系統(tǒng)前進行標(biāo)定,標(biāo)定有幾個目的:其一相當(dāng)于對軟件的初始化,為了讓系統(tǒng)確定攝像頭的采集范圍;

其二確定軟件內(nèi)部坐標(biāo)的精度,使軟件根據(jù)數(shù)據(jù)生成一個3D空間;其三對所標(biāo)記的物體進行空間坐標(biāo)的計算。

詳細(xì)標(biāo)定過程見:

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

標(biāo)定后,在Motive中為機器人建立剛體,即可獲取機器人的位姿。

下圖為軟件運行結(jié)果,藍(lán)色為四個Prime相機,綠線為相機對機器人的觀測路徑,下方為四相機觀測到的紅外圖像。

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

2.2 相機標(biāo)定:

深度相機在使用前需要進行標(biāo)定,需要標(biāo)定的參數(shù)有彩色攝像頭的內(nèi)參、深度攝像頭的內(nèi)參以及兩者的外參。

相機在使用前需要進行標(biāo)定的原因是每個相機在加工制和組裝過程中都會存在一定的誤差,這使得每個相機的成像平面,相機坐標(biāo)系都會略有不同,對相機標(biāo)定后,可校正相機的畸變,獲得更為精確的圖像,從而能夠更為準(zhǔn)確的進行定位與建圖。

在實際使用過程中,一般只對彩色攝像頭進行標(biāo)定,其他采用廠商提供的默認(rèn)參數(shù)即可。

使用Matlab標(biāo)定相機的過程可參考:

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

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

3 實驗數(shù)據(jù)處理

實驗使用rosbag工具采集圖像和位姿數(shù)據(jù),需要將其轉(zhuǎn)換為TUM數(shù)據(jù)集格式,才能進一步運行SLAM算法和評估軌跡精度。

該過程包括兩部分:其一為將圖像保存為TUM格式,并使用TUM提供的associate.py實現(xiàn)深度圖與彩色圖之間的配準(zhǔn);其二為將位姿數(shù)據(jù)保存為TUM格式的軌跡真值groundtruth.txt。

3.1 RGB-D相機數(shù)據(jù)處理:

將.bag格式的圖像數(shù)據(jù)轉(zhuǎn)換為TUM格式數(shù)據(jù)的過程見本人之前的博文:

https://www.guyuehome.com/35920

該博文詳細(xì)地介紹了轉(zhuǎn)換過程、ROS程序、測試過程。轉(zhuǎn)換結(jié)果如下圖所示,包括深度圖像depth、彩色圖像rgb、深度圖像路徑depth.txt、彩色圖像路徑rgb.txt。

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

之后下載TUM提供的associate.py,實現(xiàn)深度圖像與彩色圖像之間的時間戳對齊,得到associate.txt

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

3.2 Optitrack位姿數(shù)據(jù)處理:

將rosbag數(shù)據(jù)轉(zhuǎn)換為TUM格式的軌跡真值groundtruth.txt的過程與3.1類似,也是編寫一個ROS節(jié)點,訂閱Optitrack位姿話題,并將數(shù)據(jù)保存在txt文件中。

具體過程為:


1.編寫optitrack2tum 節(jié)點,修改下文程序中的路徑,并用catkin_make命令編譯工作空間


2.運行optitrack2tum節(jié)點

rosrun optitrack2tum opt2tum

3.播放rosbag數(shù)據(jù)

 rosbag play ./rgbd_dataset_fsdf.bag -r 0.3 #-r 0.3是指0.3倍速播放數(shù)據(jù),太快會導(dǎo)致數(shù)據(jù)來不及保存

可以在播放數(shù)據(jù)時同時運行兩個節(jié)點,保存RGB-D圖像和Optitrack位姿數(shù)據(jù)。此外,也可以將路徑作為參數(shù)傳遞給程序,避免處理不同數(shù)據(jù)時對程序的修改。

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軌跡軌跡的詳細(xì)過程可參考博文:

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


例如,使用以下命令繪制SLAM算法軌跡軌跡與真實軌跡的對比圖。

其中evo_ape用來計算絕對軌跡誤差,tum為所使用的數(shù)據(jù)格式,ourslam.txt為SLAM算法估計的軌跡,groundtruth.txt為3,2節(jié)獲取到的軌跡真值,-p表示繪制誤差曲線,-va表示詳細(xì)模式,且使用SE(3)對齊。

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

c1976550-0975-11ee-962d-dac502259ad0.png
責(zé)任編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 機器人
    +關(guān)注

    關(guān)注

    210

    文章

    28103

    瀏覽量

    205852
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6808

    瀏覽量

    88743
  • SLAM
    +關(guān)注

    關(guān)注

    23

    文章

    415

    瀏覽量

    31758

原文標(biāo)題:基于OptiTrack跟蹤系統(tǒng)和Turtlebot機器人的視覺SLAM定位評估

文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    在未知環(huán)境中,機器人如何定位、建圖與移動?

    導(dǎo)航與智能移動的機器人成為研究的熱點和重點。對于已知環(huán)境中的機器人自主定位和已知機器人位置的地圖創(chuàng)建已經(jīng)有了一些實用的解決方法。然而在很多環(huán)境中,
    發(fā)表于 09-21 14:26

    零基礎(chǔ)學(xué)習(xí)turtlebot3機器人1

    還有很多機器人,比如google的機器人(主要是仿生,且不容易摔倒,摔倒了也能自己爬起來)。我喜歡的方向是機器視覺,主要目標(biāo)是讓TurtleBot
    發(fā)表于 06-08 15:27

    SLAM不等于機器人自主定位導(dǎo)航

    和即時定位問題,而自主導(dǎo)航需要解決的是智能移動機器人與環(huán)境進行自主交互,尤其是點到點自主移動的問題,這需要更多的技術(shù)支持。 要想解決機器人智能移動這個問題,除了要有
    發(fā)表于 08-24 16:56

    服務(wù)機器人是如何實現(xiàn)自主定位導(dǎo)航的?

    SLAM實現(xiàn)到掃地機器人所需要的這些功能,還是有非常多的工作要做的?! ♂槍叩?b class='flag-5'>機器人,SLAMTEC將其特有的路徑規(guī)劃功能預(yù)先內(nèi)置在SLAMWARE中,方便廠家進行整合,不需要
    發(fā)表于 10-10 16:29

    LabVIEW 的Tripod 機器人視覺處理和定位研究

    為對幾何體的識別和抓放過程?利用邊緣提取、濾波去噪、圓心檢測等算法采用LabVIEW視覺模塊及其庫函數(shù)進行了圖像的預(yù)處理、特征提取以及中心點定位?研究結(jié)果表明基于LabVIEW的Tripod
    發(fā)表于 06-01 06:00

    機器人視覺系統(tǒng)組成及定位算法分析

    量計算如計算密度直方圖分布、平均值和協(xié)方差矩陣等。在進行直方圖均衡器化、面積計算、分類和K-L變換時,常常要進行這些統(tǒng)計量計算。3.視覺導(dǎo)航定位系統(tǒng)
    發(fā)表于 06-08 08:30

    【Toybrick RK3399Pro AI開發(fā)板試用申請】機器人激光與視覺融合的導(dǎo)航模塊

    前所未有的行動能力。激光SLAM視覺SLAM融合必將帶來機器人技術(shù)和人工智能技術(shù)的真正革命,也將使得機器人
    發(fā)表于 07-03 10:50

    基于機器視覺的智能導(dǎo)覽機器人控制系統(tǒng)設(shè)計

    、體積和質(zhì)量小等要求,因此上位機選用PC104系統(tǒng),其軟件用C語言編程。采用USB攝像頭,采集機器人前方的視覺信息,為機器人視覺導(dǎo)航,路徑規(guī)
    發(fā)表于 07-04 08:30

    基于圖像的機器人視覺伺服系統(tǒng)該怎么設(shè)計?

      制造出像一樣具有智能的能替代人類勞動的機器人,一直是人類的夢想,人類獲取的信息80%以上是通過視覺。因此,在智能機器人的研究中,具有視覺
    發(fā)表于 09-27 08:07

    服務(wù)機器人視覺系統(tǒng)怎么設(shè)計?

    跟蹤等領(lǐng)域。不同種類的機器人由于工作的重點不一樣,它的視覺系統(tǒng)在軟件或硬件上都有著細(xì)微的差別。本文研究基于服務(wù)機器人的單目視覺系統(tǒng)。它處理的
    發(fā)表于 04-07 07:27

    拳頭機器人視覺跟蹤系統(tǒng)介紹

    在物流搬運行業(yè),拳頭機器人由于其獨特的并聯(lián)結(jié)構(gòu),常用于高速整列、裝箱等場合。其中,拳頭機器人視覺跟蹤技術(shù)正得到廣泛的應(yīng)用,如下圖所示: 
    發(fā)表于 08-06 06:30

    激光SLAM視覺SLAM有什么區(qū)別?

    機器人定位導(dǎo)航中,目前主要涉及到激光SLAM視覺SLAM,激光SLAM在理論、技術(shù)和產(chǎn)品落地上都較為成熟,因而成為現(xiàn)下最為主流的
    發(fā)表于 07-05 06:41

    基于視覺機器人SLAM入門實踐

    嵌入式系統(tǒng)開發(fā)與應(yīng)用——基于視覺機器人SLAM入門實踐1一、OpenCV的安裝與配置1. 下載OpenCV3.4.1并解壓到ubuntu相應(yīng)目錄上2. 下載安裝依賴庫和編譯工具cma
    發(fā)表于 12-16 08:16

    SLAM+運動規(guī)劃=機器人自主定位導(dǎo)航

    SLAM技術(shù)作為機器人自主移動的關(guān)鍵技術(shù),讓很多人都誤解為:SLAM=機器人自主定位導(dǎo)航。
    發(fā)表于 03-30 10:39 ?2853次閱讀

    機器人主流定位技術(shù):激光SLAM視覺SLAM誰更勝一籌

    定位技術(shù)是機器人實現(xiàn)自主定位導(dǎo)航的最基本環(huán)節(jié),是機器人在二維工作環(huán)境中相對于全局坐標(biāo)的位置及其本身的姿態(tài)。目前SLAM (Simultane
    的頭像 發(fā)表于 12-26 10:59 ?1632次閱讀