Susanne Pielawa 2018-01-11 13:11:27 +01:00 committed by Wally B. Feed
parent 35bea72536
commit 960d1a487c
15 changed files with 80 additions and 7 deletions

View File

@ -52,6 +52,7 @@ cartographer_ros_msgs::SensorTopics DefaultSensorTopics() {
topics.point_cloud2_topic = kPointCloud2Topic; topics.point_cloud2_topic = kPointCloud2Topic;
topics.imu_topic = kImuTopic; topics.imu_topic = kImuTopic;
topics.odometry_topic = kOdometryTopic; topics.odometry_topic = kOdometryTopic;
topics.nav_sat_fix_topic = kNavSatFixTopic;
return topics; return topics;
} }
@ -159,9 +160,9 @@ void Node::AddSensorSamplers(const int trajectory_id,
CHECK(sensor_samplers_.count(trajectory_id) == 0); CHECK(sensor_samplers_.count(trajectory_id) == 0);
sensor_samplers_.emplace( sensor_samplers_.emplace(
std::piecewise_construct, std::forward_as_tuple(trajectory_id), std::piecewise_construct, std::forward_as_tuple(trajectory_id),
std::forward_as_tuple(options.rangefinder_sampling_ratio, std::forward_as_tuple(
options.odometry_sampling_ratio, options.rangefinder_sampling_ratio, options.odometry_sampling_ratio,
options.imu_sampling_ratio)); options.fixed_frame_pose_sampling_ratio, options.imu_sampling_ratio));
} }
void Node::PublishTrajectoryStates(const ::ros::WallTimerEvent& timer_event) { void Node::PublishTrajectoryStates(const ::ros::WallTimerEvent& timer_event) {
@ -284,6 +285,11 @@ std::unordered_set<std::string> Node::ComputeExpectedTopics(
if (options.use_odometry) { if (options.use_odometry) {
expected_topics.insert(topics.odometry_topic); expected_topics.insert(topics.odometry_topic);
} }
// NavSatFix is optional.
if (options.use_nav_sat) {
expected_topics.insert(topics.nav_sat_fix_topic);
}
return expected_topics; return expected_topics;
} }
@ -353,6 +359,14 @@ void Node::LaunchSubscribers(const TrajectoryOptions& options,
&node_handle_, this), &node_handle_, this),
topic}); topic});
} }
if (options.use_nav_sat) {
std::string topic = topics.nav_sat_fix_topic;
subscribers_[trajectory_id].push_back(
{SubscribeWithHandler<sensor_msgs::NavSatFix>(
&Node::HandleNavSatFixMessage, trajectory_id, topic, &node_handle_,
this),
topic});
}
} }
bool Node::ValidateTrajectoryOptions(const TrajectoryOptions& options) { bool Node::ValidateTrajectoryOptions(const TrajectoryOptions& options) {
@ -502,6 +516,17 @@ void Node::HandleOdometryMessage(const int trajectory_id,
sensor_bridge_ptr->HandleOdometryMessage(sensor_id, msg); sensor_bridge_ptr->HandleOdometryMessage(sensor_id, msg);
} }
void Node::HandleNavSatFixMessage(const int trajectory_id,
const std::string& sensor_id,
const sensor_msgs::NavSatFix::ConstPtr& msg) {
carto::common::MutexLocker lock(&mutex_);
if (!sensor_samplers_.at(trajectory_id).fixed_frame_pose_sampler.Pulse()) {
return;
}
map_builder_bridge_.sensor_bridge(trajectory_id)
->HandleNavSatFixMessage(sensor_id, msg);
}
void Node::HandleImuMessage(const int trajectory_id, void Node::HandleImuMessage(const int trajectory_id,
const std::string& sensor_id, const std::string& sensor_id,
const sensor_msgs::Imu::ConstPtr& msg) { const sensor_msgs::Imu::ConstPtr& msg) {
@ -529,7 +554,7 @@ void Node::HandleLaserScanMessage(const int trajectory_id,
} }
void Node::HandleMultiEchoLaserScanMessage( void Node::HandleMultiEchoLaserScanMessage(
int trajectory_id, const std::string& sensor_id, const int trajectory_id, const std::string& sensor_id,
const sensor_msgs::MultiEchoLaserScan::ConstPtr& msg) { const sensor_msgs::MultiEchoLaserScan::ConstPtr& msg) {
carto::common::MutexLocker lock(&mutex_); carto::common::MutexLocker lock(&mutex_);
if (!sensor_samplers_.at(trajectory_id).rangefinder_sampler.Pulse()) { if (!sensor_samplers_.at(trajectory_id).rangefinder_sampler.Pulse()) {

View File

@ -39,7 +39,13 @@
#include "cartographer_ros_msgs/SubmapQuery.h" #include "cartographer_ros_msgs/SubmapQuery.h"
#include "cartographer_ros_msgs/TrajectoryOptions.h" #include "cartographer_ros_msgs/TrajectoryOptions.h"
#include "cartographer_ros_msgs/WriteState.h" #include "cartographer_ros_msgs/WriteState.h"
#include "nav_msgs/Odometry.h"
#include "ros/ros.h" #include "ros/ros.h"
#include "sensor_msgs/Imu.h"
#include "sensor_msgs/LaserScan.h"
#include "sensor_msgs/MultiEchoLaserScan.h"
#include "sensor_msgs/NavSatFix.h"
#include "sensor_msgs/PointCloud2.h"
#include "tf2_ros/transform_broadcaster.h" #include "tf2_ros/transform_broadcaster.h"
namespace cartographer_ros { namespace cartographer_ros {
@ -79,6 +85,8 @@ class Node {
// The following functions handle adding sensor data to a trajectory. // The following functions handle adding sensor data to a trajectory.
void HandleOdometryMessage(int trajectory_id, const std::string& sensor_id, void HandleOdometryMessage(int trajectory_id, const std::string& sensor_id,
const nav_msgs::Odometry::ConstPtr& msg); const nav_msgs::Odometry::ConstPtr& msg);
void HandleNavSatFixMessage(int trajectory_id, const std::string& sensor_id,
const sensor_msgs::NavSatFix::ConstPtr& msg);
void HandleImuMessage(int trajectory_id, const std::string& sensor_id, void HandleImuMessage(int trajectory_id, const std::string& sensor_id,
const sensor_msgs::Imu::ConstPtr& msg); const sensor_msgs::Imu::ConstPtr& msg);
void HandleLaserScanMessage(int trajectory_id, const std::string& sensor_id, void HandleLaserScanMessage(int trajectory_id, const std::string& sensor_id,
@ -156,15 +164,18 @@ class Node {
::ros::Publisher scan_matched_point_cloud_publisher_; ::ros::Publisher scan_matched_point_cloud_publisher_;
struct TrajectorySensorSamplers { struct TrajectorySensorSamplers {
TrajectorySensorSamplers(double rangefinder_sampling_ratio, TrajectorySensorSamplers(const double rangefinder_sampling_ratio,
double odometry_sampling_ratio, const double odometry_sampling_ratio,
double imu_sampling_ratio) const double fixed_frame_pose_sampling_ratio,
const double imu_sampling_ratio)
: rangefinder_sampler(rangefinder_sampling_ratio), : rangefinder_sampler(rangefinder_sampling_ratio),
odometry_sampler(odometry_sampling_ratio), odometry_sampler(odometry_sampling_ratio),
fixed_frame_pose_sampler(fixed_frame_pose_sampling_ratio),
imu_sampler(imu_sampling_ratio) {} imu_sampler(imu_sampling_ratio) {}
::cartographer::common::FixedRatioSampler rangefinder_sampler; ::cartographer::common::FixedRatioSampler rangefinder_sampler;
::cartographer::common::FixedRatioSampler odometry_sampler; ::cartographer::common::FixedRatioSampler odometry_sampler;
::cartographer::common::FixedRatioSampler fixed_frame_pose_sampler;
::cartographer::common::FixedRatioSampler imu_sampler; ::cartographer::common::FixedRatioSampler imu_sampler;
}; };

View File

@ -28,6 +28,7 @@ constexpr char kMultiEchoLaserScanTopic[] = "echoes";
constexpr char kPointCloud2Topic[] = "points2"; constexpr char kPointCloud2Topic[] = "points2";
constexpr char kImuTopic[] = "imu"; constexpr char kImuTopic[] = "imu";
constexpr char kOdometryTopic[] = "odom"; constexpr char kOdometryTopic[] = "odom";
constexpr char kNavSatFixTopic[] = "fix";
constexpr char kFinishTrajectoryServiceName[] = "finish_trajectory"; constexpr char kFinishTrajectoryServiceName[] = "finish_trajectory";
constexpr char kOccupancyGridTopic[] = "map"; constexpr char kOccupancyGridTopic[] = "map";
constexpr char kScanMatchedPointCloudTopic[] = "scan_matched_points2"; constexpr char kScanMatchedPointCloudTopic[] = "scan_matched_points2";

View File

@ -177,6 +177,11 @@ void RunOfflineNode(
trajectory_id, topic, trajectory_id, topic,
delayed_msg.instantiate<nav_msgs::Odometry>()); delayed_msg.instantiate<nav_msgs::Odometry>());
} }
if (delayed_msg.isType<sensor_msgs::NavSatFix>()) {
node.HandleNavSatFixMessage(
trajectory_id, topic,
delayed_msg.instantiate<sensor_msgs::NavSatFix>());
}
clock.clock = delayed_msg.getTime(); clock.clock = delayed_msg.getTime();
clock_publisher.publish(clock); clock_publisher.publish(clock);

View File

@ -73,6 +73,11 @@ void SensorBridge::HandleOdometryMessage(
} }
} }
void SensorBridge::HandleNavSatFixMessage(
const std::string& sensor_id, const sensor_msgs::NavSatFix::ConstPtr& msg) {
LOG(FATAL) << "TODO(spielawa / wohe): NavSatFix support not yet implemented.";
}
std::unique_ptr<::cartographer::sensor::ImuData> SensorBridge::ToImuData( std::unique_ptr<::cartographer::sensor::ImuData> SensorBridge::ToImuData(
const sensor_msgs::Imu::ConstPtr& msg) { const sensor_msgs::Imu::ConstPtr& msg) {
CHECK_NE(msg->linear_acceleration_covariance[0], -1) CHECK_NE(msg->linear_acceleration_covariance[0], -1)

View File

@ -32,6 +32,7 @@
#include "sensor_msgs/Imu.h" #include "sensor_msgs/Imu.h"
#include "sensor_msgs/LaserScan.h" #include "sensor_msgs/LaserScan.h"
#include "sensor_msgs/MultiEchoLaserScan.h" #include "sensor_msgs/MultiEchoLaserScan.h"
#include "sensor_msgs/NavSatFix.h"
#include "sensor_msgs/PointCloud2.h" #include "sensor_msgs/PointCloud2.h"
namespace cartographer_ros { namespace cartographer_ros {
@ -51,6 +52,8 @@ class SensorBridge {
const nav_msgs::Odometry::ConstPtr& msg); const nav_msgs::Odometry::ConstPtr& msg);
void HandleOdometryMessage(const std::string& sensor_id, void HandleOdometryMessage(const std::string& sensor_id,
const nav_msgs::Odometry::ConstPtr& msg); const nav_msgs::Odometry::ConstPtr& msg);
void HandleNavSatFixMessage(const std::string& sensor_id,
const sensor_msgs::NavSatFix::ConstPtr& msg);
std::unique_ptr<::cartographer::sensor::ImuData> ToImuData( std::unique_ptr<::cartographer::sensor::ImuData> ToImuData(
const sensor_msgs::Imu::ConstPtr& msg); const sensor_msgs::Imu::ConstPtr& msg);
void HandleImuMessage(const std::string& sensor_id, void HandleImuMessage(const std::string& sensor_id,

View File

@ -53,6 +53,7 @@ TrajectoryOptions CreateTrajectoryOptions(
options.provide_odom_frame = options.provide_odom_frame =
lua_parameter_dictionary->GetBool("provide_odom_frame"); lua_parameter_dictionary->GetBool("provide_odom_frame");
options.use_odometry = lua_parameter_dictionary->GetBool("use_odometry"); options.use_odometry = lua_parameter_dictionary->GetBool("use_odometry");
options.use_nav_sat = lua_parameter_dictionary->GetBool("use_nav_sat");
options.num_laser_scans = options.num_laser_scans =
lua_parameter_dictionary->GetNonNegativeInt("num_laser_scans"); lua_parameter_dictionary->GetNonNegativeInt("num_laser_scans");
options.num_multi_echo_laser_scans = options.num_multi_echo_laser_scans =
@ -66,6 +67,8 @@ TrajectoryOptions CreateTrajectoryOptions(
lua_parameter_dictionary->GetDouble("rangefinder_sampling_ratio"); lua_parameter_dictionary->GetDouble("rangefinder_sampling_ratio");
options.odometry_sampling_ratio = options.odometry_sampling_ratio =
lua_parameter_dictionary->GetDouble("odometry_sampling_ratio"); lua_parameter_dictionary->GetDouble("odometry_sampling_ratio");
options.fixed_frame_pose_sampling_ratio =
lua_parameter_dictionary->GetDouble("fixed_frame_pose_sampling_ratio");
options.imu_sampling_ratio = options.imu_sampling_ratio =
lua_parameter_dictionary->GetDouble("imu_sampling_ratio"); lua_parameter_dictionary->GetDouble("imu_sampling_ratio");
CheckTrajectoryOptions(options); CheckTrajectoryOptions(options);
@ -104,6 +107,7 @@ bool FromRosMessage(const cartographer_ros_msgs::TrajectoryOptions& msg,
options->odom_frame = msg.odom_frame; options->odom_frame = msg.odom_frame;
options->provide_odom_frame = msg.provide_odom_frame; options->provide_odom_frame = msg.provide_odom_frame;
options->use_odometry = msg.use_odometry; options->use_odometry = msg.use_odometry;
options->use_nav_sat = msg.use_nav_sat;
options->num_laser_scans = msg.num_laser_scans; options->num_laser_scans = msg.num_laser_scans;
options->num_multi_echo_laser_scans = msg.num_multi_echo_laser_scans; options->num_multi_echo_laser_scans = msg.num_multi_echo_laser_scans;
options->num_subdivisions_per_laser_scan = options->num_subdivisions_per_laser_scan =
@ -111,6 +115,8 @@ bool FromRosMessage(const cartographer_ros_msgs::TrajectoryOptions& msg,
options->num_point_clouds = msg.num_point_clouds; options->num_point_clouds = msg.num_point_clouds;
options->rangefinder_sampling_ratio = msg.rangefinder_sampling_ratio; options->rangefinder_sampling_ratio = msg.rangefinder_sampling_ratio;
options->odometry_sampling_ratio = msg.odometry_sampling_ratio; options->odometry_sampling_ratio = msg.odometry_sampling_ratio;
options->fixed_frame_pose_sampling_ratio =
msg.fixed_frame_pose_sampling_ratio;
options->imu_sampling_ratio = msg.imu_sampling_ratio; options->imu_sampling_ratio = msg.imu_sampling_ratio;
if (!options->trajectory_builder_options.ParseFromString( if (!options->trajectory_builder_options.ParseFromString(
msg.trajectory_builder_options_proto)) { msg.trajectory_builder_options_proto)) {
@ -129,12 +135,14 @@ cartographer_ros_msgs::TrajectoryOptions ToRosMessage(
msg.odom_frame = options.odom_frame; msg.odom_frame = options.odom_frame;
msg.provide_odom_frame = options.provide_odom_frame; msg.provide_odom_frame = options.provide_odom_frame;
msg.use_odometry = options.use_odometry; msg.use_odometry = options.use_odometry;
msg.use_nav_sat = options.use_nav_sat;
msg.num_laser_scans = options.num_laser_scans; msg.num_laser_scans = options.num_laser_scans;
msg.num_multi_echo_laser_scans = options.num_multi_echo_laser_scans; msg.num_multi_echo_laser_scans = options.num_multi_echo_laser_scans;
msg.num_subdivisions_per_laser_scan = options.num_subdivisions_per_laser_scan; msg.num_subdivisions_per_laser_scan = options.num_subdivisions_per_laser_scan;
msg.num_point_clouds = options.num_point_clouds; msg.num_point_clouds = options.num_point_clouds;
msg.rangefinder_sampling_ratio = options.rangefinder_sampling_ratio; msg.rangefinder_sampling_ratio = options.rangefinder_sampling_ratio;
msg.odometry_sampling_ratio = options.odometry_sampling_ratio; msg.odometry_sampling_ratio = options.odometry_sampling_ratio;
msg.fixed_frame_pose_sampling_ratio = options.fixed_frame_pose_sampling_ratio;
msg.imu_sampling_ratio = options.imu_sampling_ratio; msg.imu_sampling_ratio = options.imu_sampling_ratio;
options.trajectory_builder_options.SerializeToString( options.trajectory_builder_options.SerializeToString(
&msg.trajectory_builder_options_proto); &msg.trajectory_builder_options_proto);

View File

@ -34,12 +34,14 @@ struct TrajectoryOptions {
std::string odom_frame; std::string odom_frame;
bool provide_odom_frame; bool provide_odom_frame;
bool use_odometry; bool use_odometry;
bool use_nav_sat;
int num_laser_scans; int num_laser_scans;
int num_multi_echo_laser_scans; int num_multi_echo_laser_scans;
int num_subdivisions_per_laser_scan; int num_subdivisions_per_laser_scan;
int num_point_clouds; int num_point_clouds;
double rangefinder_sampling_ratio; double rangefinder_sampling_ratio;
double odometry_sampling_ratio; double odometry_sampling_ratio;
double fixed_frame_pose_sampling_ratio;
double imu_sampling_ratio; double imu_sampling_ratio;
}; };

View File

@ -24,6 +24,7 @@ options = {
odom_frame = "odom", odom_frame = "odom",
provide_odom_frame = true, provide_odom_frame = true,
use_odometry = false, use_odometry = false,
use_nav_sat = false,
num_laser_scans = 0, num_laser_scans = 0,
num_multi_echo_laser_scans = 1, num_multi_echo_laser_scans = 1,
num_subdivisions_per_laser_scan = 10, num_subdivisions_per_laser_scan = 10,
@ -34,6 +35,7 @@ options = {
trajectory_publish_period_sec = 30e-3, trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1., rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1., odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1., imu_sampling_ratio = 1.,
} }

View File

@ -24,6 +24,7 @@ options = {
odom_frame = "odom", odom_frame = "odom",
provide_odom_frame = true, provide_odom_frame = true,
use_odometry = false, use_odometry = false,
use_nav_sat = false,
num_laser_scans = 0, num_laser_scans = 0,
num_multi_echo_laser_scans = 0, num_multi_echo_laser_scans = 0,
num_subdivisions_per_laser_scan = 1, num_subdivisions_per_laser_scan = 1,
@ -34,6 +35,7 @@ options = {
trajectory_publish_period_sec = 30e-3, trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1., rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1., odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1., imu_sampling_ratio = 1.,
} }

View File

@ -24,6 +24,7 @@ options = {
odom_frame = "odom", odom_frame = "odom",
provide_odom_frame = true, provide_odom_frame = true,
use_odometry = false, use_odometry = false,
use_nav_sat = false,
num_laser_scans = 1, num_laser_scans = 1,
num_multi_echo_laser_scans = 0, num_multi_echo_laser_scans = 0,
num_subdivisions_per_laser_scan = 1, num_subdivisions_per_laser_scan = 1,
@ -34,6 +35,7 @@ options = {
trajectory_publish_period_sec = 30e-3, trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1., rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1., odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1., imu_sampling_ratio = 1.,
} }

View File

@ -24,6 +24,7 @@ options = {
odom_frame = "odom", odom_frame = "odom",
provide_odom_frame = true, provide_odom_frame = true,
use_odometry = false, use_odometry = false,
use_nav_sat = false,
num_laser_scans = 1, num_laser_scans = 1,
num_multi_echo_laser_scans = 0, num_multi_echo_laser_scans = 0,
num_subdivisions_per_laser_scan = 1, num_subdivisions_per_laser_scan = 1,
@ -34,6 +35,7 @@ options = {
trajectory_publish_period_sec = 30e-3, trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1., rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1., odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1., imu_sampling_ratio = 1.,
} }

View File

@ -24,6 +24,7 @@ options = {
odom_frame = "odom", odom_frame = "odom",
provide_odom_frame = false, provide_odom_frame = false,
use_odometry = true, use_odometry = true,
use_nav_sat = false,
num_laser_scans = 1, num_laser_scans = 1,
num_multi_echo_laser_scans = 0, num_multi_echo_laser_scans = 0,
num_subdivisions_per_laser_scan = 1, num_subdivisions_per_laser_scan = 1,
@ -34,6 +35,7 @@ options = {
trajectory_publish_period_sec = 30e-3, trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1., rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1., odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1., imu_sampling_ratio = 1.,
} }

View File

@ -17,3 +17,4 @@ string multi_echo_laser_scan_topic
string point_cloud2_topic string point_cloud2_topic
string imu_topic string imu_topic
string odometry_topic string odometry_topic
string nav_sat_fix_topic

View File

@ -17,12 +17,14 @@ string published_frame
string odom_frame string odom_frame
bool provide_odom_frame bool provide_odom_frame
bool use_odometry bool use_odometry
bool use_nav_sat
int32 num_laser_scans int32 num_laser_scans
int32 num_multi_echo_laser_scans int32 num_multi_echo_laser_scans
int32 num_subdivisions_per_laser_scan int32 num_subdivisions_per_laser_scan
int32 num_point_clouds int32 num_point_clouds
float64 rangefinder_sampling_ratio float64 rangefinder_sampling_ratio
float64 odometry_sampling_ratio float64 odometry_sampling_ratio
float64 fixed_frame_pose_sampling_ratio
float64 imu_sampling_ratio float64 imu_sampling_ratio
# This is a binary-encoded # This is a binary-encoded