@@ -38,7 +38,7 @@ DockingServer::DockingServer(const rclcpp::NodeOptions & options)
38
38
declare_parameter (" max_retries" , 3 );
39
39
declare_parameter (" base_frame" , " base_link" );
40
40
declare_parameter (" fixed_frame" , " odom" );
41
- declare_parameter (" dock_backwards" , false );
41
+ declare_parameter (" dock_backwards" , rclcpp::PARAMETER_BOOL );
42
42
declare_parameter (" dock_prestaging_tolerance" , 0.5 );
43
43
}
44
44
@@ -57,10 +57,19 @@ DockingServer::on_configure(const rclcpp_lifecycle::State & state)
57
57
get_parameter (" max_retries" , max_retries_);
58
58
get_parameter (" base_frame" , base_frame_);
59
59
get_parameter (" fixed_frame" , fixed_frame_);
60
- get_parameter (" dock_backwards" , dock_backwards_);
61
60
get_parameter (" dock_prestaging_tolerance" , dock_prestaging_tolerance_);
62
61
RCLCPP_INFO (get_logger (), " Controller frequency set to %.4fHz" , controller_frequency_);
63
62
63
+ bool dock_backwards;
64
+ try {
65
+ if (get_parameter (" dock_backwards" , dock_backwards)) {
66
+ dock_backwards_ = dock_backwards;
67
+ RCLCPP_WARN (get_logger (), " Parameter dock_backwards is deprecated. "
68
+ " Please use the dock_direction parameter in your dock plugin instead." );
69
+ }
70
+ } catch (rclcpp::exceptions::ParameterUninitializedException & ex) {
71
+ }
72
+
64
73
vel_publisher_ = std::make_unique<nav2_util::TwistPublisher>(node, " cmd_vel" , 1 );
65
74
tf2_buffer_ = std::make_shared<tf2_ros::Buffer>(node->get_clock ());
66
75
@@ -155,6 +164,7 @@ DockingServer::on_cleanup(const rclcpp_lifecycle::State & /*state*/)
155
164
curr_dock_type_.clear ();
156
165
controller_.reset ();
157
166
vel_publisher_.reset ();
167
+ dock_backwards_.reset ();
158
168
return nav2_util::CallbackReturn::SUCCESS;
159
169
}
160
170
@@ -274,12 +284,17 @@ void DockingServer::dockRobot()
274
284
doInitialPerception (dock, dock_pose);
275
285
RCLCPP_INFO (get_logger (), " Successful initial dock detection" );
276
286
287
+ // Get the direction of the movement
288
+ bool dock_backward = dock_backwards_.has_value () ?
289
+ dock_backwards_.value () :
290
+ (dock->plugin ->getDockDirection () == opennav_docking_core::DockDirection::BACKWARD);
291
+
277
292
// Docking control loop: while not docked, run controller
278
293
rclcpp::Time dock_contact_time;
279
294
while (rclcpp::ok ()) {
280
295
try {
281
296
// Approach the dock using control law
282
- if (approachDock (dock, dock_pose)) {
297
+ if (approachDock (dock, dock_pose, dock_backward )) {
283
298
// We are docked, wait for charging to begin
284
299
RCLCPP_INFO (
285
300
get_logger (), " Made contact with dock, waiting for charge to start (if applicable)." );
@@ -312,7 +327,7 @@ void DockingServer::dockRobot()
312
327
}
313
328
314
329
// Reset to staging pose to try again
315
- if (!resetApproach (dock->getStagingPose ())) {
330
+ if (!resetApproach (dock->getStagingPose (), dock_backward )) {
316
331
// Cancelled, preempted, or shutting down
317
332
stashDockData (goal->use_dock_id , dock, false );
318
333
publishZeroVelocity ();
@@ -409,11 +424,13 @@ void DockingServer::doInitialPerception(Dock * dock, geometry_msgs::msg::PoseSta
409
424
}
410
425
}
411
426
412
- bool DockingServer::approachDock (Dock * dock, geometry_msgs::msg::PoseStamped & dock_pose)
427
+ bool DockingServer::approachDock (
428
+ Dock * dock, geometry_msgs::msg::PoseStamped & dock_pose, bool backward)
413
429
{
414
430
rclcpp::Rate loop_rate (controller_frequency_);
415
431
auto start = this ->now ();
416
432
auto timeout = rclcpp::Duration::from_seconds (dock_approach_timeout_);
433
+
417
434
while (rclcpp::ok ()) {
418
435
publishDockingFeedback (DockRobot::Feedback::CONTROLLING);
419
436
@@ -440,7 +457,7 @@ bool DockingServer::approachDock(Dock * dock, geometry_msgs::msg::PoseStamped &
440
457
441
458
// Make sure that the target pose is pointing at the robot when moving backwards
442
459
// This is to ensure that the robot doesn't try to dock from the wrong side
443
- if (dock_backwards_ ) {
460
+ if (backward ) {
444
461
target_pose.pose .orientation = nav2_util::geometry_utils::orientationAroundZAxis (
445
462
tf2::getYaw (target_pose.pose .orientation ) + M_PI);
446
463
}
@@ -458,9 +475,7 @@ bool DockingServer::approachDock(Dock * dock, geometry_msgs::msg::PoseStamped &
458
475
// Compute and publish controls
459
476
auto command = std::make_unique<geometry_msgs::msg::TwistStamped>();
460
477
command->header .stamp = now ();
461
- if (!controller_->computeVelocityCommand (target_pose.pose , command->twist , true ,
462
- dock_backwards_))
463
- {
478
+ if (!controller_->computeVelocityCommand (target_pose.pose , command->twist , true , backward)) {
464
479
throw opennav_docking_core::FailedToControl (" Failed to get control" );
465
480
}
466
481
vel_publisher_->publish (std::move (command));
@@ -507,7 +522,8 @@ bool DockingServer::waitForCharge(Dock * dock)
507
522
return false ;
508
523
}
509
524
510
- bool DockingServer::resetApproach (const geometry_msgs::msg::PoseStamped & staging_pose)
525
+ bool DockingServer::resetApproach (
526
+ const geometry_msgs::msg::PoseStamped & staging_pose, bool backward)
511
527
{
512
528
rclcpp::Rate loop_rate (controller_frequency_);
513
529
auto start = this ->now ();
@@ -527,7 +543,7 @@ bool DockingServer::resetApproach(const geometry_msgs::msg::PoseStamped & stagin
527
543
command->header .stamp = now ();
528
544
if (getCommandToPose (
529
545
command->twist , staging_pose, undock_linear_tolerance_, undock_angular_tolerance_, false ,
530
- !dock_backwards_ ))
546
+ !backward ))
531
547
{
532
548
return true ;
533
549
}
@@ -653,9 +669,13 @@ void DockingServer::undockRobot()
653
669
// Get command to approach staging pose
654
670
auto command = std::make_unique<geometry_msgs::msg::TwistStamped>();
655
671
command->header .stamp = now ();
672
+ bool dock_backward = dock_backwards_.has_value () ?
673
+ dock_backwards_.value () :
674
+ (dock->getDockDirection () == opennav_docking_core::DockDirection::BACKWARD);
675
+
656
676
if (getCommandToPose (
657
677
command->twist , staging_pose, undock_linear_tolerance_, undock_angular_tolerance_, false ,
658
- !dock_backwards_ ))
678
+ !dock_backward ))
659
679
{
660
680
RCLCPP_INFO (get_logger (), " Robot has reached staging pose" );
661
681
// Have reached staging_pose
0 commit comments