SMACC2
Loading...
Searching...
No Matches
cb_navigate_forward.cpp
Go to the documentation of this file.
1// Copyright 2021 RobosoftAI Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15/*****************************************************************************************************************
16 *
17 * Authors: Pablo Inigo Blasco, Brett Aldrich
18 *
19 ******************************************************************************************************************/
20
21#include <cl_nav2z/common.hpp>
22
27
28namespace cl_nav2z
29{
30using ::cl_nav2z::odom_tracker::CpOdomTracker;
31using ::cl_nav2z::odom_tracker::WorkingMode;
32
33using ::cl_nav2z::CpPose;
34using namespace smacc2;
35
36CbNavigateForward::CbNavigateForward(float distance_meters) : forwardDistance_(distance_meters) {}
38
39CbNavigateForward::CbNavigateForward(geometry_msgs::msg::PoseStamped goal) : goalPose_(goal) {}
40
42
43void CbNavigateForward::setForwardDistance(float distance_meters)
44{
45 if (distance_meters < 0)
46 {
47 RCLCPP_INFO_STREAM(
48 getLogger(), "[" << getName() << "] negative forward distance: " << distance_meters
49 << ". Resetting to 0.");
50 distance_meters = 0;
51 }
52 forwardDistance_ = distance_meters;
53
54 RCLCPP_INFO_STREAM(
55 getLogger(), "[" << getName() << "] setting fw motion distance: " << *forwardDistance_);
56}
57
59{
61 {
63
64 RCLCPP_INFO_STREAM(
65 getLogger(), "[" << getName() << "] Straight motion distance: " << *forwardDistance_);
66 }
67
68 // get current pose
69 CpPose * p;
70 this->requiresComponent(p, ComponentRequirement::HARD);
71
72 auto referenceFrame = p->getReferenceFrame();
73 auto currentPoseMsg = p->toPoseMsg();
74
75 RCLCPP_INFO_STREAM(getLogger(), "[" << getName() << "]" << "current pose: " << currentPoseMsg);
76
77 // force global orientation if it is requested
79 {
80 currentPoseMsg.orientation = *(options.forceInitialOrientation);
81 RCLCPP_WARN_STREAM(
82 getLogger(), "[" << getName() << "]" << "Forcing initial straight motion orientation: "
83 << currentPoseMsg.orientation);
84 }
85
86 tf2::Transform currentPose;
87 tf2::fromMsg(currentPoseMsg, currentPose);
88
89 tf2::Transform targetPose;
90 if (goalPose_)
91 {
92 tf2::fromMsg(goalPose_->pose, targetPose);
93 }
94 else if (forwardDistance_)
95 {
96 // compute forward goal pose
97 tf2::Transform forwardDeltaTransform;
98 forwardDeltaTransform.setIdentity();
99 forwardDeltaTransform.setOrigin(tf2::Vector3(*forwardDistance_, 0, 0));
100
101 targetPose = currentPose * forwardDeltaTransform;
102 }
103 else
104 {
105 RCLCPP_WARN_STREAM(
106 getLogger(),
107 "[" << getName() << "]"
108 << "No goal Pose or Distance is specified. Aborting. No action request is sent."
109 << currentPoseMsg.orientation);
110
111 return;
112 }
113
114 // action goal
115 nav2_msgs::action::NavigateToPose::Goal goal;
116 goal.pose.header.frame_id = referenceFrame;
117 //goal.pose.header.stamp = getNode()->now();
118 tf2::toMsg(targetPose, goal.pose.pose);
119 RCLCPP_INFO_STREAM(
120 getLogger(), "[" << getName() << "]" << " TARGET POSE FORWARD: " << goal.pose.pose);
121
122 // current pose
123 geometry_msgs::msg::PoseStamped currentStampedPoseMsg;
124 currentStampedPoseMsg.header.frame_id = referenceFrame;
125 currentStampedPoseMsg.header.stamp =
126 getNode()->now(); // probably it is better avoid setting that goal timestamp
127
128 tf2::toMsg(currentPose, currentStampedPoseMsg.pose);
129
130 requiresComponent(odomTracker_, ComponentRequirement::SOFT);
131
132 if (odomTracker_ != nullptr)
133 {
134 auto pathname = this->getCurrentState()->getName() + " - " + getName();
135 odomTracker_->pushPath(pathname);
136 odomTracker_->setStartPoint(currentStampedPoseMsg);
138 odomTracker_->setWorkingMode(WorkingMode::RECORD_PATH);
139 }
140
141 CpPlannerSwitcher * plannerSwitcher;
142 this->requiresComponent(plannerSwitcher, ComponentRequirement::HARD);
143 plannerSwitcher->setForwardPlanner();
144
145 CpGoalCheckerSwitcher * goalCheckerSwitcher;
146 this->requiresComponent(goalCheckerSwitcher, ComponentRequirement::HARD);
147 goalCheckerSwitcher->setGoalCheckerId("forward_goal_checker");
148
149 this->sendGoal(goal);
150}
151
153{
154 if (odomTracker_)
155 {
156 this->odomTracker_->setWorkingMode(WorkingMode::IDLE);
157 }
158}
159
160} // namespace cl_nav2z
void sendGoal(nav2_msgs::action::NavigateToPose::Goal &goal)
std::optional< geometry_msgs::msg::PoseStamped > goalPose_
std::optional< float > forwardDistance_
CbNavigateForwardOptions options
void setForwardDistance(float distance_meters)
odom_tracker::CpOdomTracker * odomTracker_
void setGoalCheckerId(std::string goal_checker_id)
void setForwardPlanner(bool commit=true)
geometry_msgs::msg::Pose toPoseMsg()
Definition cp_pose.hpp:57
const std::string & getReferenceFrame() const
Definition cp_pose.hpp:79
void setCurrentMotionGoal(const geometry_msgs::msg::PoseStamped &pose)
void setWorkingMode(WorkingMode workingMode)
void setStartPoint(const geometry_msgs::msg::PoseStamped &pose)
virtual rclcpp::Logger getLogger() const
virtual rclcpp::Node::SharedPtr getNode() const
void requiresComponent(SmaccComponentType *&storage, ComponentRequirement requirementType=ComponentRequirement::SOFT)
virtual std::string getName()=0
std::optional< geometry_msgs::msg::Quaternion > forceInitialOrientation