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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

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

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

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

1 實驗平臺搭建

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

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

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

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

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

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

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

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

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

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

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

1.3 實驗平臺搭建:

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

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

詳細配置過程見:

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

這里只介紹其工作原理

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

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

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


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

sudo ufw status  #查看防火墻
sudo ufw enable  #打開防火墻
sudo ufw disable #關閉防火墻

開始發(fā)布optiTrack位姿的命令,其中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ù)配置信息,需要認真配置該文件,確保發(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 實驗設備標定

2.1 Optitrack光學跟蹤系統(tǒng)標定:

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

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

詳細標定過程見:

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

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

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

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

2.2 相機標定:

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

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

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

使用Matlab標定相機的過程可參考:

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

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

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

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

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

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

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

https://www.guyuehome.com/35920

該博文詳細地介紹了轉換過程、ROS程序、測試過程。轉換結果如下圖所示,包括深度圖像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ù)轉換為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ù),太快會導致數(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軌跡軌跡的詳細過程可參考博文:

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表示詳細模式,且使用SE(3)對齊。

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

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

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

    關注

    210

    文章

    27989

    瀏覽量

    205535
  • 數(shù)據(jù)

    關注

    8

    文章

    6754

    瀏覽量

    88611
  • SLAM
    +關注

    關注

    23

    文章

    411

    瀏覽量

    31738

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    零基礎學習turtlebot3機器人1

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

    SLAM不等于機器人自主定位導航

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

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

    SLAM實現(xiàn)到掃地機器人所需要的這些功能,還是有非常多的工作要做的。  針對掃地機器人,SLAMTEC將其特有的路徑規(guī)劃功能預先內(nèi)置在SLAMWARE中,方便廠家進行整合,不需要
    發(fā)表于 10-10 16:29

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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