diff --git a/fastdds_setup.xml b/fastdds_setup.xml
index de973c3..bc22a6e 100644
--- a/fastdds_setup.xml
+++ b/fastdds_setup.xml
@@ -23,7 +23,7 @@
- 100.113.219.4
+ 100.84.205.108
diff --git a/joy.ros2_launch_marcel.desktop b/joy.ros2_launch_marcel.desktop
index 204eef5..e321000 100644
--- a/joy.ros2_launch_marcel.desktop
+++ b/joy.ros2_launch_marcel.desktop
@@ -2,7 +2,7 @@
Type=Application
Name=Joy
Comment=Lance le système ROS 2 avec GUI
-Exec=/home/modelec/modelec-marcel-ROS/start_ros2.sh
+Exec=/home/modelec/Modelec-ROS2/start_ros2.sh
Icon=utilities-terminal
Terminal=true
Categories=Utility;
diff --git a/no_lidar.joy.ros2_launch_marcel.desktop b/no_lidar.joy.ros2_launch_marcel.desktop
index 60e6063..e323a0d 100644
--- a/no_lidar.joy.ros2_launch_marcel.desktop
+++ b/no_lidar.joy.ros2_launch_marcel.desktop
@@ -2,7 +2,7 @@
Type=Application
Name=Joy no Lidar
Comment=Lance le système ROS 2 avec GUI
-Exec=/home/modelec/modelec-marcel-ROS/start_ros2.sh with_rplidar:=false
+Exec=/home/modelec/Modelec-ROS2/start_ros2.sh with_rplidar:=false
Icon=utilities-terminal
Terminal=true
Categories=Utility;
diff --git a/no_lidar.ros2_launch_marcel.desktop b/no_lidar.ros2_launch_marcel.desktop
index c01e2fc..ff3a9d2 100644
--- a/no_lidar.ros2_launch_marcel.desktop
+++ b/no_lidar.ros2_launch_marcel.desktop
@@ -2,7 +2,9 @@
Type=Application
Name=No Lidar
Comment=Lance le système ROS 2 avec GUI
-Exec=/home/modelec/modelec-marcel-ROS/start_ros2.sh with_joy:=false with_rplidar:=false
+
+Exec=/home/modelec/Modelec-ROS2/start_ros2.sh with_joy:=false with_rplidar:=false
+
Icon=utilities-terminal
Terminal=true
Categories=Utility;
diff --git a/ros2_launch_marcel.desktop b/ros2_launch_marcel.desktop
index 6eed291..b919b14 100644
--- a/ros2_launch_marcel.desktop
+++ b/ros2_launch_marcel.desktop
@@ -2,7 +2,7 @@
Type=Application
Name=Lancer ROS 2
Comment=Lance le système ROS 2 avec GUI
-Exec=/home/modelec/modelec-marcel-ROS/start_ros2.sh with_joy:=false
+Exec=/home/modelec/Modelec-ROS2/start_ros2.sh with_joy:=false
Icon=utilities-terminal
Terminal=true
Categories=Utility;
diff --git a/src/modelec_com/src/pcb_action_interface.cpp b/src/modelec_com/src/pcb_action_interface.cpp
index aa28560..6ee069f 100644
--- a/src/modelec_com/src/pcb_action_interface.cpp
+++ b/src/modelec_com/src/pcb_action_interface.cpp
@@ -446,6 +446,10 @@ namespace Modelec
relay_move_res_pub_->publish(relay_msg);
}
+ else if (tokens[1] == "TIR")
+ {
+ // Do nothing for now
+ }
else
{
RCLCPP_WARN(this->get_logger(), "Unknown message format for OK response: '%s'", trim(msg).c_str());
diff --git a/src/modelec_strat/data/obstacles.xml b/src/modelec_strat/data/obstacles.xml
index 0d46ad6..151de31 100644
--- a/src/modelec_strat/data/obstacles.xml
+++ b/src/modelec_strat/data/obstacles.xml
@@ -18,7 +18,7 @@
-
+
diff --git a/src/modelec_strat/include/modelec_strat/action/free_action.hpp b/src/modelec_strat/include/modelec_strat/action/free_action.hpp
index acb123a..3a4532d 100644
--- a/src/modelec_strat/include/modelec_strat/action/free_action.hpp
+++ b/src/modelec_strat/include/modelec_strat/action/free_action.hpp
@@ -9,20 +9,20 @@ namespace Modelec
{
public:
FreeAction(const std::shared_ptr& action_executor);
- FreeAction(const std::shared_ptr& action_executor, bool front, int n);
- FreeAction(const std::shared_ptr& action_executor, std::pair servo);
- FreeAction(const std::shared_ptr& action_executor, std::vector> servos);
+ FreeAction(const std::shared_ptr& action_executor, Front front, int n);
+ FreeAction(const std::shared_ptr& action_executor, std::pair servo);
+ FreeAction(const std::shared_ptr& action_executor, std::vector> servos);
void Next() override;
void Init(const std::vector& params) override;
- void AddServo(int id, bool front);
- void AddServo(std::pair servo);
- void AddServos(const std::vector>& servos);
+ void AddServo(int id, Front front);
+ void AddServo(std::pair servo);
+ void AddServos(const std::vector>& servos);
inline static const std::string Name = ActionExec::FREE;
private:
- std::vector> servos_;
+ std::vector> servos_;
std::queue steps_;
diff --git a/src/modelec_strat/include/modelec_strat/action/take_action.hpp b/src/modelec_strat/include/modelec_strat/action/take_action.hpp
index fd9f226..68cd7a6 100644
--- a/src/modelec_strat/include/modelec_strat/action/take_action.hpp
+++ b/src/modelec_strat/include/modelec_strat/action/take_action.hpp
@@ -9,20 +9,20 @@ namespace Modelec
{
public:
TakeAction(const std::shared_ptr& action_executor);
- TakeAction(const std::shared_ptr& action_executor, bool front, int n);
- TakeAction(const std::shared_ptr& action_executor, std::pair servo);
- TakeAction(const std::shared_ptr& action_executor, std::vector> servos);
+ TakeAction(const std::shared_ptr& action_executor, Front front, int n);
+ TakeAction(const std::shared_ptr& action_executor, std::pair servo);
+ TakeAction(const std::shared_ptr& action_executor, std::vector> servos);
void Next() override;
void Init(const std::vector& params) override;
- void AddServo(int id, bool front);
- void AddServo(std::pair servo);
- void AddServos(const std::vector>& servos);
+ void AddServo(int id, Front front);
+ void AddServo(std::pair servo);
+ void AddServos(const std::vector>& servos);
inline static const std::string Name = ActionExec::TAKE;
private:
- std::vector> servos_;
+ std::vector> servos_;
std::queue steps_;
diff --git a/src/modelec_strat/include/modelec_strat/action_executor.hpp b/src/modelec_strat/include/modelec_strat/action_executor.hpp
index 795c015..6186b01 100644
--- a/src/modelec_strat/include/modelec_strat/action_executor.hpp
+++ b/src/modelec_strat/include/modelec_strat/action_executor.hpp
@@ -35,9 +35,9 @@ namespace Modelec
void Up(BaseAction::Front front, bool force = false);
- void Take(std::vector> servos, bool force = false);
+ void Take(const std::vector>& servos, bool force = false);
- void Free(std::vector> servos, bool force = false);
+ void Free(const std::vector>& servos, bool force = false);
void MoveServoTimed(const modelec_interfaces::msg::ActionServoTimedArray& msg);
@@ -45,6 +45,18 @@ namespace Modelec
std::array, 2> box_obstacles_;
+ bool IsEmpty() const;
+
+ bool IsFull() const;
+
+ bool HasBox(BaseAction::Front front) const;
+
+ bool HasFrontBox() const;
+
+ bool HasBackBox() const;
+
+ bool HasOneBox() const;
+
protected:
rclcpp::Publisher::SharedPtr asc_move_pub_;
rclcpp::Publisher::SharedPtr servo_move_pub_;
diff --git a/src/modelec_strat/include/modelec_strat/missions/free_mission.hpp b/src/modelec_strat/include/modelec_strat/missions/free_mission.hpp
index 34738a0..0bdd862 100644
--- a/src/modelec_strat/include/modelec_strat/missions/free_mission.hpp
+++ b/src/modelec_strat/include/modelec_strat/missions/free_mission.hpp
@@ -8,7 +8,8 @@ namespace Modelec {
class FreeMission : public Mission {
public:
FreeMission(const std::shared_ptr& nav,
- const std::shared_ptr& action_executor);
+ const std::shared_ptr& action_executor,
+ BaseAction::Front front = BaseAction::FRONT);
void Start(rclcpp::Node::SharedPtr node) override;
void Update() override;
@@ -25,7 +26,9 @@ namespace Modelec {
UP,
GO_BACK,
DONE,
- } step_;
+ };
+
+ BaseAction::Front front_;
MissionStatus status_;
std::shared_ptr nav_;
@@ -38,5 +41,9 @@ namespace Modelec {
rclcpp::Time go_timeout_;
rclcpp::Time deploy_time_;
+
+ std::optional min_time_;
+
+ rclcpp::Time last_ask_waypoint_time_;
};
}
\ No newline at end of file
diff --git a/src/modelec_strat/include/modelec_strat/missions/go_home_mission.hpp b/src/modelec_strat/include/modelec_strat/missions/go_home_mission.hpp
index a61d684..0ba87a9 100644
--- a/src/modelec_strat/include/modelec_strat/missions/go_home_mission.hpp
+++ b/src/modelec_strat/include/modelec_strat/missions/go_home_mission.hpp
@@ -20,14 +20,11 @@ namespace Modelec
private:
enum Step
{
- GO_FRONT,
- AWAIT_95S,
- GO_HOME,
- DONE,
-
ROTATE_TO_HOME,
+ GO_HOME,
GO_CLOSE,
- } step_;
+ DONE,
+ };
MissionStatus status_;
std::shared_ptr nav_;
@@ -38,5 +35,9 @@ namespace Modelec
rclcpp::Publisher::SharedPtr score_pub_;
int mission_score_ = 0;
rclcpp::Time go_timeout_;
+
+ std::optional min_time_;
+
+ rclcpp::Time last_ask_waypoint_time_;
};
}
diff --git a/src/modelec_strat/include/modelec_strat/missions/mission_base.hpp b/src/modelec_strat/include/modelec_strat/missions/mission_base.hpp
index 21033b5..fa0e360 100644
--- a/src/modelec_strat/include/modelec_strat/missions/mission_base.hpp
+++ b/src/modelec_strat/include/modelec_strat/missions/mission_base.hpp
@@ -24,5 +24,8 @@ namespace Modelec
virtual void Clear() = 0;
virtual MissionStatus GetStatus() const = 0;
virtual std::string GetName() const = 0;
+
+ protected:
+ std::queue steps_;
};
}
diff --git a/src/modelec_strat/include/modelec_strat/missions/take_mission.hpp b/src/modelec_strat/include/modelec_strat/missions/take_mission.hpp
index 64f7db5..eba1206 100644
--- a/src/modelec_strat/include/modelec_strat/missions/take_mission.hpp
+++ b/src/modelec_strat/include/modelec_strat/missions/take_mission.hpp
@@ -8,7 +8,8 @@ namespace Modelec {
class TakeMission : public Mission {
public:
TakeMission(const std::shared_ptr& nav,
- const std::shared_ptr& action_executor);
+ const std::shared_ptr& action_executor,
+ BaseAction::Front front = BaseAction::FRONT);
void Start(rclcpp::Node::SharedPtr node) override;
void Update() override;
@@ -25,7 +26,9 @@ namespace Modelec {
TAKE,
UP,
DONE,
- } step_;
+ };
+
+ BaseAction::Front front_;
std::shared_ptr closestBox;
MissionStatus status_;
@@ -35,5 +38,9 @@ namespace Modelec {
rclcpp::Time go_timeout_;
rclcpp::Time deploy_time_;
+
+ std::optional min_time_;
+
+ rclcpp::Time last_ask_waypoint_time_;
};
}
\ No newline at end of file
diff --git a/src/modelec_strat/include/modelec_strat/navigation_helper.hpp b/src/modelec_strat/include/modelec_strat/navigation_helper.hpp
index 0e0a209..eabaa3a 100644
--- a/src/modelec_strat/include/modelec_strat/navigation_helper.hpp
+++ b/src/modelec_strat/include/modelec_strat/navigation_helper.hpp
@@ -60,17 +60,17 @@ namespace Modelec
bool HasArrived() const;
- bool RotateTo(const PosMsg::SharedPtr& pos);
- bool RotateTo(const Point& pos);
+ bool RotateTo(const PosMsg::SharedPtr& pos, bool front = true);
+ bool RotateTo(const Point& pos, bool front = true);
void Rotate(double angle);
int GoTo(const PosMsg::SharedPtr& goal, bool isClose = false, int collisionMask = Pathfinding::FREE);
int GoTo(int x, int y, double theta, bool isClose = false, int collisionMask = Pathfinding::FREE);
int GoTo(const Point& goal, bool isClose = false, int collisionMask = Pathfinding::FREE);
- int GoToRotateFirst(const PosMsg::SharedPtr& goal, bool isClose = false, int collisionMask = Pathfinding::FREE);
- int GoToRotateFirst(int x, int y, double theta, bool isClose = false, int collisionMask = Pathfinding::FREE);
- int GoToRotateFirst(const Point& goal, bool isClose = false, int collisionMask = Pathfinding::FREE);
+ int GoToRotateFirst(const PosMsg::SharedPtr& goal, bool isClose = false, int collisionMask = Pathfinding::FREE, bool front = true);
+ int GoToRotateFirst(int x, int y, double theta, bool isClose = false, int collisionMask = Pathfinding::FREE, bool front = true);
+ int GoToRotateFirst(const Point& goal, bool isClose = false, int collisionMask = Pathfinding::FREE, bool front = true);
int CanGoTo(const PosMsg::SharedPtr& goal, bool isClose = false, int collisionMask = Pathfinding::FREE);
int CanGoTo(int x, int y, double theta, bool isClose = false, int collisionMask = Pathfinding::FREE);
diff --git a/src/modelec_strat/include/modelec_strat/strat_fms.hpp b/src/modelec_strat/include/modelec_strat/strat_fms.hpp
index d552887..2069550 100644
--- a/src/modelec_strat/include/modelec_strat/strat_fms.hpp
+++ b/src/modelec_strat/include/modelec_strat/strat_fms.hpp
@@ -62,6 +62,7 @@ namespace Modelec
int team_id_ = 0;
std::queue game_action_sequence_;
+ bool static_strat_ = false;
std::shared_ptr nav_;
std::shared_ptr action_executor_;
diff --git a/src/modelec_strat/src/action/down_action.cpp b/src/modelec_strat/src/action/down_action.cpp
index 19a6dde..fd843f9 100644
--- a/src/modelec_strat/src/action/down_action.cpp
+++ b/src/modelec_strat/src/action/down_action.cpp
@@ -35,12 +35,12 @@ void Modelec::DownAction::Next()
{
msg.items[0].id = 0;
msg.items[0].start_angle = 1.95;
- msg.items[0].end_angle = 2.95;
+ msg.items[0].end_angle = 3;
msg.items[0].duration_s = 1;
msg.items[1].id = 1;
msg.items[1].start_angle = 1.9;
- msg.items[1].end_angle = 0.9;
+ msg.items[1].end_angle = 0.85;
msg.items[1].duration_s = 1;
msg.items[2].id = 2;
@@ -50,7 +50,7 @@ void Modelec::DownAction::Next()
msg.items[3].id = 3;
msg.items[3].start_angle = 2.7;
- msg.items[3].end_angle = 3;
+ msg.items[3].end_angle = 2.9;
msg.items[3].duration_s = 1;
}
diff --git a/src/modelec_strat/src/action/free_action.cpp b/src/modelec_strat/src/action/free_action.cpp
index fcc18a1..52fe403 100644
--- a/src/modelec_strat/src/action/free_action.cpp
+++ b/src/modelec_strat/src/action/free_action.cpp
@@ -8,17 +8,17 @@ Modelec::FreeAction::FreeAction(const std::shared_ptr& action_ex
steps_.push(ActionExec::DONE_STEP);
}
-Modelec::FreeAction::FreeAction(const std::shared_ptr& action_executor, bool front, int n) : FreeAction(action_executor)
+Modelec::FreeAction::FreeAction(const std::shared_ptr& action_executor, Front front, int n) : FreeAction(action_executor)
{
AddServo(n, front);
}
-Modelec::FreeAction::FreeAction(const std::shared_ptr& action_executor, std::pair servo) : FreeAction(action_executor)
+Modelec::FreeAction::FreeAction(const std::shared_ptr& action_executor, std::pair servo) : FreeAction(action_executor)
{
AddServo(servo.first, servo.second);
}
-Modelec::FreeAction::FreeAction(const std::shared_ptr& action_executor, std::vector> servos) : FreeAction(action_executor)
+Modelec::FreeAction::FreeAction(const std::shared_ptr& action_executor, std::vector> servos) : FreeAction(action_executor)
{
AddServos(servos);
}
@@ -44,9 +44,9 @@ void Modelec::FreeAction::Next()
for (size_t i = 0; i < servos_.size(); i++)
{
- msg.items[i].id = servos_[i].first + (servos_[i].second ? 3 : 11);
- msg.items[i].start_angle = servos_[i].second ? 0.8 : 0;
- msg.items[i].end_angle = servos_[i].second ? 2.5 : 0;
+ msg.items[i].id = servos_[i].first + (servos_[i].second ? 4 : 12);
+ msg.items[i].start_angle = servos_[i].second ? 3 : 0;
+ msg.items[i].end_angle = servos_[i].second ? 1 : 0;
msg.items[i].duration_s = 0.5;
}
@@ -71,22 +71,22 @@ void Modelec::FreeAction::Init(const std::vector& params)
{
int id = std::stoi(params[i]);
bool front = (i + 1 < params.size()) ? (params[i + 1] == "1" || params[i + 1] == "true" || params[i + 1] == "front") : true;
- AddServo(id, front);
+ AddServo(id, front ? FRONT : BACK);
}
}
}
-void Modelec::FreeAction::AddServo(int id, bool front)
+void Modelec::FreeAction::AddServo(int id, Front front)
{
servos_.emplace_back(id, front);
}
-void Modelec::FreeAction::AddServo(std::pair servo)
+void Modelec::FreeAction::AddServo(std::pair servo)
{
servos_.emplace_back(servo);
}
-void Modelec::FreeAction::AddServos(const std::vector>& servos)
+void Modelec::FreeAction::AddServos(const std::vector>& servos)
{
servos_.insert(servos_.end(), servos.begin(), servos.end());
}
diff --git a/src/modelec_strat/src/action/take_action.cpp b/src/modelec_strat/src/action/take_action.cpp
index 01a1469..5c05624 100644
--- a/src/modelec_strat/src/action/take_action.cpp
+++ b/src/modelec_strat/src/action/take_action.cpp
@@ -6,17 +6,17 @@ Modelec::TakeAction::TakeAction(const std::shared_ptr& action_ex
{
}
-Modelec::TakeAction::TakeAction(const std::shared_ptr& action_executor, bool front, int n) : TakeAction(action_executor)
+Modelec::TakeAction::TakeAction(const std::shared_ptr& action_executor, Front front, int n) : TakeAction(action_executor)
{
AddServo(n, front);
}
-Modelec::TakeAction::TakeAction(const std::shared_ptr& action_executor, std::pair servo) : TakeAction(action_executor)
+Modelec::TakeAction::TakeAction(const std::shared_ptr& action_executor, std::pair servo) : TakeAction(action_executor)
{
AddServo(servo);
}
-Modelec::TakeAction::TakeAction(const std::shared_ptr& action_executor, std::vector> servos) : TakeAction(action_executor)
+Modelec::TakeAction::TakeAction(const std::shared_ptr& action_executor, std::vector> servos) : TakeAction(action_executor)
{
AddServos(servos);
}
@@ -42,9 +42,9 @@ void Modelec::TakeAction::Next()
for (size_t i = 0; i < servos_.size(); i++)
{
- msg.items[i].id = servos_[i].first + (servos_[i].second ? 3 : 11);
- msg.items[i].start_angle = servos_[i].second ? 0.8 : 0;
- msg.items[i].end_angle = servos_[i].second ? 2.7 : 0;
+ msg.items[i].id = servos_[i].first + (servos_[i].second ? 4 : 12);
+ msg.items[i].start_angle = servos_[i].second ? 1 : 0;
+ msg.items[i].end_angle = servos_[i].second ? 3 : 0;
msg.items[i].duration_s = 0.5;
}
@@ -69,22 +69,22 @@ void Modelec::TakeAction::Init(const std::vector& params)
{
int id = std::stoi(params[i]);
bool front = (i + 1 < params.size()) ? (params[i + 1] == "1" || params[i + 1] == "true" || params[i + 1] == "front") : true;
- AddServo(id, front);
+ AddServo(id, front ? FRONT : BACK);
}
}
}
-void Modelec::TakeAction::AddServo(int id, bool front)
+void Modelec::TakeAction::AddServo(int id, Front front)
{
servos_.emplace_back(id, front);
}
-void Modelec::TakeAction::AddServo(std::pair servo)
+void Modelec::TakeAction::AddServo(std::pair servo)
{
servos_.emplace_back(servo);
}
-void Modelec::TakeAction::AddServos(const std::vector>& servos)
+void Modelec::TakeAction::AddServos(const std::vector>& servos)
{
servos_.insert(servos_.end(), servos.begin(), servos.end());
}
diff --git a/src/modelec_strat/src/action/up_action.cpp b/src/modelec_strat/src/action/up_action.cpp
index 1cbeb21..0907bba 100644
--- a/src/modelec_strat/src/action/up_action.cpp
+++ b/src/modelec_strat/src/action/up_action.cpp
@@ -34,12 +34,12 @@ void Modelec::UPAction::Next()
if (front_ == FRONT || front_ == BOTH)
{
msg.items[0].id = 0;
- msg.items[0].start_angle = 2.95;
+ msg.items[0].start_angle = 3;
msg.items[0].end_angle = 1.95;
msg.items[0].duration_s = 1;
msg.items[1].id = 1;
- msg.items[1].start_angle = 0.9;
+ msg.items[1].start_angle = 0.85;
msg.items[1].end_angle = 1.9;
msg.items[1].duration_s = 1;
@@ -49,8 +49,8 @@ void Modelec::UPAction::Next()
msg.items[2].duration_s = 1;
msg.items[3].id = 3;
- msg.items[3].start_angle = 3;
- msg.items[3].end_angle = 2.5;
+ msg.items[3].start_angle = 2.9;
+ msg.items[3].end_angle = 2.7;
msg.items[3].duration_s = 1;
}
diff --git a/src/modelec_strat/src/action_executor.cpp b/src/modelec_strat/src/action_executor.cpp
index 0d36e83..d41a7cc 100644
--- a/src/modelec_strat/src/action_executor.cpp
+++ b/src/modelec_strat/src/action_executor.cpp
@@ -96,11 +96,11 @@ namespace Modelec
}
else if (msg->buttons[3] == 1) // X button
{
- Take({{0, true}, {1, true}, {2, true}, {3, true}});
+ Take({{0, BaseAction::FRONT}, {1, BaseAction::FRONT}, {2, BaseAction::FRONT}, {3, BaseAction::FRONT}});
}
else if (msg->buttons[4] == 1) // Y button
{
- Free({{0, true}, {1, true}, {2, true}, {3, true}});
+ Free({{0, BaseAction::FRONT}, {1, BaseAction::FRONT}, {2, BaseAction::FRONT}, {3, BaseAction::FRONT}});
}
}
});
@@ -177,7 +177,7 @@ namespace Modelec
}
}
- void ActionExecutor::Take(std::vector> servos, bool force) {
+ void ActionExecutor::Take(const std::vector>& servos, bool force) {
if (action_done_ || force)
{
action_ = std::make_shared(shared_from_this(), servos);
@@ -191,7 +191,7 @@ namespace Modelec
}
}
- void ActionExecutor::Free(std::vector> servos, bool force) {
+ void ActionExecutor::Free(const std::vector>& servos, bool force) {
if (action_done_ || force)
{
action_ = std::make_shared(shared_from_this(), servos);
@@ -222,4 +222,34 @@ namespace Modelec
servo_move_pub_->publish(msg);
step_running_ += msg.items.size();
}
+
+ bool ActionExecutor::IsEmpty() const
+ {
+ return box_obstacles_[0] == nullptr && box_obstacles_[1] == nullptr;
+ }
+
+ bool ActionExecutor::IsFull() const
+ {
+ return box_obstacles_[0] != nullptr && box_obstacles_[1] != nullptr;
+ }
+
+ bool ActionExecutor::HasBox(BaseAction::Front front) const
+ {
+ return box_obstacles_[front] != nullptr;
+ }
+
+ bool ActionExecutor::HasFrontBox() const
+ {
+ return HasBox(BaseAction::FRONT);
+ }
+
+ bool ActionExecutor::HasBackBox() const
+ {
+ return HasBox(BaseAction::BACK);
+ }
+
+ bool ActionExecutor::HasOneBox() const
+ {
+ return HasFrontBox() != HasBackBox();
+ }
}
diff --git a/src/modelec_strat/src/deposite_zone.cpp b/src/modelec_strat/src/deposite_zone.cpp
index 654daf5..cfd388b 100644
--- a/src/modelec_strat/src/deposite_zone.cpp
+++ b/src/modelec_strat/src/deposite_zone.cpp
@@ -21,8 +21,7 @@ namespace Modelec
{
for (auto takePos = TakeAngleElem->FirstChildElement("Angle"); takePos; takePos = takePos->NextSiblingElement("Angle"))
{
- double angle;
- takePos->QueryDoubleAttribute("value", &angle);
+ double angle = takePos->DoubleText(0);
take_angle_.push_back(angle);
}
}
@@ -48,8 +47,8 @@ namespace Modelec
for (const auto& angle : take_angle_)
{
Point p = Point(
- static_cast(position_.x + dist * std::cos(angle)),
- static_cast(position_.y + dist * std::sin(angle)),
+ position_.x + dist * std::cos(angle),
+ position_.y + dist * std::sin(angle),
angle);
double distance = p.distance(currentPos);
diff --git a/src/modelec_strat/src/missions/free_mission.cpp b/src/modelec_strat/src/missions/free_mission.cpp
index 2162158..f9e0359 100644
--- a/src/modelec_strat/src/missions/free_mission.cpp
+++ b/src/modelec_strat/src/missions/free_mission.cpp
@@ -3,8 +3,11 @@
#include "modelec_strat/action/base_action.hpp"
namespace Modelec {
- FreeMission::FreeMission(const std::shared_ptr& nav, const std::shared_ptr& action_executor)
- : step_(GO_TO_FREE), status_(MissionStatus::READY), nav_(nav), action_executor_(action_executor) {
+ FreeMission::FreeMission(const std::shared_ptr& nav,
+ const std::shared_ptr& action_executor,
+ BaseAction::Front front)
+ : front_(front), status_(MissionStatus::READY), nav_(nav), action_executor_(action_executor)
+ {
}
void FreeMission::Start(rclcpp::Node::SharedPtr node)
@@ -12,9 +15,20 @@ namespace Modelec {
node_ = node;
go_timeout_ = node_->now();
+ deploy_time_ = node_->now();
+ last_ask_waypoint_time_ = node_->now();
status_ = MissionStatus::RUNNING;
- step_ = GO_TO_FREE;
+
+ std::queue empty;
+ std::swap(steps_, empty);
+
+ steps_.push(GO_TO_FREE);
+ steps_.push(DOWN);
+ steps_.push(FREE);
+ steps_.push(UP);
+ steps_.push(GO_BACK);
+ steps_.push(DONE);
}
void FreeMission::Update()
@@ -26,10 +40,11 @@ namespace Modelec {
if (!nav_->HasArrived())
{
- if ((node_->now() - go_timeout_).seconds() < 5)
+ if ((node_->now() - go_timeout_).seconds() < 2 && (node_->now() - last_ask_waypoint_time_).seconds() > 1)
{
- // nav_->AskWaypoint();
- // return;
+ nav_->AskWaypoint();
+ last_ask_waypoint_time_ = node_->now();
+ return;
}
if ((node_->now() - go_timeout_).seconds() < 10)
{
@@ -37,6 +52,22 @@ namespace Modelec {
}
}
+ if (min_time_.has_value())
+ {
+ if ((node_->now() - min_time_.value()).seconds() < 0.1)
+ {
+ return;
+ }
+ else
+ {
+ min_time_.reset();
+ }
+ }
+
+
+ auto step_ = steps_.front();
+ steps_.pop();
+
switch (step_)
{
case GO_TO_FREE:
@@ -50,19 +81,30 @@ namespace Modelec {
auto depoPoint = target_deposite_zone_->GetBestTakePosition(Point(currPos->x, currPos->y, currPos->theta));
- if (nav_->GoToRotateFirst(depoPoint.GetTakePosition(dist), true, Pathfinding::FREE))
+ auto pos = depoPoint.GetTakePosition(dist);
+
+ RCLCPP_INFO(
+ node_->get_logger(),
+ "FreeMission: position (%.2d, %.2d) with distance %.2f",
+ pos.x, pos.y, dist);
+
+ pos.theta += front_ == BaseAction::FRONT ? 0 : M_PI;
+
+ if (nav_->GoToRotateFirst(pos, true, Pathfinding::FREE, front_ == BaseAction::FRONT) != Pathfinding::FREE)
{
- nav_->GoToRotateFirst(depoPoint.GetTakePosition(dist), true, Pathfinding::FREE | Pathfinding::OBSTACLE);
+ if (nav_->GoToRotateFirst(pos, true, Pathfinding::FREE | Pathfinding::OBSTACLE, front_ == BaseAction::FRONT) != Pathfinding::FREE)
+ {
+ status_ = MissionStatus::FAILED;
+ return;
+ }
}
go_timeout_ = node_->now();
}
-
- step_ = FREE;
break;
case DOWN:
{
- action_executor_->Down(BaseAction::FRONT);
+ action_executor_->Down(front_);
deploy_time_ = node_->now();
}
@@ -70,42 +112,50 @@ namespace Modelec {
break;
case FREE:
{
- action_executor_->Free({{0, true}, {1, true}, {2, true}, {3, true}});
+ action_executor_->Free({{0, front_}, {1, front_}, {2, front_}, {3, front_}});
deploy_time_ = node_->now();
- auto obs = action_executor_->box_obstacles_[0];
- action_executor_->box_obstacles_[0] = nullptr;
+ auto obs = action_executor_->box_obstacles_[front_];
+ action_executor_->box_obstacles_[front_] = nullptr;
auto pos = nav_->GetCurrentPos();
obs->SetPosition(
- pos->x + 250 * cos(pos->theta),
- pos->y + 250 * sin(pos->theta),
+ pos->x + 200 * cos(pos->theta + (front_ == BaseAction::FRONT ? 0 : M_PI)),
+ pos->y + 200 * sin(pos->theta + (front_ == BaseAction::FRONT ? 0 : M_PI)),
pos->theta);
obs->SetAtObjective(true);
nav_->GetPathfinding()->AddObstacle(obs);
- }
- step_ = UP;
+ min_time_ = node_->now() + rclcpp::Duration::from_seconds(0.5);
+ }
break;
case UP:
{
- action_executor_->Up(BaseAction::FRONT);
+ action_executor_->Up(front_);
deploy_time_ = node_->now();
}
-
- step_ = GO_BACK;
break;
case GO_BACK:
{
- nav_->GoTo(target_deposite_zone_->GetPosition().GetTakePosition(500), true, Pathfinding::FREE | Pathfinding::OBSTACLE);
+ auto currPos = nav_->GetCurrentPos();
+
+ auto depoPoint = target_deposite_zone_->GetBestTakePosition(Point(currPos->x, currPos->y, currPos->theta));
+
+ auto pos = depoPoint.GetTakePosition(300);
+ pos.theta += front_ == BaseAction::FRONT ? 0 : M_PI;
+
+ if (nav_->GoTo(pos, true, Pathfinding::FREE | Pathfinding::OBSTACLE) != Pathfinding::FREE)
+ {
+ status_ = MissionStatus::FAILED;
+ return;
+ }
go_timeout_ = node_->now();
}
- step_ = DONE;
break;
case DONE:
{
diff --git a/src/modelec_strat/src/missions/go_home_mission.cpp b/src/modelec_strat/src/missions/go_home_mission.cpp
index 64b670a..8e8026e 100644
--- a/src/modelec_strat/src/missions/go_home_mission.cpp
+++ b/src/modelec_strat/src/missions/go_home_mission.cpp
@@ -5,7 +5,7 @@
namespace Modelec
{
GoHomeMission::GoHomeMission(const std::shared_ptr& nav, const rclcpp::Time& start_time) :
- step_(ROTATE_TO_HOME), status_(MissionStatus::READY), nav_(nav), start_time_(start_time)
+ status_(MissionStatus::READY), nav_(nav), start_time_(start_time)
{
}
@@ -18,18 +18,27 @@ namespace Modelec
score_pub_ = node_->create_publisher("/strat/score", 10);
go_timeout_ = node_->now();
+ last_ask_waypoint_time_ = node_->now();
status_ = MissionStatus::RUNNING;
- step_ = ROTATE_TO_HOME;
+
+ std::queue empty;
+ std::swap(steps_, empty);
+
+ steps_.push(ROTATE_TO_HOME);
+ steps_.push(GO_HOME);
+ steps_.push(GO_CLOSE);
+ steps_.push(DONE);
}
void GoHomeMission::Update()
{
if (!nav_->HasArrived())
{
- if ((node_->now() - go_timeout_).seconds() < 2)
+ if ((node_->now() - go_timeout_).seconds() < 2 && (node_->now() - last_ask_waypoint_time_).seconds() > 1)
{
- // nav_->AskWaypoint();
+ nav_->AskWaypoint();
+ last_ask_waypoint_time_ = node_->now();
return;
}
if ((node_->now() - go_timeout_).seconds() < 10)
@@ -38,6 +47,21 @@ namespace Modelec
}
}
+ if (min_time_.has_value())
+ {
+ if ((node_->now() - min_time_.value()).seconds() < 0.1)
+ {
+ return;
+ }
+ else
+ {
+ min_time_.reset();
+ }
+ }
+
+ auto step_ = steps_.front();
+ steps_.pop();
+
switch (step_)
{
case ROTATE_TO_HOME:
@@ -55,8 +79,6 @@ namespace Modelec
nav_->RotateTo(home_point_);
go_timeout_ = node_->now();
-
- step_ = GO_HOME;
}
break;
case GO_HOME:
@@ -71,23 +93,18 @@ namespace Modelec
}
go_timeout_ = node_->now();
-
- step_ = GO_CLOSE;
}
break;
case GO_CLOSE:
{
- if ((node_->now() - start_time_).seconds() < 94)
+ /*if ((node_->now() - start_time_).seconds() < 94)
{
break;
- }
+ }*/
nav_->GoTo(home_point_, true);
go_timeout_ = node_->now();
-
- step_ = DONE;
-
}
break;
case DONE:
diff --git a/src/modelec_strat/src/missions/take_mission.cpp b/src/modelec_strat/src/missions/take_mission.cpp
index 6bcf895..47bac9f 100644
--- a/src/modelec_strat/src/missions/take_mission.cpp
+++ b/src/modelec_strat/src/missions/take_mission.cpp
@@ -3,8 +3,11 @@
#include "modelec_strat/action/base_action.hpp"
namespace Modelec {
- TakeMission::TakeMission(const std::shared_ptr& nav, const std::shared_ptr& action_executor)
- : step_(GO_TO_TAKE), status_(MissionStatus::READY), nav_(nav), action_executor_(action_executor) {
+ TakeMission::TakeMission(const std::shared_ptr& nav,
+ const std::shared_ptr& action_executor,
+ BaseAction::Front front)
+ : front_(front), status_(MissionStatus::READY), nav_(nav), action_executor_(action_executor)
+ {
}
void TakeMission::Start(rclcpp::Node::SharedPtr node)
@@ -12,9 +15,20 @@ namespace Modelec {
node_ = node;
go_timeout_ = node_->now();
+ deploy_time_ = node_->now();
+ last_ask_waypoint_time_ = node_->now();
status_ = MissionStatus::RUNNING;
- step_ = GO_TO_TAKE;
+
+ std::queue empty;
+ std::swap(steps_, empty);
+
+ steps_.push(GO_TO_TAKE);
+ steps_.push(GO_TO_TAKE_CLOSE);
+ steps_.push(DOWN);
+ steps_.push(TAKE);
+ steps_.push(UP);
+ steps_.push(DONE);
}
void TakeMission::Update()
@@ -26,10 +40,11 @@ namespace Modelec {
if (!nav_->HasArrived())
{
- if ((node_->now() - go_timeout_).seconds() < 5)
+ if ((node_->now() - go_timeout_).seconds() < 2 && (node_->now() - last_ask_waypoint_time_).seconds() > 1)
{
- // nav_->AskWaypoint();
- // return;
+ nav_->AskWaypoint();
+ last_ask_waypoint_time_ = node_->now();
+ return;
}
if ((node_->now() - go_timeout_).seconds() < 10)
{
@@ -37,6 +52,21 @@ namespace Modelec {
}
}
+ if (min_time_.has_value())
+ {
+ if ((node_->now() - min_time_.value()).seconds() < 0.1)
+ {
+ return;
+ }
+ else
+ {
+ min_time_.reset();
+ }
+ }
+
+ auto step_ = steps_.front();
+ steps_.pop();
+
switch (step_)
{
case GO_TO_TAKE:
@@ -46,58 +76,76 @@ namespace Modelec {
action_executor_->box_obstacles_[0] = closestBox;
+ action_executor_->box_obstacles_[front_] = closestBox;
+
auto pos = closestBox->GetOptimizedGetPos(nav_->GetCurrentPos()).GetTakeBasePosition();
+ pos.theta += (front_ == BaseAction::FRONT ? 0 : M_PI);
- if (nav_->GoToRotateFirst(pos, false, Pathfinding::FREE | Pathfinding::WALL))
+ if (nav_->GoToRotateFirst(pos, false, Pathfinding::FREE | Pathfinding::WALL, front_ == BaseAction::FRONT) != Pathfinding::FREE)
{
- if (nav_->GoToRotateFirst(pos, true, Pathfinding::FREE | Pathfinding::WALL))
+ if (nav_->GoToRotateFirst(pos, true, Pathfinding::FREE | Pathfinding::WALL, front_ == BaseAction::FRONT) != Pathfinding::FREE)
{
- nav_->GoToRotateFirst(pos, true, Pathfinding::FREE | Pathfinding::WALL | Pathfinding::OBSTACLE);
+ if (nav_->GoToRotateFirst(pos, true, Pathfinding::FREE | Pathfinding::WALL | Pathfinding::OBSTACLE, front_ == BaseAction::FRONT) != Pathfinding::FREE)
+ {
+ status_ = MissionStatus::FAILED;
+ break;
+ }
}
}
go_timeout_ = node_->now();
}
-
- step_ = GO_TO_TAKE_CLOSE;
break;
case GO_TO_TAKE_CLOSE:
{
- auto pos = closestBox->GetOptimizedGetPos(nav_->GetCurrentPos()).GetTakeClosePosition();
+ if (action_executor_->box_obstacles_[front_] == nullptr)
+ {
+ status_ = MissionStatus::FAILED;
+ break;
+ }
- nav_->GoToRotateFirst(pos, true, Pathfinding::FREE | Pathfinding::WALL | Pathfinding::OBSTACLE);
+ auto pos = action_executor_->box_obstacles_[front_]->GetOptimizedGetPos(nav_->GetCurrentPos()).GetTakeClosePosition();
+ pos.theta += front_ == BaseAction::FRONT ? 0 : M_PI;
+
+ if (nav_->GoToRotateFirst(pos, true, Pathfinding::FREE | Pathfinding::WALL | Pathfinding::OBSTACLE, front_ == BaseAction::FRONT) != Pathfinding::FREE)
+ {
+ status_ = MissionStatus::FAILED;
+ break;
+ }
go_timeout_ = node_->now();
}
-
- step_ = DOWN;
break;
case DOWN:
{
- action_executor_->Down(BaseAction::FRONT);
+ action_executor_->Down(front_);
deploy_time_ = node_->now();
}
-
- step_ = TAKE;
break;
case TAKE:
{
- action_executor_->Take({{0, true}, {1, true}, {2, true}, {3, true}});
+ action_executor_->Take({{0, front_}, {1, front_}, {2, front_}, {3, front_}});
deploy_time_ = node_->now();
+ min_time_ = node_->now() + rclcpp::Duration::from_seconds(0.5);
}
-
- step_ = UP;
break;
case UP:
{
- action_executor_->Up(BaseAction::FRONT);
+ action_executor_->Up(front_);
deploy_time_ = node_->now();
}
-
- step_ = DONE;
break;
case DONE:
- nav_->GetPathfinding()->RemoveObstacle(closestBox->GetId());
+ {
+ if (action_executor_->box_obstacles_[front_] == nullptr)
+ {
+ status_ = MissionStatus::FAILED;
+ break;
+ }
+
+ nav_->GetPathfinding()->RemoveObstacle(action_executor_->box_obstacles_[front_]->GetId());
+ }
+
status_ = MissionStatus::DONE;
break;
default:
diff --git a/src/modelec_strat/src/navigation_helper.cpp b/src/modelec_strat/src/navigation_helper.cpp
index 525c249..021fe26 100644
--- a/src/modelec_strat/src/navigation_helper.cpp
+++ b/src/modelec_strat/src/navigation_helper.cpp
@@ -286,11 +286,11 @@ namespace Modelec
return waypoint_queue_.empty() && waypoints_.back().reached;
}
- bool NavigationHelper::RotateTo(const PosMsg::SharedPtr& pos)
+ bool NavigationHelper::RotateTo(const PosMsg::SharedPtr& pos, bool front)
{
double angle = std::atan2(pos->y - current_pos_->y, pos->x - current_pos_->x);
- if (std::abs(angle - current_pos_->theta) > M_PI / 3)
+ if (std::abs(angle - (current_pos_->theta + (front ? 0 : M_PI))) > M_PI / 4)
{
Rotate(angle);
return true;
@@ -298,11 +298,11 @@ namespace Modelec
return false;
}
- bool NavigationHelper::RotateTo(const Point& pos)
+ bool NavigationHelper::RotateTo(const Point& pos, bool front)
{
double angle = std::atan2(pos.y - current_pos_->y, pos.x - current_pos_->x);
- if (std::abs(angle - current_pos_->theta) > M_PI / 4)
+ if (std::abs(angle - (current_pos_->theta + (front ? 0 : M_PI))) > M_PI / 4)
{
Rotate(angle);
return true;
@@ -364,7 +364,7 @@ namespace Modelec
return GoTo(goal.x, goal.y, goal.theta, isClose, collisionMask);
}
- int NavigationHelper::GoToRotateFirst(const PosMsg::SharedPtr& goal, bool isClose, int collisionMask)
+ int NavigationHelper::GoToRotateFirst(const PosMsg::SharedPtr& goal, bool isClose, int collisionMask, bool front)
{
last_go_to_ = {goal, isClose, collisionMask};
@@ -376,7 +376,7 @@ namespace Modelec
}
auto p = Point(wl[0].x, wl[0].y, wl[0].theta);
- if (RotateTo(p))
+ if (RotateTo(p, front))
{
await_rotate_ = true;
@@ -403,18 +403,18 @@ namespace Modelec
return res;
}
- int NavigationHelper::GoToRotateFirst(int x, int y, double theta, bool isClose, int collisionMask)
+ int NavigationHelper::GoToRotateFirst(int x, int y, double theta, bool isClose, int collisionMask, bool front)
{
PosMsg::SharedPtr goal = std::make_shared();
goal->x = x;
goal->y = y;
goal->theta = theta;
- return GoToRotateFirst(goal, isClose, collisionMask);
+ return GoToRotateFirst(goal, isClose, collisionMask, front);
}
- int NavigationHelper::GoToRotateFirst(const Point& goal, bool isClose, int collisionMask)
+ int NavigationHelper::GoToRotateFirst(const Point& goal, bool isClose, int collisionMask, bool front)
{
- return GoToRotateFirst(goal.x, goal.y, goal.theta, isClose, collisionMask);
+ return GoToRotateFirst(goal.x, goal.y, goal.theta, isClose, collisionMask, front);
}
int NavigationHelper::CanGoTo(const PosMsg::SharedPtr& goal, bool isClose, int collisionMask)
diff --git a/src/modelec_strat/src/obstacle/box.cpp b/src/modelec_strat/src/obstacle/box.cpp
index 31a29d3..fdae6b2 100644
--- a/src/modelec_strat/src/obstacle/box.cpp
+++ b/src/modelec_strat/src/obstacle/box.cpp
@@ -45,7 +45,7 @@ namespace Modelec
}
}
- return Point(x_, y_, optimizedAngle);
+ return {x_, y_, optimizedAngle};
}
std::vector BoxObstacle::GetAllPossiblePositions() const
diff --git a/src/modelec_strat/src/strat_fms.cpp b/src/modelec_strat/src/strat_fms.cpp
index c95c054..be23ccf 100644
--- a/src/modelec_strat/src/strat_fms.cpp
+++ b/src/modelec_strat/src/strat_fms.cpp
@@ -67,9 +67,10 @@ namespace Modelec
}
game_action_sequence_.push(State::TAKE_MISSION);
- game_action_sequence_.push(State::FREE_MISSION);
game_action_sequence_.push(State::TAKE_MISSION);
game_action_sequence_.push(State::FREE_MISSION);
+ game_action_sequence_.push(State::FREE_MISSION);
+ static_strat_ = true;
}
void StratFMS::Init()
@@ -145,8 +146,8 @@ namespace Modelec
action_executor_->Up(BaseAction::Front::BOTH, true);
action_executor_->Free({
- {0, true}, {1, true}, {2, true}, {3, true},
- {0, false}, {1, false}, {2, false}, {3, false},
+ {0, BaseAction::FRONT}, {1, BaseAction::FRONT}, {2, BaseAction::FRONT}, {3, BaseAction::FRONT},
+ {0, BaseAction::BACK}, {1, BaseAction::BACK}, {2, BaseAction::BACK}, {3, BaseAction::BACK},
}, true);
Transition(State::WAIT_START, "System ready");
@@ -178,7 +179,11 @@ namespace Modelec
Transition(State::STOP, "All missions done");
}
- else if (elapsed.seconds() < 70)
+ else if (elapsed.seconds() > 60 && !action_executor_->IsEmpty())
+ {
+ Transition(State::FREE_MISSION, "No Time left, freeing boxes");
+ }
+ else if (elapsed.seconds() < 80)
{
Transition(State::SELECT_GAME_ACTION, "Selecting a game action");
}
@@ -191,15 +196,74 @@ namespace Modelec
}
case State::SELECT_GAME_ACTION:
{
- if (game_action_sequence_.empty())
+
+ if (static_strat_) {
+ if (game_action_sequence_.empty()) {
+ Transition(State::DO_GO_HOME, "No more game actions in sequence");
+ return;
+ }
+
+ auto next_action = game_action_sequence_.front();
+ game_action_sequence_.pop();
+
+ Transition(next_action, "Selecting next game action from sequence");
+ return;
+ }
+
+
+ // TODO : If close to border, do the side mission (thermometre)
+
+ if (action_executor_->IsFull())
+ {
+ RCLCPP_INFO(get_logger(), "All box are present on robot, selecting FREE mission");
+ Transition(State::FREE_MISSION, "Selecting FREE mission");
+ }
+ else if (action_executor_->IsEmpty())
{
- Transition(State::DO_GO_HOME, "No more game actions");
+ RCLCPP_INFO(get_logger(), "No box present on robot, selecting TAKE mission");
+ Transition(State::TAKE_MISSION, "Selecting TAKE mission");
}
else
{
- auto action = game_action_sequence_.front();
- game_action_sequence_.pop();
- Transition(action, "Selected game action");
+ auto pos = nav_->GetCurrentPos();
+ auto closestBox = nav_->GetClosestObstacle(pos);
+ auto closestDeposite = nav_->GetClosestDepositeZone(pos);
+
+ if (closestBox && closestDeposite)
+ {
+ double distToBox = Point::distance(Point(pos->x, pos->y, pos->theta),
+ closestBox->GetPosition());
+ double distToDeposite = Point::distance(Point(pos->x, pos->y, pos->theta),
+ closestDeposite->GetPosition());
+
+ if (distToBox < distToDeposite)
+ {
+ RCLCPP_INFO(get_logger(), "Choosing TAKE mission (dist to box: %.2f < dist to deposite: %.2f)",
+ distToBox, distToDeposite);
+ Transition(State::TAKE_MISSION, "Selecting TAKE mission");
+ }
+ else
+ {
+ RCLCPP_INFO(get_logger(), "Choosing FREE mission (dist to deposite: %.2f < dist to box: %.2f)",
+ distToDeposite, distToBox);
+ Transition(State::FREE_MISSION, "Selecting FREE mission");
+ }
+ }
+ else if (closestBox)
+ {
+ RCLCPP_INFO(get_logger(), "Only box available, selecting TAKE mission");
+ Transition(State::TAKE_MISSION, "Selecting TAKE mission");
+ }
+ else if (closestDeposite)
+ {
+ RCLCPP_INFO(get_logger(), "Only deposite available, selecting FREE mission");
+ Transition(State::FREE_MISSION, "Selecting FREE mission");
+ }
+ else
+ {
+ RCLCPP_WARN(get_logger(), "No box or deposite available, cannot select mission!");
+ Transition(State::STOP, "No missions available");
+ }
}
}
@@ -207,28 +271,73 @@ namespace Modelec
case State::TAKE_MISSION:
if (!current_mission_)
{
- current_mission_ = std::make_unique(nav_, action_executor_);
- current_mission_->Start(shared_from_this());
+ if (action_executor_->HasFrontBox())
+ {
+ if (action_executor_->HasBackBox())
+ {
+ RCLCPP_WARN(get_logger(), "Both front and back box obstacles are occupied!");
+ current_mission_.reset();
+ Transition(State::SELECT_MISSION, "Cannot take box, both sides occupied");
+ break;
+ }
+
+ RCLCPP_INFO(get_logger(), "Front box obstacle is occupied, taking from back");
+ current_mission_ = std::make_unique(nav_, action_executor_, BaseAction::BACK);
+ current_mission_->Start(shared_from_this());
+ }
+ else
+ {
+ current_mission_ = std::make_unique(nav_, action_executor_, BaseAction::FRONT);
+ current_mission_->Start(shared_from_this());
+ }
}
current_mission_->Update();
if (current_mission_->GetStatus() == MissionStatus::DONE)
{
current_mission_.reset();
Transition(State::SELECT_MISSION, "Take done");
+ }
+ else if (current_mission_->GetStatus() == MissionStatus::FAILED)
+ {
+ current_mission_.reset();
+ RCLCPP_ERROR(get_logger(), "Take mission failed!");
+ Transition(State::SELECT_MISSION, "Take mission failed");
}
break;
case State::FREE_MISSION:
if (!current_mission_)
{
- current_mission_ = std::make_unique(nav_, action_executor_);
- current_mission_->Start(shared_from_this());
+ if (!action_executor_->HasFrontBox())
+ {
+ if (!action_executor_->HasBackBox())
+ {
+ RCLCPP_WARN(get_logger(), "Both front and back box obstacles are free!");
+ Transition(State::SELECT_MISSION, "Cannot free box, both sides empty");
+ break;
+ }
+
+ RCLCPP_INFO(get_logger(), "Front box obstacle is occupied, taking from back");
+ current_mission_ = std::make_unique(nav_, action_executor_, BaseAction::BACK);
+ current_mission_->Start(shared_from_this());
+ }
+ else
+ {
+ current_mission_ = std::make_unique(nav_, action_executor_, BaseAction::FRONT);
+ current_mission_->Start(shared_from_this());
+ }
}
current_mission_->Update();
if (current_mission_->GetStatus() == MissionStatus::DONE)
{
current_mission_.reset();
Transition(State::SELECT_MISSION, "Free done");
+ }
+ else if (current_mission_->GetStatus() == MissionStatus::FAILED)
+ {
+ current_mission_.reset();
+ RCLCPP_ERROR(get_logger(), "Free mission failed!");
+ Transition(State::SELECT_MISSION, "Free mission failed");
}
break;
@@ -243,6 +352,12 @@ namespace Modelec
{
current_mission_.reset();
Transition(State::STOP, "Cleanup done");
+ }
+ else if (current_mission_->GetStatus() == MissionStatus::FAILED)
+ {
+ current_mission_.reset();
+ RCLCPP_ERROR(get_logger(), "Go Home mission failed!");
+ Transition(State::STOP, "Go Home mission failed");
}
break;
diff --git a/src/modelec_utils/include/modelec_utils/point.hpp b/src/modelec_utils/include/modelec_utils/point.hpp
index 578286f..90850ac 100644
--- a/src/modelec_utils/include/modelec_utils/point.hpp
+++ b/src/modelec_utils/include/modelec_utils/point.hpp
@@ -1,6 +1,6 @@
#pragma once
-#define CLOSE_DISTANCE 150
+#define CLOSE_DISTANCE 165
#define BASE_DISTANCE 290
namespace Modelec
diff --git a/start_ros2.sh b/start_ros2.sh
index 56c9bba..25ed44d 100755
--- a/start_ros2.sh
+++ b/start_ros2.sh
@@ -2,11 +2,11 @@
set -e
source /opt/ros/jazzy/setup.bash
-source /home/modelec/modelec-marcel-ROS/install/setup.bash
+source /home/modelec/Modelec-ROS2/install/setup.bash
export RCL_LOG_LEVEL=info
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
-export FASTRTPS_DEFAULT_PROFILES_FILE=/home/modelec/modelec-marcel-ROS/fastdds_setup.xml
+export FASTRTPS_DEFAULT_PROFILES_FILE=/home/modelec/Modelec-ROS2/fastdds_setup.xml
export ROS_DOMAIN_ID=128
exec ros2 launch modelec_core modelec.launch.py "$@"