This commit is contained in:
acki
2025-05-23 14:04:59 -04:00
parent 0789157951
commit daa72726c6
9 changed files with 140 additions and 22 deletions

View File

@@ -1,2 +1,4 @@
- rework position system with that https://docs.ros2.org/latest/api/geometry_msgs/index-msg.html - API (check for the middleware already implemented or fill the API package)
- API (check for the middleware already implemented or fill the API package)
- Check every value and after that update the max TIME mission

View File

@@ -2,6 +2,7 @@
#include <rclcpp/rclcpp.hpp> #include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp> #include <std_msgs/msg/string.hpp>
#include <std_msgs/msg/empty.hpp>
#include <modelec_interfaces/srv/add_serial_listener.hpp> #include <modelec_interfaces/srv/add_serial_listener.hpp>
#include <modelec_interfaces/msg/action_asc_pos.hpp> #include <modelec_interfaces/msg/action_asc_pos.hpp>
#include <modelec_interfaces/msg/action_relay_state.hpp> #include <modelec_interfaces/msg/action_relay_state.hpp>
@@ -60,6 +61,14 @@ namespace Modelec
rclcpp::Publisher<modelec_interfaces::msg::ActionServoPos>::SharedPtr servo_move_res_pub_; rclcpp::Publisher<modelec_interfaces::msg::ActionServoPos>::SharedPtr servo_move_res_pub_;
rclcpp::Publisher<modelec_interfaces::msg::ActionRelayState>::SharedPtr relay_move_res_pub_; rclcpp::Publisher<modelec_interfaces::msg::ActionRelayState>::SharedPtr relay_move_res_pub_;
rclcpp::Publisher<std_msgs::msg::Empty>::SharedPtr tir_start_pub_;
rclcpp::Publisher<std_msgs::msg::Empty>::SharedPtr tir_arm_pub_;
rclcpp::Publisher<std_msgs::msg::Empty>::SharedPtr tir_disarm_pub_;
rclcpp::Subscription<std_msgs::msg::Empty>::SharedPtr tir_start_sub_;
rclcpp::Subscription<std_msgs::msg::Empty>::SharedPtr tir_arm_sub_;
rclcpp::Subscription<std_msgs::msg::Empty>::SharedPtr tir_disarm_sub_;
bool isOk = false; bool isOk = false;
public: public:
@@ -70,5 +79,6 @@ namespace Modelec
void GetData(const std::string& elem, const std::vector<std::string>& data = {}) const; void GetData(const std::string& elem, const std::vector<std::string>& data = {}) const;
void SendOrder(const std::string& elem, const std::vector<std::string>& data = {}) const; void SendOrder(const std::string& elem, const std::vector<std::string>& data = {}) const;
void SendMove(const std::string& elem, const std::vector<std::string>& data = {}) const; void SendMove(const std::string& elem, const std::vector<std::string>& data = {}) const;
void RespondEvent(const std::string& elem, const std::vector<std::string>& data = {}) const;
}; };
} }

View File

@@ -156,6 +156,36 @@ namespace Modelec
relay_move_res_pub_ = this->create_publisher<modelec_interfaces::msg::ActionRelayState>( relay_move_res_pub_ = this->create_publisher<modelec_interfaces::msg::ActionRelayState>(
"action/move/relay/res", 10); "action/move/relay/res", 10);
tir_start_pub_ = this->create_publisher<std_msgs::msg::Empty>(
"action/tir/start", 10);
tir_start_sub_ = this->create_subscription<std_msgs::msg::Empty>(
"action/tir/start/res", 10,
[this](const std_msgs::msg::Empty::SharedPtr)
{
RespondEvent("TIR", {"START"});
});
tir_arm_pub_ = this->create_publisher<std_msgs::msg::Empty>(
"action/tir/arm", 10);
tir_arm_sub_ = this->create_subscription<std_msgs::msg::Empty>(
"action/tir/arm/res", 10,
[this](const std_msgs::msg::Empty::SharedPtr)
{
RespondEvent("TIR", {"ARM"});
});
tir_disarm_pub_ = this->create_publisher<std_msgs::msg::Empty>(
"action/tir/disarm", 10);
tir_disarm_sub_ = this->create_subscription<std_msgs::msg::Empty>(
"action/tir/disarm/res", 10,
[this](const std_msgs::msg::Empty::SharedPtr)
{
RespondEvent("TIR", {"DIS"});
});
// TODO : check for real value there // TODO : check for real value there
asc_value_mapper_ = { asc_value_mapper_ = {
@@ -203,7 +233,6 @@ namespace Modelec
} }
relay_value_ = { relay_value_ = {
{0, false},
{1, false}, {1, false},
{2, false}, {2, false},
}; };
@@ -383,6 +412,27 @@ namespace Modelec
relay_move_res_pub_->publish(relay_msg); relay_move_res_pub_->publish(relay_msg);
} }
} }
else if (tokens[0] == "EVENT")
{
if (tokens[1] == "TIR")
{
if (tokens[2] == "START")
{
tir_start_pub_->publish(std_msgs::msg::Empty());
RespondEvent(tokens[1], {tokens[2]});
}
else if (tokens[2] == "ARM")
{
tir_arm_pub_->publish(std_msgs::msg::Empty());
RespondEvent(tokens[1], {tokens[2]});
}
else if (tokens[2] == "DIS")
{
tir_disarm_pub_->publish(std_msgs::msg::Empty());
RespondEvent(tokens[1], {tokens[2]});
}
}
}
else else
{ {
RCLCPP_WARN(this->get_logger(), "Unknown message format"); RCLCPP_WARN(this->get_logger(), "Unknown message format");
@@ -427,6 +477,11 @@ namespace Modelec
{ {
SendToPCB("MOV", elem, data); SendToPCB("MOV", elem, data);
} }
void PCBActionInterface::RespondEvent(const std::string& elem, const std::vector<std::string>& data) const
{
SendToPCB("ACK", elem, data);
}
} }
int main(int argc, char** argv) int main(int argc, char** argv)

View File

@@ -56,6 +56,8 @@ namespace Modelec
void PlacePot(); void PlacePot();
void ReInit();
protected: protected:
/* /*
rclcpp::Publisher<modelec_interfaces::msg::ActionAscPos>::SharedPtr asc_get_pub_; rclcpp::Publisher<modelec_interfaces::msg::ActionAscPos>::SharedPtr asc_get_pub_;

View File

@@ -26,6 +26,8 @@ namespace Modelec
NavigationHelper(const rclcpp::Node::SharedPtr& node); NavigationHelper(const rclcpp::Node::SharedPtr& node);
void ReInit();
rclcpp::Node::SharedPtr GetNode() const; rclcpp::Node::SharedPtr GetNode() const;
std::shared_ptr<Pathfinding> GetPathfinding() const; std::shared_ptr<Pathfinding> GetPathfinding() const;

View File

@@ -42,8 +42,12 @@ namespace Modelec
void Init(); void Init();
void ReInit();
void Reset(); void Reset();
void ResetStrat();
protected: protected:
void Transition(State next, const std::string& reason); void Transition(State next, const std::string& reason);
@@ -61,12 +65,13 @@ namespace Modelec
std::shared_ptr<NavigationHelper> nav_; std::shared_ptr<NavigationHelper> nav_;
std::shared_ptr<ActionExecutor> action_executor_; std::shared_ptr<ActionExecutor> action_executor_;
rclcpp::Subscription<std_msgs::msg::Bool>::SharedPtr tirette_sub_; rclcpp::Subscription<std_msgs::msg::Empty>::SharedPtr tir_sub_;
rclcpp::Publisher<modelec_interfaces::msg::StratState>::SharedPtr state_pub_; rclcpp::Publisher<modelec_interfaces::msg::StratState>::SharedPtr state_pub_;
rclcpp::Publisher<std_msgs::msg::Int64>::SharedPtr start_time_pub_; rclcpp::Publisher<std_msgs::msg::Int64>::SharedPtr start_time_pub_;
rclcpp::Subscription<std_msgs::msg::Int8>::SharedPtr team_id_sub_; rclcpp::Subscription<std_msgs::msg::Int8>::SharedPtr team_id_sub_;
rclcpp::Subscription<modelec_interfaces::msg::Spawn>::SharedPtr spawn_id_sub_; rclcpp::Subscription<modelec_interfaces::msg::Spawn>::SharedPtr spawn_id_sub_;
rclcpp::Subscription<std_msgs::msg::Empty>::SharedPtr reset_strat_sub_; rclcpp::Subscription<std_msgs::msg::Empty>::SharedPtr reset_strat_sub_;
rclcpp::Subscription<std_msgs::msg::Empty>::SharedPtr tir_arm_sub_;
rclcpp::Client<modelec_interfaces::srv::OdometryStart>::SharedPtr client_start_; rclcpp::Client<modelec_interfaces::srv::OdometryStart>::SharedPtr client_start_;
}; };

View File

@@ -120,12 +120,12 @@ namespace Modelec
{ {
modelec_interfaces::msg::ActionRelayState relay_top_msg; modelec_interfaces::msg::ActionRelayState relay_top_msg;
relay_top_msg.state = true; // TODO : check that relay_top_msg.state = true; // TODO : check that
relay_top_msg.id = 0; // TODO : to define relay_top_msg.id = 2;
relay_move_pub_->publish(relay_top_msg); relay_move_pub_->publish(relay_top_msg);
modelec_interfaces::msg::ActionRelayState relay_bottom_msg; modelec_interfaces::msg::ActionRelayState relay_bottom_msg;
relay_bottom_msg.state = true; // TODO : check that relay_bottom_msg.state = true; // TODO : check that
relay_bottom_msg.id = 1; // TODO : to define relay_bottom_msg.id = 1;
relay_move_pub_->publish(relay_bottom_msg); relay_move_pub_->publish(relay_bottom_msg);
modelec_interfaces::msg::ActionServoPos first_pot_msg; modelec_interfaces::msg::ActionServoPos first_pot_msg;
@@ -224,12 +224,12 @@ namespace Modelec
{ {
modelec_interfaces::msg::ActionRelayState relay_top_msg; modelec_interfaces::msg::ActionRelayState relay_top_msg;
relay_top_msg.state = false; // TODO : check that relay_top_msg.state = false; // TODO : check that
relay_top_msg.id = 0; // TODO : to define relay_top_msg.id = 2;
relay_move_pub_->publish(relay_top_msg); relay_move_pub_->publish(relay_top_msg);
modelec_interfaces::msg::ActionRelayState relay_bottom_msg; modelec_interfaces::msg::ActionRelayState relay_bottom_msg;
relay_bottom_msg.state = false; // TODO : check that relay_bottom_msg.state = false; // TODO : check that
relay_bottom_msg.id = 1; // TODO : to define relay_bottom_msg.id = 1;
relay_move_pub_->publish(relay_bottom_msg); relay_move_pub_->publish(relay_bottom_msg);
modelec_interfaces::msg::ActionServoPos first_pot_msg; modelec_interfaces::msg::ActionServoPos first_pot_msg;
@@ -324,4 +324,15 @@ namespace Modelec
Update(); Update();
} }
} }
void ActionExecutor::ReInit()
{
action_done_ = true;
step_running_ = 0;
while (!step_.empty())
{
step_.pop();
}
action_ = NONE;
}
} }

View File

@@ -95,6 +95,11 @@ namespace Modelec
}); });
} }
void NavigationHelper::ReInit()
{
SetPos(spawn_);
}
rclcpp::Node::SharedPtr NavigationHelper::GetNode() const rclcpp::Node::SharedPtr NavigationHelper::GetNode() const
{ {
return node_; return node_;
@@ -584,12 +589,15 @@ namespace Modelec
{ {
case YELLOW: case YELLOW:
SetPos(spawn_yellow_[name]); SetPos(spawn_yellow_[name]);
spawn_ = spawn_yellow_[name];
break; break;
case BLUE: case BLUE:
SetPos(spawn_blue_[name]); SetPos(spawn_blue_[name]);
spawn_ = spawn_blue_[name];
break; break;
default: default:
SetPos(spawn_yellow_[name]); SetPos(spawn_yellow_[name]);
spawn_ = spawn_yellow_[name];
break; break;
} }
} }

View File

@@ -7,10 +7,12 @@ namespace Modelec
StratFMS::StratFMS() : Node("start_fms") StratFMS::StratFMS() : Node("start_fms")
{ {
tirette_sub_ = create_subscription<std_msgs::msg::Bool>( tir_sub_ = create_subscription<std_msgs::msg::Empty>(
"/tirette", 10, [this](const std_msgs::msg::Bool::SharedPtr msg) "/action/tir/start", 10, [this](const std_msgs::msg::Empty::SharedPtr)
{ {
if (setup_ && !started_ && msg->data) RCLCPP_INFO(get_logger(), "TIR started");
if (setup_ && !started_)
{ {
started_ = true; started_ = true;
} }
@@ -30,7 +32,6 @@ namespace Modelec
spawn_id_sub_ = create_subscription<modelec_interfaces::msg::Spawn>( spawn_id_sub_ = create_subscription<modelec_interfaces::msg::Spawn>(
"/strat/spawn", 10, [this](const modelec_interfaces::msg::Spawn::SharedPtr msg) "/strat/spawn", 10, [this](const modelec_interfaces::msg::Spawn::SharedPtr msg)
{ {
setup_ = true;
team_id_ = msg->team_id; team_id_ = msg->team_id;
nav_->SetTeamId(team_id_); nav_->SetTeamId(team_id_);
nav_->SetSpawn(msg->name); nav_->SetSpawn(msg->name);
@@ -43,6 +44,13 @@ namespace Modelec
Reset(); Reset();
}); });
tir_arm_sub_ = create_subscription<std_msgs::msg::Empty>(
"/action/tir/arm", 10, [this](const std_msgs::msg::Empty::SharedPtr)
{
RCLCPP_INFO(get_logger(), "TIR armed");
setup_ = true;
});
client_start_ = create_client<modelec_interfaces::srv::OdometryStart>("/odometry/start"); client_start_ = create_client<modelec_interfaces::srv::OdometryStart>("/odometry/start");
while (!client_start_->wait_for_service(std::chrono::seconds(1))) { while (!client_start_->wait_for_service(std::chrono::seconds(1))) {
if (!rclcpp::ok()) { if (!rclcpp::ok()) {
@@ -74,10 +82,30 @@ namespace Modelec
action_executor_ = std::make_unique<ActionExecutor>(shared_from_this()); action_executor_ = std::make_unique<ActionExecutor>(shared_from_this());
RCLCPP_INFO(this->get_logger(), "StratFMS fully initialized"); RCLCPP_INFO(this->get_logger(), "StratFMS fully initialized");
}
void StratFMS::ReInit()
{
nav_->ReInit();
action_executor_->ReInit();
setup_ = false;
}
void StratFMS::Reset()
{
ReInit();
ResetStrat();
}
void StratFMS::ResetStrat()
{
if (timer_)
{
timer_->cancel();
}
state_ = State::INIT; state_ = State::INIT;
started_ = false; started_ = false;
setup_ = false;
current_mission_.reset(); current_mission_.reset();
match_start_time_ = rclcpp::Time(0, 0, RCL_ROS_TIME); match_start_time_ = rclcpp::Time(0, 0, RCL_ROS_TIME);
@@ -87,13 +115,6 @@ namespace Modelec
}); });
} }
void StratFMS::Reset()
{
timer_->cancel();
Init();
}
void StratFMS::Transition(State next, const std::string& reason) void StratFMS::Transition(State next, const std::string& reason)
{ {
RCLCPP_INFO(get_logger(), "Transition %d -> %d: %s", static_cast<int>(state_), static_cast<int>(next), RCLCPP_INFO(get_logger(), "Transition %d -> %d: %s", static_cast<int>(state_), static_cast<int>(next),
@@ -112,8 +133,10 @@ namespace Modelec
switch (state_) switch (state_)
{ {
case State::INIT: case State::INIT:
RCLCPP_INFO_ONCE(get_logger(), "State: INIT"); if (setup_)
Transition(State::WAIT_START, "System ready"); {
Transition(State::WAIT_START, "System ready");
}
break; break;
case State::WAIT_START: case State::WAIT_START:
if (started_) if (started_)