2017-10-02 34 views
0

나는 시야를 재구성하기 위해 스테레오 카메라 시스템을 구축하기 시작했습니다. 이미지 스탠다드에 2 개의 Logitech C270 웹 카메라를 사용하여 이미지 스트림을 얻습니다.ROS rtabmap은 점 구름을 만들지 않습니다.

프로젝트의 경우 카메라 광학 장치를 최대한 가까이 있어야하므로 카메라를 세로로 한 번 돌 립니 다. video_stream_opencv 패키지를 사용하여 이미지를 가져 와서 회전하고 다른 노드로 전송합니다.

추가 작업과 일부 하드웨어 자원을 절약 할 수 있기 때문에 보정, 수정 등 전에 이미지와 카메라 정보의 타임 스탬프를 동기화해야한다고 생각 했으므로 동기화 노드를 만들어 동기화 노드를 만들었습니다. 이미지 프레임 및 카메라 정보 메시지를 캡처하고 동일한 타임 스탬프로 데이터를 다시 게시합니다. 나는 동기화가 approx_sync를 사용하는 데 필요하지 않을 것이지만 나는 틀렸다고 생각했다. 시스템을 테스트하기 위해 정적 tf 게시자도 사용하기 시작했습니다.

[1506963490.361523551] [WARN] : 오도 : 왼쪽 base_link에서 변환을 가져올 수 없습니다 (

불행하게도 나는 시스템에서 포인트 클라우드를 얻을 수 있지만 단말기에서 경고 메시지가 자주 나타납니다 스탬프 = 1506963490.228821) 0.100000 초 후 ("wait_for_transform_duration"= 0.100000)! 오류 = "0.102307 시간 초과가 0.1 후에 canTransform이 반환되었습니다." 나는 또한 노드 사이의 연결을 이해하는 RQT 그래프 생성

<launch> 
 
    <!--*******************************************************************************************--> 
 
    <!-- Global parameters ************************************************************************--> 
 
    <!--*******************************************************************************************--> 
 
    <!-- Camera --> 
 
    <arg name="fps" default="25" /> 
 

 
    <!-- Synchronization --> 
 
    <arg name="syncronizer_namespace" default="/syncronizer" /> 
 
    <arg name="left_camera_raw" default="$(arg syncronizer_namespace)/left" /> 
 
    <arg name="right_camera_raw" default="$(arg syncronizer_namespace)/right" /> 
 
    <arg name="left_camera_info_topic" default="$(arg syncronizer_namespace)/left/camera_info" /> 
 
    <arg name="right_camera_info_topic" default="$(arg syncronizer_namespace)/right/camera_info" /> 
 

 
    <!-- Stereo --> 
 
    <arg name="stereo_namespace" default="/stereo_camera" /> 
 
    <arg name="left_image_topic" default="$(arg stereo_namespace)/left/image_rect" /> 
 
    <arg name="right_image_topic" default="$(arg stereo_namespace)/right/image_rect" /> 
 

 
    <arg name="approx_sync" default="true" /> 
 
    <arg name="queue_size" default="5" /> 
 

 
    <!-- Tranfsorm --> 
 
    <arg name="use_static_transform" default="true" /> 
 

 
    <!-- Visual SLAM --> 
 
    <arg name="frame_id" default="base_link" /> 
 
    <!-- Fixed frame id, set "base_link" or "base_footprint" if they are published --> 
 
    <arg name="rtabmap" default="true" /> 
 
    <arg name="odometry" default="true" /> 
 

 
    <!-- Odometry --> 
 
    <arg name="odom_frame_id" default="odom" /> 
 
    <!-- If set, TF is used to get odometry instead of the topic --> 
 
    <arg name="ground_truth_frame_id" default="" /> 
 
    <!-- e.g., "world" --> 
 
    <arg name="ground_truth_base_frame_id" default="" /> 
 
    <!-- e.g., "tracker", a fake frame matching the frame "frame_id" (but on different TF tree) --> 
 
    <arg name="wait_for_transform" default="true" /> 
 
    <arg name="wait_for_transform_duration" default="0.2" /> 
 

 
    <!-- 3D visualization --> 
 
    <arg name="rviz" default="false" /> 
 
    <arg name="rtabmapviz" default="true" /> 
 

 
    <arg name="camera_info" default="camera_info" /> 
 

 
    <!--*******************************************************************************************--> 
 
    <!-- Core functionality ***********************************************************************--> 
 
    <!--*******************************************************************************************--> 
 

 
    <!-- Camera --> 
 
    <group ns="/camera"> 
 
    <node pkg="nodelet" type="nodelet" name="stereo_camera_nodelet" args="manager" /> 
 

 
    <!-- Left video stream input --> 
 
    <include file="$(find video_stream_opencv)/launch/camera.launch"> 
 
     <arg name="camera_name" value="left" /> 
 
     <arg name="camera_info_url" value="file:///$(find reconstruction)/config/left.yaml" /> 
 
     <arg name="video_stream_provider" value="1" /> 
 
     <arg name="flip_horizontal" value="false" /> 
 
     <arg name="flip_vertical" value="false" /> 
 
     <arg name="fps" value="$(arg fps)" /> 
 
    </include> 
 
    <!-- Right video stream input --> 
 
    <include file="$(find video_stream_opencv)/launch/camera.launch"> 
 
     <arg name="camera_name" value="right" /> 
 
     <arg name="camera_info_url" value="file:///$(find reconstruction)/config/right.yaml" /> 
 
     <arg name="video_stream_provider" value="2" /> 
 
     <arg name="flip_horizontal" value="false" /> 
 
     <arg name="flip_vertical" value="true" /> 
 
     <arg name="fps" value="$(arg fps)" /> 
 
    </include> 
 
    </group> 
 

 
    <!-- Syncronizer --> 
 
    <node name="syncronizer" pkg="reconstruction" type="syncronizer" /> 
 

 
    <!-- Stereo processing --> 
 
    <group ns="/stereo_camera"> 
 
    <node pkg="nodelet" type="nodelet" name="stereo_nodelet" args="manager" /> 
 

 
    <node pkg="stereo_image_proc" type="stereo_image_proc" name="stereo_image_proc"> 
 
     <remap from="left/image_raw" to="$(arg left_camera_raw)" /> 
 
     <remap from="right/image_raw" to="$(arg right_camera_raw)" /> 
 
     <remap from="left/camera_info" to="$(arg left_camera_info_topic)" /> 
 
     <remap from="right/camera_info" to="$(arg right_camera_info_topic)" /> 
 

 
     <param name="prefilter_size" value="35" /> 
 
     <param name="prefilter_cap" value="11" /> 
 
     <param name="correlation_window_size" value="41" /> 
 
     <param name="min_disparity" value="-15" /> 
 
     <param name="disparity_range" value="160" /> 
 
     <param name="uniqueness_ratio" value="0.0" /> 
 
     <param name="texture_threshold" value="1000" /> 
 
     <param name="speckle_size" value="500" /> 
 
     <param name="speckle_range" value="16" /> 
 
     <param name="approximate_sync" value="true" /> 
 
     <param name="queue_size" value="5" /> 
 
    </node> 
 
    </group> 
 

 
    <!-- Transform --> 
 
    <node if="$(arg use_static_transform)" pkg="tf" type="static_transform_publisher" name="world_to_map" args="0.0 0.0 0.30 0.0 0.0 0.0 /base_link /camera_link 100" /> 
 

 
    <group ns="rtabmap"> 
 
    <!-- Stereo Odometry --> 
 
    <node if="$(arg odometry)" pkg="rtabmap_ros" type="stereo_odometry" name="stereo_odometry" output="screen"> 
 
     <remap from="left/image_rect" to="$(arg left_image_topic)" /> 
 
     <remap from="right/image_rect" to="$(arg right_image_topic)" /> 
 
     <remap from="left/camera_info" to="$(arg left_camera_info_topic)" /> 
 
     <remap from="right/camera_info" to="$(arg right_camera_info_topic)" /> 
 

 
     <param name="approx_sync" type="bool" value="$(arg approx_sync)" /> 
 
     <param name="frame_id" type="string" value="$(arg frame_id)" /> 
 
     <param name="odom_frame_id" type="string" value="odom" /> 
 
     <param name="queue_size" type="int" value="5" /> 
 
    </node> 
 

 
    <!-- Visual SLAM: args: "delete_db_on_start" and "udebug" --> 
 
    <node if="$(arg rtabmap)" name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="--delete_db_on_start --udebug"> 
 
     <remap from="left/image_rect" to="$(arg left_image_topic)" /> 
 
     <remap from="right/image_rect" to="$(arg right_image_topic)" /> 
 
     <remap from="left/camera_info" to="$(arg left_camera_info_topic)" /> 
 
     <remap from="right/camera_info" to="$(arg right_camera_info_topic)" /> 
 

 
     <remap from="odom" to="/rtabmap/odom" /> 
 

 
     <param name="approx_sync" type="bool" value="$(arg approx_sync)" /> 
 
     <param name="frame_id" type="string" value="$(arg frame_id)" /> 
 
     <param name="queue_size" type="int" value="30" /> 
 

 
     <param name="subscribe_stereo" type="bool" value="true" /> 
 
     <param name="subscribe_depth" type="bool" value="false" /> 
 
    </node> 
 

 
    <!-- Visualisation RTAB-Map --> 
 
    <node if="$(arg rtabmapviz)" pkg="rtabmap_ros" type="rtabmapviz" name="rtabmapviz" args="-d $(find rtabmap_ros)/launch/config/rgbd_gui.ini" output="screen"> 
 
     <remap from="left/image_rect" to="$(arg left_image_topic)" /> 
 
     <remap from="right/image_rect" to="$(arg right_image_topic)" /> 
 
     <remap from="left/camera_info" to="$(arg left_camera_info_topic)" /> 
 
     <remap from="right/camera_info" to="$(arg right_camera_info_topic)" /> 
 

 
     <remap from="odom_info" to="/rtabmap/odom_info" /> 
 
     <remap from="odom" to="/rtabmap/odom" /> 
 

 
     <param name="frame_id" type="string" value="$(arg frame_id)" /> 
 
     <param name="queue_size" type="int" value="10" /> 
 

 
     <param name="subscribe_stereo" type="bool" value="true" /> 
 
     <param name="subscribe_odom_info" type="bool" value="true" /> 
 
    </node> 
 
    </group> 
 
</launch>

: 여기

내 실행 파일입니다 rqt_graph

을 그리고 그것은 또한 경우에 도움이 우리는 tf 프레임을 보았습니다 : tf frames

나는 무엇이 잘못되었는지를 알아 내기를 바랐다. 나는이 문제로 인해 정말로 실망했다.

답변

0

좋아, 우리는 문제가 무엇인지 알아 냈습니다.

오류가 발생하면 odometry는 프레임을 왼쪽으로 프레임 base_link로 변환 할 수 없습니다. 당신은 정적이 같은 camera_link과 왼쪽 사이에 변환을 추가 할 수 있습니다 :

<arg name="pi/2" value="1.5707963267948966" /> 
<node if="$(arg use_static_transform)" pkg="tf" type="static_transform_publisher" name="camera_optical" args="0 0 0 -$(arg pi/2) 0 -$(arg pi/2) /camera_link /left 100" /> 

을 ... 당신이 base_link 그래서 -> camera_link -> 떠났다. stereo_odometry 및 rtabmap 노드가 approx_sync : = true로 직접 수행 할 수 있으므로 미리 동기화 할 필요가 없습니다. 그러나 예, 모든 이미지/camera_info 주제에 대해 미리 동기화하고 동일한 타임 스탬프를 설정하면 odometry 및 rtabmap에 approx_sync : = false를 사용할 수 있습니다. 그 이후에 좋지 않은 결과를 얻는다면 나쁜 스테레오 정류 및/또는 동기화로 인해 발생할 수 있습니다.

로봇이 움직일 때 좋은 결과를 얻으려면 스테레오 하드웨어 (소프트웨어 아님!) 동기화를 수행하는 실제 스테레오 카메라를 얻는 것이 좋습니다.

환호,

마티유