2014-11-02 01:04:49 +00:00
|
|
|
/*
|
|
|
|
|
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
|
|
|
|
All rights reserved.
|
|
|
|
|
|
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
|
|
|
modification, are permitted provided that the following conditions are met:
|
|
|
|
|
* Redistributions of source code must retain the above copyright
|
|
|
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
|
* Redistributions in binary form must reproduce the above copyright
|
|
|
|
|
notice, this list of conditions and the following disclaimer in the
|
|
|
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
|
* Neither the name of the Universite de Sherbrooke nor the
|
|
|
|
|
names of its contributors may be used to endorse or promote products
|
|
|
|
|
derived from this software without specific prior written permission.
|
|
|
|
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
|
|
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
|
|
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
|
|
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
|
|
|
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
|
|
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
|
|
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
|
|
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
|
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <ros/ros.h>
|
|
|
|
|
#include <sensor_msgs/Image.h>
|
|
|
|
|
#include <sensor_msgs/image_encodings.h>
|
|
|
|
|
#include <sensor_msgs/PointCloud2.h>
|
|
|
|
|
#include <sensor_msgs/CameraInfo.h>
|
2015-01-23 11:19:19 -05:00
|
|
|
#include <pcl_conversions/pcl_conversions.h>
|
2014-11-02 01:04:49 +00:00
|
|
|
#include <nav_msgs/Odometry.h>
|
|
|
|
|
#include <cv_bridge/cv_bridge.h>
|
|
|
|
|
#include <image_transport/image_transport.h>
|
2015-05-14 00:42:21 -04:00
|
|
|
#include <tf2_ros/transform_broadcaster.h>
|
2014-11-02 01:04:49 +00:00
|
|
|
#include <std_srvs/Empty.h>
|
2014-11-25 17:13:15 -05:00
|
|
|
#include <rtabmap_ros/MsgConversion.h>
|
2014-11-02 01:04:49 +00:00
|
|
|
#include <rtabmap/utilite/ULogger.h>
|
2015-05-31 01:28:54 -04:00
|
|
|
#include <rtabmap/core/util3d.h>
|
2014-11-02 01:04:49 +00:00
|
|
|
#include <rtabmap/core/DBReader.h>
|
|
|
|
|
|
|
|
|
|
bool paused = false;
|
|
|
|
|
bool pauseCallback(std_srvs::Empty::Request&, std_srvs::Empty::Response&)
|
|
|
|
|
{
|
|
|
|
|
if(paused)
|
|
|
|
|
{
|
|
|
|
|
ROS_WARN("Already paused!");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
paused = true;
|
|
|
|
|
ROS_INFO("paused!");
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool resumeCallback(std_srvs::Empty::Request&, std_srvs::Empty::Response&)
|
|
|
|
|
{
|
|
|
|
|
if(!paused)
|
|
|
|
|
{
|
|
|
|
|
ROS_WARN("Already running!");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
paused = false;
|
|
|
|
|
ROS_INFO("resumed!");
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv)
|
|
|
|
|
{
|
|
|
|
|
ros::init(argc, argv, "data_player");
|
|
|
|
|
|
|
|
|
|
//ULogger::setType(ULogger::kTypeConsole);
|
|
|
|
|
//ULogger::setLevel(ULogger::kDebug);
|
|
|
|
|
//ULogger::setEventLevel(ULogger::kWarning);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ros::NodeHandle nh;
|
|
|
|
|
ros::NodeHandle pnh("~");
|
|
|
|
|
|
|
|
|
|
std::string frameId = "base_link";
|
|
|
|
|
std::string odomFrameId = "odom";
|
|
|
|
|
std::string cameraFrameId = "camera_optical_link";
|
|
|
|
|
double rate = 1.0f;
|
|
|
|
|
std::string databasePath = "";
|
|
|
|
|
bool publishTf = true;
|
|
|
|
|
int startId = 0;
|
|
|
|
|
|
|
|
|
|
pnh.param("frame_id", frameId, frameId);
|
|
|
|
|
pnh.param("odom_frame_id", odomFrameId, odomFrameId);
|
|
|
|
|
pnh.param("camera_frame_id", cameraFrameId, cameraFrameId);
|
2015-05-01 07:35:21 -04:00
|
|
|
pnh.param("rate", rate, rate); // Set -1 to use database stamps
|
2014-11-02 01:04:49 +00:00
|
|
|
pnh.param("database", databasePath, databasePath);
|
|
|
|
|
pnh.param("publish_tf", publishTf, publishTf);
|
|
|
|
|
pnh.param("start_id", startId, startId);
|
|
|
|
|
|
|
|
|
|
ROS_INFO("frame_id = %s", frameId.c_str());
|
|
|
|
|
ROS_INFO("odom_frame_id = %s", odomFrameId.c_str());
|
|
|
|
|
ROS_INFO("camera_frame_id = %s", cameraFrameId.c_str());
|
|
|
|
|
ROS_INFO("database = %s", databasePath.c_str());
|
|
|
|
|
ROS_INFO("rate = %f", rate);
|
|
|
|
|
ROS_INFO("publish_tf = %s", publishTf?"true":"false");
|
|
|
|
|
|
|
|
|
|
rtabmap::DBReader reader(databasePath, rate);
|
|
|
|
|
|
|
|
|
|
if(databasePath.empty())
|
|
|
|
|
{
|
|
|
|
|
ROS_ERROR("Parameter \"database\" must be set (path to a RTAB-Map database).");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!reader.init(startId))
|
|
|
|
|
{
|
|
|
|
|
ROS_ERROR("Cannot open database \"%s\".", databasePath.c_str());
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ros::ServiceServer pauseSrv = pnh.advertiseService("pause", pauseCallback);
|
|
|
|
|
ros::ServiceServer resumeSrv = pnh.advertiseService("resume", resumeCallback);
|
|
|
|
|
|
|
|
|
|
image_transport::ImageTransport it(nh);
|
|
|
|
|
image_transport::Publisher imagePub;
|
|
|
|
|
image_transport::Publisher rgbPub;
|
|
|
|
|
image_transport::Publisher depthPub;
|
|
|
|
|
image_transport::Publisher leftPub;
|
|
|
|
|
image_transport::Publisher rightPub;
|
|
|
|
|
ros::Publisher rgbCamInfoPub;
|
|
|
|
|
ros::Publisher depthCamInfoPub;
|
|
|
|
|
ros::Publisher leftCamInfoPub;
|
|
|
|
|
ros::Publisher rightCamInfoPub;
|
|
|
|
|
ros::Publisher odometryPub;
|
2015-01-23 11:19:19 -05:00
|
|
|
ros::Publisher scanPub;
|
2015-05-14 00:42:21 -04:00
|
|
|
tf2_ros::TransformBroadcaster tfBroadcaster;
|
2014-11-02 01:04:49 +00:00
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
rtabmap::OdometryEvent odom = reader.getNextData();
|
|
|
|
|
while(ros::ok() && odom.data().id())
|
2014-11-02 01:04:49 +00:00
|
|
|
{
|
2015-05-30 20:08:20 -04:00
|
|
|
ROS_INFO("Reading sensor data %d...", odom.data().id());
|
2014-11-02 01:04:49 +00:00
|
|
|
|
|
|
|
|
ros::Time time = ros::Time::now();
|
|
|
|
|
|
|
|
|
|
sensor_msgs::CameraInfo camInfoA; //rgb or left
|
|
|
|
|
sensor_msgs::CameraInfo camInfoB; //depth or right
|
|
|
|
|
|
|
|
|
|
camInfoA.K.assign(0);
|
|
|
|
|
camInfoA.K[0] = camInfoA.K[4] = camInfoA.K[8] = 1;
|
|
|
|
|
camInfoA.R.assign(0);
|
|
|
|
|
camInfoA.R[0] = camInfoA.R[4] = camInfoA.R[8] = 1;
|
|
|
|
|
camInfoA.P.assign(0);
|
|
|
|
|
camInfoA.P[10] = 1;
|
|
|
|
|
|
|
|
|
|
camInfoA.header.frame_id = cameraFrameId;
|
|
|
|
|
camInfoA.header.stamp = time;
|
|
|
|
|
|
|
|
|
|
camInfoB = camInfoA;
|
|
|
|
|
|
|
|
|
|
int type = -1;
|
2015-05-30 20:08:20 -04:00
|
|
|
if(!odom.data().depthRaw().empty() && (odom.data().depthRaw().type() == CV_32FC1 || odom.data().depthRaw().type() == CV_16UC1))
|
2014-11-02 01:04:49 +00:00
|
|
|
{
|
2015-05-30 20:08:20 -04:00
|
|
|
if(odom.data().cameraModels().size() > 1)
|
|
|
|
|
{
|
|
|
|
|
ROS_WARN("Multi-cameras detected in database but this node cannot send multi-images yet...");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//depth
|
|
|
|
|
if(odom.data().cameraModels().size())
|
|
|
|
|
{
|
|
|
|
|
camInfoA.D.resize(5,0);
|
2014-11-02 01:04:49 +00:00
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
camInfoA.P[0] = odom.data().cameraModels()[0].fx();
|
|
|
|
|
camInfoA.K[0] = odom.data().cameraModels()[0].fx();
|
|
|
|
|
camInfoA.P[5] = odom.data().cameraModels()[0].fy();
|
|
|
|
|
camInfoA.K[4] = odom.data().cameraModels()[0].fy();
|
|
|
|
|
camInfoA.P[2] = odom.data().cameraModels()[0].cx();
|
|
|
|
|
camInfoA.K[2] = odom.data().cameraModels()[0].cx();
|
|
|
|
|
camInfoA.P[6] = odom.data().cameraModels()[0].cy();
|
|
|
|
|
camInfoA.K[5] = odom.data().cameraModels()[0].cy();
|
2014-11-02 01:04:49 +00:00
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
camInfoB = camInfoA;
|
|
|
|
|
}
|
2014-11-02 01:04:49 +00:00
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
type=0;
|
2014-11-02 01:04:49 +00:00
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
if(rgbPub.getTopic().empty()) rgbPub = it.advertise("rgb/image", 1);
|
|
|
|
|
if(depthPub.getTopic().empty()) depthPub = it.advertise("depth_registered/image", 1);
|
|
|
|
|
if(rgbCamInfoPub.getTopic().empty()) rgbCamInfoPub = nh.advertise<sensor_msgs::CameraInfo>("rgb/camera_info", 1);
|
|
|
|
|
if(depthCamInfoPub.getTopic().empty()) depthCamInfoPub = nh.advertise<sensor_msgs::CameraInfo>("depth_registered/camera_info", 1);
|
|
|
|
|
}
|
2014-11-02 01:04:49 +00:00
|
|
|
}
|
2015-05-30 20:08:20 -04:00
|
|
|
else if(!odom.data().rightRaw().empty() && odom.data().rightRaw().type() == CV_8U)
|
2014-11-02 01:04:49 +00:00
|
|
|
{
|
|
|
|
|
//stereo
|
2015-05-30 20:08:20 -04:00
|
|
|
if(odom.data().stereoCameraModel().isValid())
|
|
|
|
|
{
|
|
|
|
|
camInfoA.D.resize(8,0);
|
2014-11-02 01:04:49 +00:00
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
camInfoA.P[0] = odom.data().stereoCameraModel().left().fx();
|
|
|
|
|
camInfoA.K[0] = odom.data().stereoCameraModel().left().fx();
|
|
|
|
|
camInfoA.P[5] = odom.data().stereoCameraModel().left().fy();
|
|
|
|
|
camInfoA.K[4] = odom.data().stereoCameraModel().left().fy();
|
|
|
|
|
camInfoA.P[2] = odom.data().stereoCameraModel().left().cx();
|
|
|
|
|
camInfoA.K[2] = odom.data().stereoCameraModel().left().cx();
|
|
|
|
|
camInfoA.P[6] = odom.data().stereoCameraModel().left().cy();
|
|
|
|
|
camInfoA.K[5] = odom.data().stereoCameraModel().left().cy();
|
2014-11-02 01:04:49 +00:00
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
camInfoB = camInfoA;
|
|
|
|
|
camInfoB.P[3] = odom.data().stereoCameraModel().right().Tx(); // Right_Tx = -baseline*fx
|
|
|
|
|
}
|
2014-11-02 01:04:49 +00:00
|
|
|
|
|
|
|
|
type=1;
|
|
|
|
|
|
|
|
|
|
if(leftPub.getTopic().empty()) leftPub = it.advertise("left/image", 1);
|
|
|
|
|
if(rightPub.getTopic().empty()) rightPub = it.advertise("right/image", 1);
|
|
|
|
|
if(leftCamInfoPub.getTopic().empty()) leftCamInfoPub = nh.advertise<sensor_msgs::CameraInfo>("left/camera_info", 1);
|
|
|
|
|
if(rightCamInfoPub.getTopic().empty()) rightCamInfoPub = nh.advertise<sensor_msgs::CameraInfo>("right/camera_info", 1);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(imagePub.getTopic().empty()) imagePub = it.advertise("image", 1);
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
camInfoA.height = odom.data().imageRaw().rows;
|
|
|
|
|
camInfoA.width = odom.data().imageRaw().cols;
|
|
|
|
|
camInfoB.height = odom.data().depthOrRightRaw().rows;
|
|
|
|
|
camInfoB.width = odom.data().depthOrRightRaw().cols;
|
2014-11-02 01:04:49 +00:00
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
if(!odom.data().laserScanRaw().empty())
|
2015-01-23 11:19:19 -05:00
|
|
|
{
|
|
|
|
|
if(scanPub.getTopic().empty()) scanPub = nh.advertise<sensor_msgs::PointCloud2>("scan_cloud", 1);
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-02 01:04:49 +00:00
|
|
|
// publish transforms first
|
|
|
|
|
if(publishTf)
|
|
|
|
|
{
|
|
|
|
|
ros::Time tfExpiration = time + ros::Duration(1.0/rate);
|
2015-05-30 20:08:20 -04:00
|
|
|
|
|
|
|
|
rtabmap::Transform localTransform;
|
|
|
|
|
if(odom.data().cameraModels().size() == 1)
|
|
|
|
|
{
|
|
|
|
|
localTransform = odom.data().cameraModels()[0].localTransform();
|
|
|
|
|
}
|
|
|
|
|
else if(odom.data().stereoCameraModel().isValid())
|
|
|
|
|
{
|
|
|
|
|
localTransform = odom.data().stereoCameraModel().left().localTransform();
|
|
|
|
|
}
|
|
|
|
|
if(!localTransform.isNull())
|
2014-11-02 01:04:49 +00:00
|
|
|
{
|
2015-05-14 00:42:21 -04:00
|
|
|
geometry_msgs::TransformStamped baseToCamera;
|
|
|
|
|
baseToCamera.child_frame_id = cameraFrameId;
|
|
|
|
|
baseToCamera.header.frame_id = frameId;
|
|
|
|
|
baseToCamera.header.stamp = tfExpiration;
|
2015-05-30 20:08:20 -04:00
|
|
|
rtabmap_ros::transformToGeometryMsg(localTransform, baseToCamera.transform);
|
2015-05-14 00:42:21 -04:00
|
|
|
tfBroadcaster.sendTransform(baseToCamera);
|
2014-11-02 01:04:49 +00:00
|
|
|
}
|
|
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
if(!odom.pose().isNull())
|
2014-11-02 01:04:49 +00:00
|
|
|
{
|
2015-05-14 00:42:21 -04:00
|
|
|
geometry_msgs::TransformStamped odomToBase;
|
|
|
|
|
odomToBase.child_frame_id = frameId;
|
|
|
|
|
odomToBase.header.frame_id = odomFrameId;
|
|
|
|
|
odomToBase.header.stamp = tfExpiration;
|
2015-05-30 20:08:20 -04:00
|
|
|
rtabmap_ros::transformToGeometryMsg(odom.pose(), odomToBase.transform);
|
2015-05-14 00:42:21 -04:00
|
|
|
tfBroadcaster.sendTransform(odomToBase);
|
2014-11-02 01:04:49 +00:00
|
|
|
}
|
|
|
|
|
}
|
2015-05-30 20:08:20 -04:00
|
|
|
if(!odom.pose().isNull())
|
2014-11-02 01:04:49 +00:00
|
|
|
{
|
|
|
|
|
if(odometryPub.getTopic().empty()) odometryPub = nh.advertise<nav_msgs::Odometry>("odom", 1);
|
|
|
|
|
|
|
|
|
|
if(odometryPub.getNumSubscribers())
|
|
|
|
|
{
|
2015-05-30 20:08:20 -04:00
|
|
|
nav_msgs::Odometry odomMsg;
|
|
|
|
|
odomMsg.child_frame_id = frameId;
|
|
|
|
|
odomMsg.header.frame_id = odomFrameId;
|
|
|
|
|
odomMsg.header.stamp = time;
|
|
|
|
|
rtabmap_ros::transformToPoseMsg(odom.pose(), odomMsg.pose.pose);
|
|
|
|
|
UASSERT(odomMsg.pose.covariance.size() == 36 &&
|
|
|
|
|
odom.covariance().total() == 36 &&
|
|
|
|
|
odom.covariance().type() == CV_64FC1);
|
|
|
|
|
memcpy(odomMsg.pose.covariance.begin(), odom.covariance().data, 36*sizeof(double));
|
|
|
|
|
odometryPub.publish(odomMsg);
|
2014-11-02 01:04:49 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(type >= 0)
|
|
|
|
|
{
|
|
|
|
|
if(rgbCamInfoPub.getNumSubscribers() && type == 0)
|
|
|
|
|
{
|
|
|
|
|
rgbCamInfoPub.publish(camInfoA);
|
|
|
|
|
}
|
|
|
|
|
if(leftCamInfoPub.getNumSubscribers() && type == 1)
|
|
|
|
|
{
|
|
|
|
|
leftCamInfoPub.publish(camInfoA);
|
|
|
|
|
}
|
|
|
|
|
if(depthCamInfoPub.getNumSubscribers() && type == 0)
|
|
|
|
|
{
|
|
|
|
|
depthCamInfoPub.publish(camInfoB);
|
|
|
|
|
}
|
|
|
|
|
if(rightCamInfoPub.getNumSubscribers() && type == 1)
|
|
|
|
|
{
|
|
|
|
|
rightCamInfoPub.publish(camInfoB);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(imagePub.getNumSubscribers() || rgbPub.getNumSubscribers() || leftPub.getNumSubscribers())
|
|
|
|
|
{
|
|
|
|
|
cv_bridge::CvImage img;
|
2015-05-30 20:08:20 -04:00
|
|
|
if(odom.data().imageRaw().channels() == 1)
|
2014-11-02 01:04:49 +00:00
|
|
|
{
|
|
|
|
|
img.encoding = sensor_msgs::image_encodings::MONO8;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
img.encoding = sensor_msgs::image_encodings::BGR8;
|
|
|
|
|
}
|
2015-05-30 20:08:20 -04:00
|
|
|
img.image = odom.data().imageRaw();
|
2014-11-02 01:04:49 +00:00
|
|
|
sensor_msgs::ImagePtr imageRosMsg = img.toImageMsg();
|
|
|
|
|
imageRosMsg->header.frame_id = cameraFrameId;
|
|
|
|
|
imageRosMsg->header.stamp = time;
|
|
|
|
|
|
|
|
|
|
if(imagePub.getNumSubscribers())
|
|
|
|
|
{
|
|
|
|
|
imagePub.publish(imageRosMsg);
|
|
|
|
|
}
|
|
|
|
|
if(rgbPub.getNumSubscribers() && type == 0)
|
|
|
|
|
{
|
|
|
|
|
rgbPub.publish(imageRosMsg);
|
|
|
|
|
}
|
|
|
|
|
if(leftPub.getNumSubscribers() && type == 1)
|
|
|
|
|
{
|
|
|
|
|
leftPub.publish(imageRosMsg);
|
|
|
|
|
leftCamInfoPub.publish(camInfoA);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
if(depthPub.getNumSubscribers() && !odom.data().depthRaw().empty() && type==0)
|
2014-11-02 01:04:49 +00:00
|
|
|
{
|
|
|
|
|
cv_bridge::CvImage img;
|
2015-05-30 20:08:20 -04:00
|
|
|
if(odom.data().depthRaw().type() == CV_32FC1)
|
2014-11-02 01:04:49 +00:00
|
|
|
{
|
|
|
|
|
img.encoding = sensor_msgs::image_encodings::TYPE_32FC1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
img.encoding = sensor_msgs::image_encodings::TYPE_16UC1;
|
|
|
|
|
}
|
2015-05-30 20:08:20 -04:00
|
|
|
img.image = odom.data().depthRaw();
|
2014-11-02 01:04:49 +00:00
|
|
|
sensor_msgs::ImagePtr imageRosMsg = img.toImageMsg();
|
|
|
|
|
imageRosMsg->header.frame_id = cameraFrameId;
|
|
|
|
|
imageRosMsg->header.stamp = time;
|
|
|
|
|
|
|
|
|
|
depthPub.publish(imageRosMsg);
|
|
|
|
|
depthCamInfoPub.publish(camInfoB);
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
if(rightPub.getNumSubscribers() && !odom.data().rightRaw().empty() && type==1)
|
2014-11-02 01:04:49 +00:00
|
|
|
{
|
|
|
|
|
cv_bridge::CvImage img;
|
|
|
|
|
img.encoding = sensor_msgs::image_encodings::MONO8;
|
2015-05-30 20:08:20 -04:00
|
|
|
img.image = odom.data().rightRaw();
|
2014-11-02 01:04:49 +00:00
|
|
|
sensor_msgs::ImagePtr imageRosMsg = img.toImageMsg();
|
|
|
|
|
imageRosMsg->header.frame_id = cameraFrameId;
|
|
|
|
|
imageRosMsg->header.stamp = time;
|
|
|
|
|
|
|
|
|
|
rightPub.publish(imageRosMsg);
|
|
|
|
|
rightCamInfoPub.publish(camInfoB);
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
if(scanPub.getNumSubscribers() && !odom.data().laserScanRaw().empty())
|
2015-01-23 11:19:19 -05:00
|
|
|
{
|
2015-05-30 20:08:20 -04:00
|
|
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = rtabmap::util3d::laserScanToPointCloud(odom.data().laserScanRaw());
|
2015-01-23 11:19:19 -05:00
|
|
|
sensor_msgs::PointCloud2 msg;
|
|
|
|
|
pcl::toROSMsg(*cloud, msg);
|
|
|
|
|
msg.header.frame_id = frameId;
|
|
|
|
|
msg.header.stamp = time;
|
|
|
|
|
scanPub.publish(msg);
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-02 01:04:49 +00:00
|
|
|
ros::spinOnce();
|
|
|
|
|
|
|
|
|
|
while(ros::ok() && paused)
|
|
|
|
|
{
|
|
|
|
|
uSleep(100);
|
|
|
|
|
ros::spinOnce();
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-30 20:08:20 -04:00
|
|
|
odom = reader.getNextData();
|
2014-11-02 01:04:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|