From e615b3160a71ab6a0f00cfbec109830f36125cc8 Mon Sep 17 00:00:00 2001 From: iche033 Date: Thu, 14 May 2020 13:46:27 -0700 Subject: [PATCH] Reduce //pose topic bandwidth (#402) * check topic heartbeat and log /X*/pose topics * use pose_v and subt to pose_static * cleanup * Rename parameters * move heartbeat check into its own thread Co-authored-by: Nate Koenig --- ign_migration_scripts/launch/preview.ign | 6 +++ .../scripts/spawn_preview_model.py | 3 ++ .../launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- .../launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 10 +++- .../launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- .../launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- .../launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- .../ssci_x2_sensor_config_1/launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- .../ssci_x4_sensor_config_1/launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- .../ssci_x4_sensor_config_2/launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- .../x1_sensor_config_6/launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- .../x2_sensor_config_7/launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- .../x3_sensor_config_5/launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- .../x4_sensor_config_6/launch/spawner.rb | 3 ++ .../launch/vehicle_topics.launch | 9 +++- subt_ign/launch/cave_circuit.ign | 12 +++++ subt_ign/launch/cloudsim_sim.ign | 12 +++++ subt_ign/launch/competition.ign | 12 +++++ subt_ign/launch/competition_no_ros.ign | 12 +++++ subt_ign/launch/tunnel_circuit_practice.ign | 12 +++++ subt_ign/launch/urban_circuit.ign | 12 +++++ subt_ign/launch/validate_connections.ign | 3 ++ subt_ign/launch/virtual_stix.ign | 12 +++++ subt_ign/launch/virtual_stix_headless.ign | 12 +++++ subt_ign/test/test.ign | 12 +++++ subt_ros/launch/vehicle_topics.launch | 9 +++- subt_ros/src/BridgeLogger.cc | 51 +++++++++++++++++++ subt_ros/src/pose_tf_broadcaster.cpp | 21 ++++++-- 39 files changed, 327 insertions(+), 19 deletions(-) diff --git a/ign_migration_scripts/launch/preview.ign b/ign_migration_scripts/launch/preview.ign index 56ac8797..e0c13ca0 100644 --- a/ign_migration_scripts/launch/preview.ign +++ b/ign_migration_scripts/launch/preview.ign @@ -210,6 +210,9 @@ false false #{$enableGroundTruth} + true + true + 1 @@ -256,6 +259,9 @@ false false #{$enableGroundTruth} + true + true + 1 diff --git a/ign_migration_scripts/scripts/spawn_preview_model.py b/ign_migration_scripts/scripts/spawn_preview_model.py index 7d8eebfc..5d64a928 100755 --- a/ign_migration_scripts/scripts/spawn_preview_model.py +++ b/ign_migration_scripts/scripts/spawn_preview_model.py @@ -74,6 +74,9 @@ def spawn_preview_model(args): etree.SubElement(plugin, 'publish_collision_pose').text = 'false' etree.SubElement(plugin, 'publish_visual_pose').text = 'false' etree.SubElement(plugin, 'publish_nested_model_pose').text = 'true' + etree.SubElement(plugin, 'use_pose_vector_msg').text = 'true' + etree.SubElement(plugin, 'static_publisher').text = 'true' + etree.SubElement(plugin, 'static_update_frequency').text = '1' sdf_esc = etree.tostring(sdf, encoding="unicode", with_tail=False).replace('"', r'\"').replace('\n', '') diff --git a/submitted_models/costar_husky_sensor_config_1/launch/spawner.rb b/submitted_models/costar_husky_sensor_config_1/launch/spawner.rb index 0b481bc2..ca4c1fec 100644 --- a/submitted_models/costar_husky_sensor_config_1/launch/spawner.rb +++ b/submitted_models/costar_husky_sensor_config_1/launch/spawner.rb @@ -30,6 +30,9 @@ def spawner(_name, _modelURI, _worldName, _x, _y, _z, _roll, _pitch, _yaw) false false #{$enableGroundTruth} + true + true + 1 + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false false #{$enableGroundTruth} + true + true + 1 + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> - + + + false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false false #{$enableGroundTruth} + true + true + 1 + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false false #{$enableGroundTruth} + true + true + 1 diff --git a/submitted_models/sophisticated_engineering_x4_sensor_config_1/launch/vehicle_topics.launch b/submitted_models/sophisticated_engineering_x4_sensor_config_1/launch/vehicle_topics.launch index ad1c2784..fe30a5eb 100644 --- a/submitted_models/sophisticated_engineering_x4_sensor_config_1/launch/vehicle_topics.launch +++ b/submitted_models/sophisticated_engineering_x4_sensor_config_1/launch/vehicle_topics.launch @@ -18,9 +18,16 @@ pkg="ros_ign_bridge" type="parameter_bridge" name="ros_ign_bridge_pose" - args="/model/$(arg name)/pose@geometry_msgs/TransformStamped[ignition.msgs.Pose"> + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false false #{$enableGroundTruth} + true + true + 1 + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false false #{$enableGroundTruth} + true + true + 1 diff --git a/submitted_models/ssci_x4_sensor_config_1/launch/vehicle_topics.launch b/submitted_models/ssci_x4_sensor_config_1/launch/vehicle_topics.launch index 25758838..9e82ad3f 100755 --- a/submitted_models/ssci_x4_sensor_config_1/launch/vehicle_topics.launch +++ b/submitted_models/ssci_x4_sensor_config_1/launch/vehicle_topics.launch @@ -34,9 +34,16 @@ pkg="ros_ign_bridge" type="parameter_bridge" name="ros_ign_bridge_pose" - args="/model/$(arg name)/pose@geometry_msgs/TransformStamped[ignition.msgs.Pose"> + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false false #{$enableGroundTruth} + true + true + 1 diff --git a/submitted_models/ssci_x4_sensor_config_2/launch/vehicle_topics.launch b/submitted_models/ssci_x4_sensor_config_2/launch/vehicle_topics.launch index 04651d28..a59e43f0 100755 --- a/submitted_models/ssci_x4_sensor_config_2/launch/vehicle_topics.launch +++ b/submitted_models/ssci_x4_sensor_config_2/launch/vehicle_topics.launch @@ -34,9 +34,16 @@ pkg="ros_ign_bridge" type="parameter_bridge" name="ros_ign_bridge_pose" - args="/model/$(arg name)/pose@geometry_msgs/TransformStamped[ignition.msgs.Pose"> + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false false #{$enableGroundTruth} + true + true + 1 + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false false #{$enableGroundTruth} + true + true + 1 + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false false #{$enableGroundTruth} + true + true + 1 diff --git a/submitted_models/x3_sensor_config_5/launch/vehicle_topics.launch b/submitted_models/x3_sensor_config_5/launch/vehicle_topics.launch index 69dd96fc..e8fda481 100644 --- a/submitted_models/x3_sensor_config_5/launch/vehicle_topics.launch +++ b/submitted_models/x3_sensor_config_5/launch/vehicle_topics.launch @@ -24,9 +24,16 @@ pkg="ros_ign_bridge" type="parameter_bridge" name="ros_ign_bridge_pose" - args="/model/$(arg name)/pose@geometry_msgs/TransformStamped[ignition.msgs.Pose"> + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false false #{$enableGroundTruth} + true + true + 1 diff --git a/submitted_models/x4_sensor_config_6/launch/vehicle_topics.launch b/submitted_models/x4_sensor_config_6/launch/vehicle_topics.launch index 69dd96fc..e8fda481 100644 --- a/submitted_models/x4_sensor_config_6/launch/vehicle_topics.launch +++ b/submitted_models/x4_sensor_config_6/launch/vehicle_topics.launch @@ -24,9 +24,16 @@ pkg="ros_ign_bridge" type="parameter_bridge" name="ros_ign_bridge_pose" - args="/model/$(arg name)/pose@geometry_msgs/TransformStamped[ignition.msgs.Pose"> + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ @@ -829,6 +838,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ diff --git a/subt_ign/launch/cloudsim_sim.ign b/subt_ign/launch/cloudsim_sim.ign index 95e6faba..4c45e4bb 100644 --- a/subt_ign/launch/cloudsim_sim.ign +++ b/subt_ign/launch/cloudsim_sim.ign @@ -553,6 +553,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ @@ -835,6 +844,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ diff --git a/subt_ign/launch/competition.ign b/subt_ign/launch/competition.ign index 90fd87dc..c9ed0698 100644 --- a/subt_ign/launch/competition.ign +++ b/subt_ign/launch/competition.ign @@ -432,6 +432,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ @@ -744,6 +753,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ diff --git a/subt_ign/launch/competition_no_ros.ign b/subt_ign/launch/competition_no_ros.ign index f829fe12..66f02656 100644 --- a/subt_ign/launch/competition_no_ros.ign +++ b/subt_ign/launch/competition_no_ros.ign @@ -431,6 +431,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ @@ -725,6 +734,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ diff --git a/subt_ign/launch/tunnel_circuit_practice.ign b/subt_ign/launch/tunnel_circuit_practice.ign index e1779cce..ff687404 100644 --- a/subt_ign/launch/tunnel_circuit_practice.ign +++ b/subt_ign/launch/tunnel_circuit_practice.ign @@ -424,6 +424,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ @@ -736,6 +745,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ diff --git a/subt_ign/launch/urban_circuit.ign b/subt_ign/launch/urban_circuit.ign index e9afb7d4..3b521d2d 100644 --- a/subt_ign/launch/urban_circuit.ign +++ b/subt_ign/launch/urban_circuit.ign @@ -448,6 +448,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ @@ -790,6 +799,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ diff --git a/subt_ign/launch/validate_connections.ign b/subt_ign/launch/validate_connections.ign index 4befbf4a..d0ed7fbe 100644 --- a/subt_ign/launch/validate_connections.ign +++ b/subt_ign/launch/validate_connections.ign @@ -385,6 +385,9 @@ ign service -s /connection/prev \ false false true + true + true + 1 diff --git a/subt_ign/launch/virtual_stix.ign b/subt_ign/launch/virtual_stix.ign index 9e692d1b..ffb03255 100644 --- a/subt_ign/launch/virtual_stix.ign +++ b/subt_ign/launch/virtual_stix.ign @@ -394,6 +394,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ @@ -706,6 +715,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ diff --git a/subt_ign/launch/virtual_stix_headless.ign b/subt_ign/launch/virtual_stix_headless.ign index 21ef5ac9..d831873c 100644 --- a/subt_ign/launch/virtual_stix_headless.ign +++ b/subt_ign/launch/virtual_stix_headless.ign @@ -306,6 +306,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ @@ -618,6 +627,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ diff --git a/subt_ign/test/test.ign b/subt_ign/test/test.ign index fcbdd917..d814e78f 100644 --- a/subt_ign/test/test.ign +++ b/subt_ign/test/test.ign @@ -325,6 +325,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ @@ -565,6 +574,9 @@ " false\n"\ " false\n"\ " #{$enableGroundTruth}\n"\ + " true\n"\ + " true\n"\ + " 1\n"\ " \n"\ " \n"\ diff --git a/subt_ros/launch/vehicle_topics.launch b/subt_ros/launch/vehicle_topics.launch index 81c59326..8e76f2f8 100644 --- a/subt_ros/launch/vehicle_topics.launch +++ b/subt_ros/launch/vehicle_topics.launch @@ -23,9 +23,16 @@ pkg="ros_ign_bridge" type="parameter_bridge" name="ros_ign_bridge_pose" - args="/model/$(arg name)/pose@geometry_msgs/TransformStamped[ignition.msgs.Pose"> + args="/model/$(arg name)/pose@tf2_msgs/TFMessage[ignition.msgs.Pose_V"> + + + #include +#include #include #include #include @@ -51,6 +52,9 @@ class BridgeLogger private: void OnSensorMsg(const topic_tools::ShapeShifter::ConstPtr &_msg, const std::string &_topic); + /// \brief Check heartbeat for all topics monitored + private: void CheckHeartbeat(); + /// \brief ROS node handler. private: ros::NodeHandle n; @@ -69,6 +73,14 @@ class BridgeLogger /// \brief Timer that triggers the update function. private: ros::Timer updateTimer; + + /// \brief A map of topic names and time when their last heartbeat was + /// received. + private: std::map> topicTimestamp; + + /// \brief Check heartbeat in separate thread + private: std::thread heartbeatThread; }; ///////////////////////////////////////////////// @@ -79,6 +91,8 @@ BridgeLogger::BridgeLogger() this->updateTimer = this->n.createTimer(ros::Duration(10.0), &BridgeLogger::Update, this); + + this->heartbeatThread = std::thread(&BridgeLogger::CheckHeartbeat, this); } ///////////////////////////////////////////////// @@ -211,6 +225,9 @@ void BridgeLogger::OnSensorMsg(const topic_tools::ShapeShifter::ConstPtr &_msg, return; } + // log msg time received in wall clock time + this->topicTimestamp[_topic] = systemTime; + // Check if a message was missed. if (this->prevSeq[_topic] + 1 != seq && this->prevSeq[_topic] >= 0) this->streams[_topic] << "***Error: Missed message(s) ***\n"; @@ -225,6 +242,40 @@ void BridgeLogger::OnSensorMsg(const topic_tools::ShapeShifter::ConstPtr &_msg, this->prevSeq[_topic] = seq; } +///////////////////////////////////////////////// +void BridgeLogger::CheckHeartbeat() +{ + // check heartbeat + using namespace std::chrono_literals; + double heartbeatCheckPeriod = 5.0; + while (ros::ok) + { + std::this_thread::sleep_for(5s); + auto systemTime = std::chrono::steady_clock::now(); + { + std::lock_guard lock(this->mutex); + // check topic heartbeat + for (auto &tIt : this->streams) + { + std::string topic = tIt.first; + auto it = this->topicTimestamp.find(topic); + if (it != this->topicTimestamp.end()) + { + auto d = systemTime - it->second; + auto seconds = + std::chrono::duration_cast(d).count() / + 1000.0; + if (seconds > heartbeatCheckPeriod) + { + this->streams[topic] << "***Error: No messages received for more " + << "than 5 seconds ***\n"; + } + } + } + } + } +} + ///////////////////////////////////////////////// int main(int argc, char** argv) { diff --git a/subt_ros/src/pose_tf_broadcaster.cpp b/subt_ros/src/pose_tf_broadcaster.cpp index 6833bd04..c5242309 100644 --- a/subt_ros/src/pose_tf_broadcaster.cpp +++ b/subt_ros/src/pose_tf_broadcaster.cpp @@ -13,8 +13,6 @@ // limitations under the License. #include -#include -#include // include ROS 1 #ifdef __clang__ @@ -27,21 +25,34 @@ #endif #include -#include +#include +#include +#include -void poseCallback(const geometry_msgs::TransformStamped& msg) +void poseCallback(const tf2_msgs::TFMessage &_msg) { static tf2_ros::TransformBroadcaster br; - br.sendTransform(msg); + br.sendTransform(_msg.transforms); +} + +void poseStaticCallback(const tf2_msgs::TFMessage &_msg) +{ + static tf2_ros::StaticTransformBroadcaster brStatic; + brStatic.sendTransform(_msg.transforms); } ////////////////////////////////////////////////// int main(int argc, char * argv[]) { ros::init(argc, argv, "pose_tf_broadcaster"); + ros::NodeHandle node; ros::Subscriber sub = node.subscribe("pose", 10, &poseCallback); + ros::Subscriber subStatic = node.subscribe( + "pose_static", 10, &poseStaticCallback); + ros::spin(); + return 0; }