diff --git a/cfg/TiagoNavClient.cfg b/cfg/TiagoNavClient.cfg index cc49d7b81a0f6a7a23e39fe1f7447f5dc4ee0a50..2636b87254a9fab9879e795e95fa16dd05ee91c0 100755 --- a/cfg/TiagoNavClient.cfg +++ b/cfg/TiagoNavClient.cfg @@ -64,6 +64,7 @@ move_base.add("start_pose_nav", bool_t, 0, " move_base.add("start_position_nav",bool_t, 0, "Start navigating towards a position", False) move_base.add("start_orientation_nav",bool_t, 0, "Start navigating towards a orientation", False) move_base.add("stop_nav", bool_t, 0, "Stop the current navigation", False) +move_base.add("print_goal_distance",bool_t, 0, "Print distance to goal", False) poi.add("start_poi", bool_t, 0, "Start the POI navigation", False) poi.add("stop_poi", bool_t, 0, "Stop the POI navigation", False) diff --git a/include/tiago_nav_module/tiago_nav_bt_module.h b/include/tiago_nav_module/tiago_nav_bt_module.h index 376343aec6823b833599d3fadd0b2fe842e1961b..6eca5824cf2b14b6d05c92623741419760a59452 100644 --- a/include/tiago_nav_module/tiago_nav_bt_module.h +++ b/include/tiago_nav_module/tiago_nav_bt_module.h @@ -558,6 +558,24 @@ class CTiagoNavModuleBT */ BT::NodeStatus get_tiago_nav_current_pose(BT::TreeNode& self); + /** + * \brief Synchronized getGoalDistance TIAGo nav function. + * + * This function calls getGoalDistance of tiago_nav_module. + * + * It has the following output ports: + * + * distance (double): current distance to goal. + * + * \param self Self node with the required ports: + * + * \return a BT:NodeStatus indicating whether the request has been + * successfull (BT:NodeStatus::SUCCESS) or not (BT:NodeStatus::FAILURE). + * If inputs are missing or incorrect it also returns BT:NodeStatus::FAILURE. + * + */ + BT::NodeStatus get_tiago_nav_goal_distance(BT::TreeNode& self); + /** * \brief Synchronized stop TIAGo nav function. * diff --git a/include/tiago_nav_module/tiago_nav_module.h b/include/tiago_nav_module/tiago_nav_module.h index 214a7e181aec81c6a92dfa95cdb9817ea34c64fe..8f213e28300a61a47784775f34c612db5a4d80c1 100644 --- a/include/tiago_nav_module/tiago_nav_module.h +++ b/include/tiago_nav_module/tiago_nav_module.h @@ -9,9 +9,11 @@ #include <iri_ros_tools/watchdog.h> #include <iri_ros_tools/timeout.h> #include <iostream> +#include <limits> // ROS headers #include <nav_msgs/Odometry.h> +#include <nav_msgs/Path.h> #include <tf/transform_listener.h> #include <move_base_msgs/MoveBaseAction.h> #include <std_srvs/Empty.h> @@ -204,6 +206,29 @@ class CTiagoNavModule : public CModule<tiago_nav_module::TiagoNavModuleConfig> * */ void odom_callback(const nav_msgs::Odometry::ConstPtr& msg); + + /** + * \brief + * + */ + ros::Subscriber path_subscriber; + /** + * \brief + * + */ + void path_callback(const nav_msgs::Path::ConstPtr& msg); + + /** + * \brief + * + */ + nav_msgs::Path path_msg; + + /** + * \brief + * + */ + bool path_available; /** * \brief * @@ -653,6 +678,12 @@ class CTiagoNavModule : public CModule<tiago_nav_module::TiagoNavModuleConfig> bool set_parameter(const std::string &name_space,const std::string &name,double value); geometry_msgs::Pose getCurrentPose(void); + /** + * \brief Function to get the euclidian distance to the goal. + * + * \return The Euclidian distance to the goal. -1.0 when not calculated. + */ + double getGoalDistance(void); /** * \brief Destructor diff --git a/launch/ivo_nav_bt_client.launch b/launch/ivo_nav_bt_client.launch index 8234d51896feed6e931d71a0027c4f1b79cee6a7..480be466d531081e42475e78cfb17fe5c12ffda2 100644 --- a/launch/ivo_nav_bt_client.launch +++ b/launch/ivo_nav_bt_client.launch @@ -8,6 +8,7 @@ <arg name="move_poi_action" default="/poi_navigation_server/go_to_poi"/> <arg name="move_waypoint_action" default="/pal_waypoint/navigate"/> <arg name="odom_topic" default="/mobile_base_controller/odom"/> + <arg name="path_topic" default="/move_base/GlobalPlanner/plan"/> <arg name="clear_costmaps_service" default="/move_base/clear_costmaps"/> <arg name="change_map_service" default="/pal_map_manager/change_map"/> <arg name="set_op_mode_service" default="/pal_navigation_sm"/> @@ -26,6 +27,7 @@ <arg name="move_poi_action" value="$(arg move_poi_action)"/> <arg name="move_waypoint_action" value="$(arg move_waypoint_action)"/> <arg name="odom_topic" value="$(arg odom_topic)"/> + <arg name="path_topic" value="$(arg path_topic)"/> <arg name="clear_costmaps_service" value="$(arg clear_costmaps_service)"/> <arg name="change_map_service" value="$(arg change_map_service)"/> <arg name="set_op_mode_service" value="$(arg set_op_mode_service)"/> diff --git a/launch/ivo_nav_bt_client_sim.launch b/launch/ivo_nav_bt_client_sim.launch index 6dfa75e0e0dcdd4ba125c5efa238507ac0e3fb97..ba18392e8ae0439ace8cb0b5969e49f4dfef020a 100644 --- a/launch/ivo_nav_bt_client_sim.launch +++ b/launch/ivo_nav_bt_client_sim.launch @@ -8,6 +8,7 @@ <arg name="move_poi_action" default="/poi_navigation_server/go_to_poi"/> <arg name="move_waypoint_action" default="/pal_waypoint/navigate"/> <arg name="odom_topic" default="/mobile_base_controller/odom"/> + <arg name="path_topic" default="/move_base/GlobalPlanner/plan"/> <arg name="clear_costmaps_service" default="/move_base/clear_costmaps"/> <arg name="change_map_service" default="/pal_map_manager/change_map"/> <arg name="set_op_mode_service" default="/pal_navigation_sm"/> @@ -31,6 +32,7 @@ <arg name="move_poi_action" value="$(arg move_poi_action)"/> <arg name="move_waypoint_action" value="$(arg move_waypoint_action)"/> <arg name="odom_topic" value="$(arg odom_topic)"/> + <arg name="path_topic" value="$(arg path_topic)"/> <arg name="clear_costmaps_service" value="$(arg clear_costmaps_service)"/> <arg name="change_map_service" value="$(arg change_map_service)"/> <arg name="set_op_mode_service" value="$(arg set_op_mode_service)"/> diff --git a/launch/ivo_nav_client.launch b/launch/ivo_nav_client.launch index 32acbb0273355eb6ad0185e3ef79528b07994f0e..c06285f5fe0107a605b04241be056ba5944ddcf5 100644 --- a/launch/ivo_nav_client.launch +++ b/launch/ivo_nav_client.launch @@ -8,6 +8,7 @@ <arg name="move_poi_action" default="/poi_navigation_server/go_to_poi"/> <arg name="move_waypoint_action" default="/pal_waypoint/navigate"/> <arg name="odom_topic" default="/mobile_base_controller/odom"/> + <arg name="path_topic" default="/move_base/GlobalPlanner/plan"/> <arg name="clear_costmaps_service" default="/move_base/clear_costmaps"/> <arg name="change_map_service" default="/pal_map_manager/change_map"/> <arg name="set_op_mode_service" default="/pal_navigation_sm"/> @@ -22,6 +23,7 @@ <arg name="move_poi_action" value="$(arg move_poi_action)"/> <arg name="move_waypoint_action" value="$(arg move_waypoint_action)"/> <arg name="odom_topic" value="$(arg odom_topic)"/> + <arg name="path_topic" value="$(arg path_topic)"/> <arg name="clear_costmaps_service" value="$(arg clear_costmaps_service)"/> <arg name="change_map_service" value="$(arg change_map_service)"/> <arg name="set_op_mode_service" value="$(arg set_op_mode_service)"/> diff --git a/launch/ivo_nav_client_sim.launch b/launch/ivo_nav_client_sim.launch index 69bb18e8456fff165e098820942212bcdb210afb..40da268f0f318c66112d6b0c071d82968576dcc4 100644 --- a/launch/ivo_nav_client_sim.launch +++ b/launch/ivo_nav_client_sim.launch @@ -8,6 +8,7 @@ <arg name="move_poi_action" default="/poi_navigation_server/go_to_poi"/> <arg name="move_waypoint_action" default="/pal_waypoint/navigate"/> <arg name="odom_topic" default="/mobile_base_controller/odom"/> + <arg name="path_topic" default="/move_base/GlobalPlanner/plan"/> <arg name="clear_costmaps_service" default="/move_base/clear_costmaps"/> <arg name="change_map_service" default="/pal_map_manager/change_map"/> <arg name="set_op_mode_service" default="/pal_navigation_sm"/> @@ -27,6 +28,7 @@ <arg name="move_poi_action" value="$(arg move_poi_action)"/> <arg name="move_waypoint_action" value="$(arg move_waypoint_action)"/> <arg name="odom_topic" value="$(arg odom_topic)"/> + <arg name="path_topic" value="$(arg path_topic)"/> <arg name="clear_costmaps_service" value="$(arg clear_costmaps_service)"/> <arg name="change_map_service" value="$(arg change_map_service)"/> <arg name="set_op_mode_service" value="$(arg set_op_mode_service)"/> diff --git a/launch/tiago_nav_bt_client.launch b/launch/tiago_nav_bt_client.launch index 60c0d7c7f2ad18ea8e8d5f870ddd1946fa2a15f3..711ddb66dc969121af95bfceeb0422354865c88e 100644 --- a/launch/tiago_nav_bt_client.launch +++ b/launch/tiago_nav_bt_client.launch @@ -8,6 +8,7 @@ <arg name="move_poi_action" default="/poi_navigation_server/go_to_poi"/> <arg name="move_waypoint_action" default="/pal_waypoint/navigate"/> <arg name="odom_topic" default="/mobile_base_controller/odom"/> + <arg name="path_topic" default="/move_base/GlobalPlanner/plan"/> <arg name="clear_costmaps_service" default="/move_base/clear_costmaps"/> <arg name="change_map_service" default="/pal_map_manager/change_map"/> <arg name="set_op_mode_service" default="/pal_navigation_sm"/> @@ -31,6 +32,8 @@ to="$(arg move_waypoint_action)"/> <remap from="~/tiago_nav_module/odom" to="$(arg odom_topic)"/> + <remap from="~/tiago_nav_module/path" + to="$(arg path_topic)"/> <remap from="~/tiago_nav_module/clear_costmaps" to="$(arg clear_costmaps_service)"/> <remap from="~/tiago_nav_module/change_map" diff --git a/launch/tiago_nav_bt_client_sim.launch b/launch/tiago_nav_bt_client_sim.launch index 7ab7b5600ab0a20a623ed717e7929dc45f2b3f44..dae4375d1938780ff85def764a9be11eef8a2430 100644 --- a/launch/tiago_nav_bt_client_sim.launch +++ b/launch/tiago_nav_bt_client_sim.launch @@ -8,6 +8,7 @@ <arg name="move_poi_action" default="/poi_navigation_server/go_to_poi"/> <arg name="move_waypoint_action" default="/pal_waypoint/navigate"/> <arg name="odom_topic" default="/mobile_base_controller/odom"/> + <arg name="path_topic" default="/move_base/GlobalPlanner/plan"/> <arg name="clear_costmaps_service" default="/move_base/clear_costmaps"/> <arg name="change_map_service" default="/pal_map_manager/change_map"/> <arg name="set_op_mode_service" default="/pal_navigation_sm"/> @@ -31,6 +32,7 @@ <arg name="move_poi_action" value="$(arg move_poi_action)"/> <arg name="move_waypoint_action" value="$(arg move_waypoint_action)"/> <arg name="odom_topic" value="$(arg odom_topic)"/> + <arg name="path_topic" value="$(arg path_topic)"/> <arg name="clear_costmaps_service" value="$(arg clear_costmaps_service)"/> <arg name="change_map_service" value="$(arg change_map_service)"/> <arg name="set_op_mode_service" value="$(arg set_op_mode_service)"/> diff --git a/launch/tiago_nav_client.launch b/launch/tiago_nav_client.launch index 0402ef114d8173e4b507adb9df5cfaa9268a8755..df19caa174bd4eaa3d2635f345608ab5713f945a 100644 --- a/launch/tiago_nav_client.launch +++ b/launch/tiago_nav_client.launch @@ -8,6 +8,7 @@ <arg name="move_poi_action" default="/poi_navigation_server/go_to_poi"/> <arg name="move_waypoint_action" default="/pal_waypoint/navigate"/> <arg name="odom_topic" default="/mobile_base_controller/odom"/> + <arg name="path_topic" default="/move_base/GlobalPlanner/plan"/> <arg name="clear_costmaps_service" default="/move_base/clear_costmaps"/> <arg name="change_map_service" default="/pal_map_manager/change_map"/> <arg name="set_op_mode_service" default="/pal_navigation_sm"/> @@ -27,6 +28,8 @@ to="$(arg move_waypoint_action)"/> <remap from="~/nav_module/odom" to="$(arg odom_topic)"/> + <remap from="~/nav_module/path" + to="$(arg path_topic)"/> <remap from="~/nav_module/clear_costmaps" to="$(arg clear_costmaps_service)"/> <remap from="~/nav_module/change_map" diff --git a/launch/tiago_nav_client_sim.launch b/launch/tiago_nav_client_sim.launch index 69bb18e8456fff165e098820942212bcdb210afb..40da268f0f318c66112d6b0c071d82968576dcc4 100644 --- a/launch/tiago_nav_client_sim.launch +++ b/launch/tiago_nav_client_sim.launch @@ -8,6 +8,7 @@ <arg name="move_poi_action" default="/poi_navigation_server/go_to_poi"/> <arg name="move_waypoint_action" default="/pal_waypoint/navigate"/> <arg name="odom_topic" default="/mobile_base_controller/odom"/> + <arg name="path_topic" default="/move_base/GlobalPlanner/plan"/> <arg name="clear_costmaps_service" default="/move_base/clear_costmaps"/> <arg name="change_map_service" default="/pal_map_manager/change_map"/> <arg name="set_op_mode_service" default="/pal_navigation_sm"/> @@ -27,6 +28,7 @@ <arg name="move_poi_action" value="$(arg move_poi_action)"/> <arg name="move_waypoint_action" value="$(arg move_waypoint_action)"/> <arg name="odom_topic" value="$(arg odom_topic)"/> + <arg name="path_topic" value="$(arg path_topic)"/> <arg name="clear_costmaps_service" value="$(arg clear_costmaps_service)"/> <arg name="change_map_service" value="$(arg change_map_service)"/> <arg name="set_op_mode_service" value="$(arg set_op_mode_service)"/> diff --git a/src/tiago_nav_bt_module.cpp b/src/tiago_nav_bt_module.cpp index 5e51e472cbdc392b312def1f3a5d30214d0c1d1b..2f1cc4c96ddb670e827a8dbaf087c78e34e91595 100644 --- a/src/tiago_nav_bt_module.cpp +++ b/src/tiago_nav_bt_module.cpp @@ -33,6 +33,7 @@ void CTiagoNavModuleBT::init(IriBehaviorTreeFactory &factory) BT::PortsList set_string_parameter_ports = {BT::InputPort<std::string>("name_space"), BT::InputPort<std::string>("name"), BT::InputPort<std::string>("value")}; BT::PortsList set_double_parameter_ports = {BT::InputPort<std::string>("name_space"), BT::InputPort<std::string>("name"), BT::InputPort<double>("value")}; BT::PortsList current_pose_ports = {BT::OutputPort<geometry_msgs::Pose>("pose")}; + BT::PortsList goal_distance_ports = {BT::OutputPort<double>("distance")}; //Registration of conditions @@ -78,6 +79,7 @@ void CTiagoNavModuleBT::init(IriBehaviorTreeFactory &factory) factory.registerSimpleAction("tiago_nav_set_string_parameter", std::bind(&CTiagoNavModuleBT::tiago_nav_set_string_parameter, this, std::placeholders::_1), set_string_parameter_ports); factory.registerSimpleAction("tiago_nav_set_double_parameter", std::bind(&CTiagoNavModuleBT::tiago_nav_set_double_parameter, this, std::placeholders::_1), set_double_parameter_ports); factory.registerSimpleAction("get_tiago_nav_current_pose", std::bind(&CTiagoNavModuleBT::get_tiago_nav_current_pose, this, std::placeholders::_1), current_pose_ports); + factory.registerSimpleAction("get_tiago_nav_goal_distance", std::bind(&CTiagoNavModuleBT::get_tiago_nav_goal_distance, this, std::placeholders::_1), goal_distance_ports); #ifdef HAVE_WAYPOINTS BT::PortsList sync_go_to_waypoints_ports = {BT::InputPort<std::string>("group"), BT::InputPort<unsigned int>("first_index"), BT::InputPort<unsigned int>("num"), BT::InputPort<bool>("continue_on_error")}; @@ -685,6 +687,15 @@ BT::NodeStatus CTiagoNavModuleBT::get_tiago_nav_current_pose(BT::TreeNode& self) return BT::NodeStatus::SUCCESS; } +BT::NodeStatus CTiagoNavModuleBT::get_tiago_nav_goal_distance(BT::TreeNode& self) +{ + ROS_DEBUG("CTiagoNavModuleBT::get_tiago_nav_goal_distance-> get_tiago_nav_goal_distance"); + + double dist = this->tiago_nav_module.getGoalDistance(); + self.setOutput("distance", dist); + return BT::NodeStatus::SUCCESS; +} + BT::NodeStatus CTiagoNavModuleBT::sync_cancel_tiago_nav_action(void) { ROS_DEBUG("CTiagoNavModuleBT::sync_cancel_tiago_nav_action-> sync_cancel_tiago_nav_action"); diff --git a/src/tiago_nav_client_alg_node.cpp b/src/tiago_nav_client_alg_node.cpp index 722503043ded76de2b465c8761410b303573add4..13887e1e6b29dc3775b50845584ec43d90ce0925 100644 --- a/src/tiago_nav_client_alg_node.cpp +++ b/src/tiago_nav_client_alg_node.cpp @@ -111,6 +111,12 @@ void TiagoNavClientAlgNode::node_config_update(Config &config, uint32_t level) this->nav.stop(); config.stop_wp=false; } + if (config.print_goal_distance) + { + double dist = this->nav.getGoalDistance(); + ROS_INFO_STREAM("Goal distance = " << dist); + config.print_goal_distance = false; + } this->alg_.unlock(); } diff --git a/src/tiago_nav_module.cpp b/src/tiago_nav_module.cpp index 510c4a0b0fd8d5cf7e2906a2a717cbac11e35781..5680d0d44ab17973ce017389ea2ddf236a25bed1 100644 --- a/src/tiago_nav_module.cpp +++ b/src/tiago_nav_module.cpp @@ -30,17 +30,36 @@ CTiagoNavModule::CTiagoNavModule(const std::string &name,const std::string &name this->new_waypoint=false; #endif this->cancel_pending=false; + this->path_available = false; // initialize odometry subscriber - this->odom_watchdog.reset(ros::Duration(this->config.odom_watchdog_time_s)); + if(!this->module_nh.getParam("odom_watchdog_time_s", this->config.odom_watchdog_time_s)) + { + ROS_WARN("CTiagoNavModule::CTiagoNavModule: param 'odom_watchdog_time_s' not found. Configuring wathcdog with 1.0 sec"); + this->odom_watchdog.reset(ros::Duration(1.0)); + } + else + this->odom_watchdog.reset(ros::Duration(this->config.odom_watchdog_time_s)); + + // this->odom_watchdog.reset(ros::Duration(this->config.odom_watchdog_time_s)); this->odom_subscriber = this->module_nh.subscribe("odom",1,&CTiagoNavModule::odom_callback,this); + // initialize path subscriber + this->path_subscriber = this->module_nh.subscribe("path", 1, &CTiagoNavModule::path_callback, this); + // tf listener this->transform_position=false; this->transform_orientation=false; // costmaps - this->clear_costmaps_timer=this->module_nh.createTimer(ros::Duration(1.0/this->config.clear_costmap_auto_clear_rate_hz),&CTiagoNavModule::clear_costmaps_call,this); + if(!this->module_nh.getParam("clear_costmap_auto_clear_rate_hz", this->config.clear_costmap_auto_clear_rate_hz)) + { + ROS_WARN("CTiagoNavModule::CTiagoNavModule: param 'clear_costmap_auto_clear_rate_hz' not found. Configuring wathcdog with 0.1 Hz"); + this->clear_costmaps_timer=this->module_nh.createTimer(ros::Duration(1.0/0.1),&CTiagoNavModule::clear_costmaps_call,this); + } + else + this->clear_costmaps_timer=this->module_nh.createTimer(ros::Duration(1.0/this->config.clear_costmap_auto_clear_rate_hz),&CTiagoNavModule::clear_costmaps_call,this); + // this->clear_costmaps_timer=this->module_nh.createTimer(ros::Duration(1.0/this->config.clear_costmap_auto_clear_rate_hz),&CTiagoNavModule::clear_costmaps_call,this); this->clear_costmaps_timer.stop(); this->enable_auto_clear=false; @@ -388,6 +407,14 @@ void CTiagoNavModule::odom_callback(const nav_msgs::Odometry::ConstPtr& msg) this->unlock(); } +void CTiagoNavModule::path_callback(const nav_msgs::Path::ConstPtr& msg){ + ROS_DEBUG("CTiagoNavModule: path callback"); + this->lock(); + this->path_msg = *msg; + this->path_available = true; + this->unlock(); +} + bool CTiagoNavModule::transform_current_pose(void) { geometry_msgs::PoseStamped pose; @@ -508,6 +535,7 @@ bool CTiagoNavModule::go_to_orientation(double yaw,double heading_tol) this->move_base_goal.target_pose.header.frame_id=this->goal_frame_id; this->move_base_goal.target_pose.pose.orientation=tf::createQuaternionMsgFromYaw(yaw); this->new_goal=true; + this->path_available = false; this->unlock(); return true; @@ -553,6 +581,7 @@ bool CTiagoNavModule::go_to_position(double x,double y,double x_y_pos_tol) this->move_base_goal.target_pose.pose.position.y=y; this->move_base_goal.target_pose.pose.position.z=0.0; this->new_goal=true; + this->path_available = false; this->unlock(); return true; @@ -607,6 +636,7 @@ bool CTiagoNavModule::go_to_pose(double x,double y,double yaw,double heading_tol this->move_base_goal.target_pose.pose.position.z=0.0; this->move_base_goal.target_pose.pose.orientation=tf::createQuaternionMsgFromYaw(yaw); this->new_goal=true; + this->path_available = false; this->unlock(); return true; @@ -894,6 +924,33 @@ geometry_msgs::Pose CTiagoNavModule::getCurrentPose(void) { return this->current_pose.pose; } +double CTiagoNavModule::getGoalDistance(void) +{ + this->lock(); + if (!this->path_available) + { + ROS_WARN("CTiagoNavModule::getGoalDistance -> Goal distance not calculed. No path received."); + this->unlock(); + return std::numeric_limits<double>::quiet_NaN(); + } + double dist = 0.0; + if (this->path_msg.poses.size() < 2) + { + ROS_WARN("CTiagoNavModule::getGoalDistance -> Goal distance not calculed. Not enough points."); + this->unlock(); + return std::numeric_limits<double>::quiet_NaN(); + } + for (unsigned int i=0; i< this->path_msg.poses.size()-1; i++) + { + double dx = this->path_msg.poses[i].pose.position.x - this->path_msg.poses[i+1].pose.position.x; + double dy = this->path_msg.poses[i].pose.position.y - this->path_msg.poses[i+1].pose.position.y; + double d = std::sqrt(std::pow(dx,2) + std::pow(dy,2)); + dist += d; + } + this->unlock(); + return dist; +} + CTiagoNavModule::~CTiagoNavModule() { if(!this->move_base_action.is_finished()) diff --git a/src/xml/bt_test.xml b/src/xml/bt_test.xml index 7b5632e97faaeb24b989b9e9a2a5ae17620189a0..63ecdbd3051fd08b21c94de0d841fbc5be36e53c 100644 --- a/src/xml/bt_test.xml +++ b/src/xml/bt_test.xml @@ -143,6 +143,9 @@ <Action ID="get_tiago_nav_current_pose"> <output_port name="pose"> current pose</output_port> </Action> + <Action ID="get_tiago_goal_distance"> + <output_port name="distance"> current goal distance</output_port> + </Action> <Condition ID="is_tiago_nav_finished"/> <Condition ID="is_tiago_nav_module_running"/> <Condition ID="is_tiago_nav_module_success"/>