Skip to content

Commit 007bb81

Browse files
authored
Feat/waypoint manager (#645)
* waypoint mode handling * update tests with new message * initial package setup * ros interface function declaration * node setup * working prototype * reentrant cb, multithreaded * single threaded impl * conv threshold action goal * default thresholdref conv value * removed switching logic * removed timer execution * sim test utils * waypoint_manager_test setup * no rendering test arg * waypoint tests, timeout error * test refactor * format * rename utils package * test suite and description * first waypoint test * removed unused function * renamed service field to priority. Added simple tests * waypoint manager readme * uniform attitude naming convention * fix pr requests * update tests with new service fields * four corner test * update util func name * update with new action def * removed failing build type * test dependencies * ignore failing yasmin package * remove __init__ files * quat_to_euler in make_pose helper * added __init__ file * removed sim deps for test packages * added action shutdown handling * removed waypoint manager set setup * added waypoint manager node tests * waypoint manager 4 corner sim test * added missing launch testing test dependency * add sleep for topic discovery * fix action member field name * removed unnecessary if here
1 parent 54caaa7 commit 007bb81

20 files changed

Lines changed: 1445 additions & 56 deletions

File tree

.github/workflows/simulator-test.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ jobs:
1616
setup_script: "tests/setup.sh"
1717
test_scripts: '[
1818
"tests/simulator_tests/waypoint_navigation/simulator_test.sh",
19-
"tests/simulator_tests/los_test/simulator_test.sh"
19+
"tests/simulator_tests/los_test/simulator_test.sh",
20+
"tests/simulator_tests/waypoint_manager_test/simulator_test.sh"
2021
]'

.gitignore

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,4 @@ qtcreator-*
5757
# Emacs
5858
.#*
5959

60-
# Catkin custom files
61-
COLCON_IGNORE
62-
6360
# End of https://www.gitignore.io/api/ros

guidance/reference_filter_dp/include/reference_filter_dp/reference_filter_ros.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,9 @@ class ReferenceFilterNode : public rclcpp::Node {
7474

7575
Eigen::Vector18d fill_reference_state();
7676

77-
Eigen::Vector6d fill_reference_goal(
78-
const geometry_msgs::msg::PoseStamped& goal);
77+
Eigen::Vector6d fill_reference_goal(const geometry_msgs::msg::Pose& goal);
78+
79+
Eigen::Vector6d apply_mode_logic(const Eigen::Vector6d& r_in, uint8_t mode);
7980

8081
vortex_msgs::msg::ReferenceFilter fill_reference_msg();
8182

guidance/reference_filter_dp/src/reference_filter_ros.cpp

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -195,12 +195,12 @@ Eigen::Vector18d ReferenceFilterNode::fill_reference_state() {
195195
}
196196

197197
Eigen::Vector6d ReferenceFilterNode::fill_reference_goal(
198-
const geometry_msgs::msg::PoseStamped& goal) {
199-
double x{goal.pose.position.x};
200-
double y{goal.pose.position.y};
201-
double z{goal.pose.position.z};
198+
const geometry_msgs::msg::Pose& goal) {
199+
double x{goal.position.x};
200+
double y{goal.position.y};
201+
double z{goal.position.z};
202202

203-
const auto& o = goal.pose.orientation;
203+
const auto& o = goal.orientation;
204204
Eigen::Quaterniond q(o.w, o.x, o.y, o.z);
205205
Eigen::Vector3d euler_angles = vortex::utils::math::quat_to_euler(q);
206206
double roll{euler_angles(0)};
@@ -231,6 +231,43 @@ vortex_msgs::msg::ReferenceFilter ReferenceFilterNode::fill_reference_msg() {
231231
return feedback_msg;
232232
}
233233

234+
Eigen::Vector6d ReferenceFilterNode::apply_mode_logic(
235+
const Eigen::Vector6d& r_in,
236+
uint8_t mode) {
237+
Eigen::Vector6d r_out = r_in;
238+
239+
switch (mode) {
240+
case vortex_msgs::msg::Waypoint::FULL_POSE:
241+
break;
242+
243+
case vortex_msgs::msg::Waypoint::ONLY_POSITION:
244+
r_out(3) = x_(3);
245+
r_out(4) = x_(4);
246+
r_out(5) = x_(5);
247+
break;
248+
249+
case vortex_msgs::msg::Waypoint::FORWARD_HEADING: {
250+
double dx = r_in(0) - x_(0);
251+
double dy = r_in(1) - x_(1);
252+
253+
double forward_heading = std::atan2(dy, dx);
254+
255+
r_out(3) = 0.0;
256+
r_out(4) = 0.0;
257+
r_out(5) = vortex::utils::math::ssa(forward_heading);
258+
break;
259+
}
260+
261+
case vortex_msgs::msg::Waypoint::ONLY_ORIENTATION:
262+
r_out(0) = x_(0);
263+
r_out(1) = x_(1);
264+
r_out(2) = x_(2);
265+
break;
266+
}
267+
268+
return r_out;
269+
}
270+
234271
void ReferenceFilterNode::execute(
235272
const std::shared_ptr<rclcpp_action::ServerGoalHandle<
236273
vortex_msgs::action::ReferenceFilterWaypoint>> goal_handle) {
@@ -243,9 +280,21 @@ void ReferenceFilterNode::execute(
243280

244281
x_ = fill_reference_state();
245282

246-
const geometry_msgs::msg::PoseStamped goal = goal_handle->get_goal()->goal;
283+
const geometry_msgs::msg::Pose goal =
284+
goal_handle->get_goal()->waypoint.pose;
285+
uint8_t mode = goal_handle->get_goal()->waypoint.mode;
286+
double convergence_threshold =
287+
goal_handle->get_goal()->convergence_threshold;
288+
289+
if (convergence_threshold <= 0.0) {
290+
convergence_threshold = 0.1;
291+
spdlog::warn(
292+
"ReferenceFilter: Invalid convergence_threshold received (<= 0). "
293+
"Using default 0.1");
294+
}
247295

248-
r_ = fill_reference_goal(goal);
296+
Eigen::Vector6d r_temp = fill_reference_goal(goal);
297+
r_ = apply_mode_logic(r_temp, mode);
249298

250299
auto feedback = std::make_shared<
251300
vortex_msgs::action::ReferenceFilterWaypoint::Feedback>();
@@ -274,12 +323,12 @@ void ReferenceFilterNode::execute(
274323

275324
vortex_msgs::msg::ReferenceFilter feedback_msg = fill_reference_msg();
276325

277-
feedback->feedback = feedback_msg;
326+
feedback->reference = feedback_msg;
278327

279328
goal_handle->publish_feedback(feedback);
280329
reference_pub_->publish(feedback_msg);
281330

282-
if ((x_.head(6) - r_.head(6)).norm() < 0.1) {
331+
if ((x_.head(6) - r_.head(6)).norm() < convergence_threshold) {
283332
result->success = true;
284333
goal_handle->succeed(result);
285334
x_.head(6) = r_.head(6);
@@ -292,6 +341,17 @@ void ReferenceFilterNode::execute(
292341

293342
loop_rate.sleep();
294343
}
344+
if (!rclcpp::ok() && goal_handle->is_active()) {
345+
auto result = std::make_shared<
346+
vortex_msgs::action::ReferenceFilterWaypoint::Result>();
347+
result->success = false;
348+
349+
try {
350+
goal_handle->abort(result);
351+
} catch (...) {
352+
// Ignore exceptions during shutdown
353+
}
354+
}
295355
}
296356

297357
RCLCPP_COMPONENTS_REGISTER_NODE(ReferenceFilterNode)

mission/FSM/docking/COLCON_IGNORE

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Ignored temporarily to skip building while debugging yasmin upgrade
2+
# Remove this file to include the package in colcon builds again

mission/FSM/docking/src/docking.cpp

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,18 @@ ApproachDockingStationState::create_goal_handler(
7979

8080
blackboard->set<bool>("is_home", false);
8181

82-
docking_fsm::PoseStamped docking_offset_goal =
83-
blackboard->get<docking_fsm::PoseStamped>("docking_offset_goal");
82+
docking_fsm::Pose docking_offset_goal =
83+
blackboard->get<docking_fsm::PoseStamped>("docking_offset_goal").pose;
84+
85+
vortex_msgs::msg::Waypoint waypoint;
86+
waypoint.pose = docking_offset_goal;
8487

85-
goal.goal = docking_offset_goal;
88+
goal.waypoint = waypoint;
8689

8790
spdlog::info("Goal sent to action server:");
8891
spdlog::info(" Position: x = {}, y = {}, z = {}",
89-
docking_offset_goal.pose.position.x,
90-
docking_offset_goal.pose.position.y,
91-
docking_offset_goal.pose.position.z);
92+
docking_offset_goal.position.x, docking_offset_goal.position.y,
93+
docking_offset_goal.position.z);
9294

9395
return goal;
9496
}
@@ -113,15 +115,15 @@ void ApproachDockingStationState::print_feedback(
113115
std::shared_ptr<const docking_fsm::ApproachDockingAction::Feedback>
114116
feedback) {
115117
docking_fsm::Pose current_pose = docking_fsm::Pose();
116-
current_pose.position.x = feedback->feedback.x;
117-
current_pose.position.y = feedback->feedback.y;
118-
current_pose.position.z = feedback->feedback.z;
118+
current_pose.position.x = feedback->reference.x;
119+
current_pose.position.y = feedback->reference.y;
120+
current_pose.position.z = feedback->reference.z;
119121

120122
blackboard->set<docking_fsm::Pose>("current_pose", current_pose);
121123

122124
spdlog::debug("Current position: x = {}, y = {}, z = {}",
123-
feedback->feedback.x, feedback->feedback.y,
124-
feedback->feedback.z);
125+
feedback->reference.x, feedback->reference.y,
126+
feedback->reference.z);
125127
}
126128

127129
GoAboveDockingStationState::GoAboveDockingStationState(
@@ -145,7 +147,9 @@ GoAboveDockingStationState::create_goal_handler(
145147

146148
auto docking_offset_goal =
147149
blackboard->get<docking_fsm::PoseStamped>("docking_offset_goal");
148-
goal.goal = docking_offset_goal;
150+
vortex_msgs::msg::Waypoint waypoint;
151+
waypoint.pose = docking_offset_goal.pose;
152+
goal.waypoint = waypoint;
149153

150154
spdlog::info("Goal sent to action server:");
151155
spdlog::info(" Position: x = {}, y = {}, z = {}",
@@ -179,15 +183,15 @@ void GoAboveDockingStationState::print_feedback(
179183
std::shared_ptr<const docking_fsm::GoAboveDockingAction::Feedback>
180184
feedback) {
181185
docking_fsm::Pose current_pose = docking_fsm::Pose();
182-
current_pose.position.x = feedback->feedback.x;
183-
current_pose.position.y = feedback->feedback.y;
184-
current_pose.position.z = feedback->feedback.z;
186+
current_pose.position.x = feedback->reference.x;
187+
current_pose.position.y = feedback->reference.y;
188+
current_pose.position.z = feedback->reference.z;
185189

186190
blackboard->set<docking_fsm::Pose>("current_pose", current_pose);
187191

188192
spdlog::debug("Current position: x = {}, y = {}, z = {}",
189-
feedback->feedback.x, feedback->feedback.y,
190-
feedback->feedback.z);
193+
feedback->reference.x, feedback->reference.y,
194+
feedback->reference.z);
191195
}
192196

193197
ConvergeDockingStationState::ConvergeDockingStationState(
@@ -213,7 +217,9 @@ ConvergeDockingStationState::create_goal_handler(
213217

214218
docking_fsm::PoseStamped dock_pose =
215219
blackboard->get<docking_fsm::PoseStamped>("dock_pose");
216-
goal.goal = dock_pose;
220+
vortex_msgs::msg::Waypoint waypoint;
221+
waypoint.pose = dock_pose.pose;
222+
goal.waypoint = waypoint;
217223

218224
spdlog::info("Goal sent to action server:");
219225
spdlog::info(" Position: x = {}, y = {}, z = {}",
@@ -242,14 +248,14 @@ void ConvergeDockingStationState::print_feedback(
242248
std::shared_ptr<const docking_fsm::ConvergeDockingAction::Feedback>
243249
feedback) {
244250
docking_fsm::Pose current_pose = docking_fsm::Pose();
245-
current_pose.position.x = feedback->feedback.x;
246-
current_pose.position.y = feedback->feedback.y;
247-
current_pose.position.z = feedback->feedback.z;
251+
current_pose.position.x = feedback->reference.x;
252+
current_pose.position.y = feedback->reference.y;
253+
current_pose.position.z = feedback->reference.z;
248254

249255
blackboard->set<docking_fsm::Pose>("current_pose", current_pose);
250256
spdlog::debug("Current position: x = {}, y = {}, z = {}",
251-
feedback->feedback.x, feedback->feedback.y,
252-
feedback->feedback.z);
257+
feedback->reference.x, feedback->reference.y,
258+
feedback->reference.z);
253259
}
254260

255261
std::string DockedState(
@@ -286,7 +292,9 @@ docking_fsm::ReturnHomeAction::Goal ReturnHomeState::create_goal_handler(
286292
docking_fsm::PoseStamped start_pose =
287293
blackboard->get<docking_fsm::PoseStamped>("start_pose");
288294

289-
goal.goal = start_pose;
295+
vortex_msgs::msg::Waypoint waypoint;
296+
waypoint.pose = start_pose.pose;
297+
goal.waypoint = waypoint;
290298
spdlog::info("Goal sent to action server:");
291299
spdlog::info(" Position: x = {}, y = {}, z = {}",
292300
start_pose.pose.position.x, start_pose.pose.position.y,
@@ -313,17 +321,17 @@ void ReturnHomeState::print_feedback(
313321
std::shared_ptr<yasmin::blackboard::Blackboard> blackboard,
314322
std::shared_ptr<const docking_fsm::ReturnHomeAction::Feedback> feedback) {
315323
docking_fsm::Pose current_pose = docking_fsm::Pose();
316-
current_pose.position.x = feedback->feedback.x;
317-
current_pose.position.y = feedback->feedback.y;
318-
current_pose.position.z = feedback->feedback.z;
319-
current_pose.orientation.x = feedback->feedback.roll;
320-
current_pose.orientation.y = feedback->feedback.pitch;
321-
current_pose.orientation.z = feedback->feedback.yaw;
324+
current_pose.position.x = feedback->reference.x;
325+
current_pose.position.y = feedback->reference.y;
326+
current_pose.position.z = feedback->reference.z;
327+
current_pose.orientation.x = feedback->reference.roll;
328+
current_pose.orientation.y = feedback->reference.pitch;
329+
current_pose.orientation.z = feedback->reference.yaw;
322330

323331
blackboard->set<docking_fsm::Pose>("current_pose", current_pose);
324332
spdlog::debug("Current position: x = {}, y = {}, z = {}",
325-
feedback->feedback.x, feedback->feedback.y,
326-
feedback->feedback.z);
333+
feedback->reference.x, feedback->reference.y,
334+
feedback->reference.z);
327335
}
328336

329337
std::string AbortState(
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
cmake_minimum_required(VERSION 3.8)
2+
project(waypoint_manager)
3+
4+
if(NOT CMAKE_CXX_STANDARD)
5+
set(CMAKE_CXX_STANDARD 20)
6+
endif()
7+
8+
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
9+
add_compile_options(-Wall -Wextra -Wpedantic)
10+
endif()
11+
12+
find_package(ament_cmake REQUIRED)
13+
find_package(rclcpp REQUIRED)
14+
find_package(rclcpp_action REQUIRED)
15+
find_package(rclcpp_components REQUIRED)
16+
find_package(vortex_msgs REQUIRED)
17+
find_package(vortex_utils REQUIRED)
18+
find_package(tf2_geometry_msgs REQUIRED)
19+
find_package(spdlog REQUIRED)
20+
find_package(fmt REQUIRED)
21+
22+
include_directories(include)
23+
24+
set(LIB_NAME "${PROJECT_NAME}_component")
25+
26+
add_library(${LIB_NAME} SHARED
27+
src/waypoint_manager_ros.cpp)
28+
29+
ament_target_dependencies(${LIB_NAME} PUBLIC
30+
rclcpp
31+
rclcpp_components
32+
rclcpp_action
33+
vortex_msgs
34+
vortex_utils
35+
tf2_geometry_msgs
36+
spdlog
37+
fmt
38+
)
39+
40+
rclcpp_components_register_node(
41+
${LIB_NAME}
42+
PLUGIN "WaypointManagerNode"
43+
EXECUTABLE ${PROJECT_NAME}_node
44+
)
45+
46+
ament_export_targets(export_${LIB_NAME})
47+
48+
install(TARGETS ${LIB_NAME}
49+
EXPORT export_${LIB_NAME}
50+
ARCHIVE DESTINATION lib
51+
LIBRARY DESTINATION lib
52+
RUNTIME DESTINATION bin
53+
)
54+
55+
install(
56+
DIRECTORY include/
57+
DESTINATION include
58+
)
59+
60+
install(DIRECTORY
61+
launch
62+
DESTINATION share/${PROJECT_NAME}/
63+
)
64+
65+
if(BUILD_TESTING)
66+
add_subdirectory(test)
67+
endif()
68+
69+
ament_package()

0 commit comments

Comments
 (0)