SMACC2
Public Member Functions | Public Attributes | Private Member Functions | Private Attributes | List of all members
cl_nav2z::CbAbsoluteRotate Class Reference

#include <cb_absolute_rotate.hpp>

Inheritance diagram for cl_nav2z::CbAbsoluteRotate:
Inheritance graph
Collaboration diagram for cl_nav2z::CbAbsoluteRotate:
Collaboration graph

Public Member Functions

 CbAbsoluteRotate ()
 
 CbAbsoluteRotate (float absoluteGoalAngleDegree, float yawGoalTolerance=-1)
 
void onEntry () override
 
void onExit () override
 
- Public Member Functions inherited from cl_nav2z::CbNav2ZClientBehaviorBase
virtual ~CbNav2ZClientBehaviorBase ()
 
template<typename TOrthogonal , typename TSourceObject >
void onOrthogonalAllocation ()
 
- Public Member Functions inherited from smacc2::SmaccAsyncClientBehavior
template<typename TOrthogonal , typename TSourceObject >
void onOrthogonalAllocation ()
 
virtual ~SmaccAsyncClientBehavior ()
 
template<typename TCallback , typename T >
boost::signals2::connection onSuccess (TCallback callback, T *object)
 
template<typename TCallback , typename T >
boost::signals2::connection onFinished (TCallback callback, T *object)
 
template<typename TCallback , typename T >
boost::signals2::connection onFailure (TCallback callback, T *object)
 
- Public Member Functions inherited from smacc2::ISmaccClientBehavior
 ISmaccClientBehavior ()
 
virtual ~ISmaccClientBehavior ()
 
ISmaccStateMachinegetStateMachine ()
 
std::string getName () const
 
template<typename SmaccClientType >
void requiresClient (SmaccClientType *&storage)
 
template<typename SmaccComponentType >
void requiresComponent (SmaccComponentType *&storage)
 

Public Attributes

std::shared_ptr< tf2_ros::Buffer > listener
 
float absoluteGoalAngleDegree
 
std::optional< float > yawGoalTolerance
 
std::optional< float > maxVelTheta
 
std::optional< SpinningPlannerspinningPlanner
 

Private Member Functions

void updateTemporalBehaviorParameters (bool undo)
 

Private Attributes

float oldYawTolerance
 
float oldMaxVelTheta
 
float oldMinVelTheta
 

Additional Inherited Members

- Protected Member Functions inherited from smacc2::SmaccAsyncClientBehavior
void postSuccessEvent ()
 
void postFailureEvent ()
 
virtual void dispose () override
 
bool isShutdownRequested ()
 
- Protected Member Functions inherited from smacc2::ISmaccClientBehavior
virtual void runtimeConfigure ()
 
virtual void onEntry ()
 
virtual void onExit ()
 
template<typename EventType >
void postEvent (const EventType &ev)
 
template<typename EventType >
void postEvent ()
 
ISmaccStategetCurrentState ()
 
virtual void dispose ()
 
virtual rclcpp::Node::SharedPtr getNode ()
 
virtual rclcpp::Logger getLogger ()
 
- Protected Attributes inherited from cl_nav2z::CbNav2ZClientBehaviorBase
cl_nav2z::ClNav2ZmoveBaseClient_
 
rclcpp_action::ResultCode navigationResult_
 

Detailed Description

Definition at line 29 of file cb_absolute_rotate.hpp.

Constructor & Destructor Documentation

◆ CbAbsoluteRotate() [1/2]

cl_nav2z::CbAbsoluteRotate::CbAbsoluteRotate ( )

Definition at line 32 of file cb_absolute_rotate.cpp.

32{}

◆ CbAbsoluteRotate() [2/2]

cl_nav2z::CbAbsoluteRotate::CbAbsoluteRotate ( float  absoluteGoalAngleDegree,
float  yawGoalTolerance = -1 
)

Definition at line 33 of file cb_absolute_rotate.cpp.

34{
36
37 if (yaw_goal_tolerance >= 0)
38 {
39 this->yawGoalTolerance = yaw_goal_tolerance;
40 }
41}
std::optional< float > yawGoalTolerance

References absoluteGoalAngleDegree, and yawGoalTolerance.

Member Function Documentation

◆ onEntry()

void cl_nav2z::CbAbsoluteRotate::onEntry ( )
overridevirtual

Reimplemented from smacc2::ISmaccClientBehavior.

Definition at line 43 of file cb_absolute_rotate.cpp.

44{
45 listener = std::make_shared<tf2_ros::Buffer>(getNode()->get_clock());
46 double goal_angle = this->absoluteGoalAngleDegree;
47
48 RCLCPP_INFO_STREAM(getLogger(), "[CbAbsoluteRotate] Absolute yaw Angle:" << goal_angle);
49
50 auto plannerSwitcher = this->moveBaseClient_->getComponent<PlannerSwitcher>();
51 // this should work better with a coroutine and await
52 // this->plannerSwitcher_->setForwardPlanner();
53
55 {
56 plannerSwitcher->setPureSpinningPlanner();
57 }
58 else
59 {
60 plannerSwitcher->setDefaultPlanners();
61 }
62
64
66 auto referenceFrame = p->getReferenceFrame();
67 auto currentPoseMsg = p->toPoseMsg();
68
69 ClNav2Z::Goal goal;
70 goal.pose.header.frame_id = referenceFrame;
71 goal.pose.header.stamp = getNode()->now();
72
73 auto targetAngle = goal_angle * M_PI / 180.0;
74 goal.pose.pose.position = currentPoseMsg.position;
75 tf2::Quaternion q;
76 q.setRPY(0, 0, targetAngle);
77 goal.pose.pose.orientation = tf2::toMsg(q);
78
79 auto odomTracker_ = moveBaseClient_->getComponent<odom_tracker::OdomTracker>();
80 if (odomTracker_ != nullptr)
81 {
82 auto pathname = this->getCurrentState()->getName() + " - " + getName();
83 odomTracker_->pushPath(pathname);
84 odomTracker_->setStartPoint(p->toPoseStampedMsg());
85 odomTracker_->setWorkingMode(odom_tracker::WorkingMode::RECORD_PATH);
86 }
87
88 auto goalCheckerSwitcher = moveBaseClient_->getComponent<GoalCheckerSwitcher>();
89 goalCheckerSwitcher->setGoalCheckerId("absolute_rotate_goal_checker");
90
91 RCLCPP_INFO_STREAM(
92 getLogger(),
93 "[CbAbsoluteRotate] current pose yaw: " << tf2::getYaw(currentPoseMsg.orientation));
94 RCLCPP_INFO_STREAM(
95 getLogger(), "[CbAbsoluteRotate] goal pose yaw: " << tf2::getYaw(goal.pose.pose.orientation));
97}
std::optional< SpinningPlanner > spinningPlanner
void updateTemporalBehaviorParameters(bool undo)
std::shared_ptr< tf2_ros::Buffer > listener
const std::string & getReferenceFrame() const
Definition: cp_pose.hpp:77
virtual rclcpp::Node::SharedPtr getNode()
TComponent * getComponent()
virtual std::string getName()=0
std::shared_future< typename GoalHandle::SharedPtr > sendGoal(Goal &goal)

References absoluteGoalAngleDegree, smacc2::ISmaccClient::getComponent(), smacc2::ISmaccClientBehavior::getCurrentState(), smacc2::ISmaccClientBehavior::getLogger(), smacc2::ISmaccClientBehavior::getName(), smacc2::ISmaccState::getName(), smacc2::ISmaccClientBehavior::getNode(), cl_nav2z::Pose::getReferenceFrame(), listener, cl_nav2z::CbNav2ZClientBehaviorBase::moveBaseClient_, cl_nav2z::PureSpinning, cl_nav2z::odom_tracker::RECORD_PATH, smacc2::client_bases::SmaccActionClientBase< ActionType >::sendGoal(), cl_nav2z::GoalCheckerSwitcher::setGoalCheckerId(), cl_nav2z::PlannerSwitcher::setPureSpinningPlanner(), spinningPlanner, and updateTemporalBehaviorParameters().

Here is the call graph for this function:

◆ onExit()

void cl_nav2z::CbAbsoluteRotate::onExit ( )
overridevirtual

Reimplemented from smacc2::ISmaccClientBehavior.

Definition at line 264 of file cb_absolute_rotate.cpp.

265{
267 {
268 }
269 else
270 {
271 }
272
274}

References cl_nav2z::PureSpinning, spinningPlanner, and updateTemporalBehaviorParameters().

Here is the call graph for this function:

◆ updateTemporalBehaviorParameters()

void cl_nav2z::CbAbsoluteRotate::updateTemporalBehaviorParameters ( bool  undo)
private

Definition at line 99 of file cb_absolute_rotate.cpp.

100{
101 auto log = this->getLogger();
102
103 std::string nodename = "/controller_server";
104
105 auto parameters_client =
106 std::make_shared<rclcpp::AsyncParametersClient>(this->getNode(), nodename);
107
108 RCLCPP_INFO_STREAM(
109 log, "[CbAbsoluteRotate] using a parameter client to update some controller parameters: "
110 << nodename << ". Waiting service.");
111 parameters_client->wait_for_service();
112
113 RCLCPP_INFO_STREAM(log, "[CbAbsoluteRotate] Service found: " << nodename << ".");
114
115 std::string localPlannerName;
116 std::vector<rclcpp::Parameter> parameters;
117
118 // dynamic_reconfigure::DoubleParameter yaw_goal_tolerance;
119 rclcpp::Parameter yaw_goal_tolerance("goal_checker.yaw_goal_tolerance");
120
121 rclcpp::Parameter max_vel_theta, min_vel_theta;
122
123 bool isRosBasePlanner = !spinningPlanner || *spinningPlanner == SpinningPlanner::Default;
124 bool isPureSpinningPlanner = spinningPlanner && *spinningPlanner == SpinningPlanner::PureSpinning;
125
126 // SELECTING CONTROLLER AND PARAMETERS NAME
127 if (isPureSpinningPlanner)
128 {
129 localPlannerName = "PureSpinningLocalPlanner";
130 max_vel_theta = rclcpp::Parameter(localPlannerName + ".max_angular_z_speed");
131 min_vel_theta = rclcpp::Parameter(localPlannerName + ".min_vel_theta");
132 }
133 else if (isRosBasePlanner)
134 {
135 localPlannerName = "FollowPath";
136 max_vel_theta = rclcpp::Parameter(localPlannerName + ".max_vel_theta");
137 min_vel_theta = rclcpp::Parameter(localPlannerName + ".min_vel_theta");
138 }
139
140 if (!undo)
141 {
143 {
144 // save old yaw tolerance
145 auto fut = parameters_client->get_parameters(
146 {localPlannerName + ".yaw_goal_tolerance"}, [&](auto futureParameters) {
147 auto params = futureParameters.get();
148 oldYawTolerance = params[0].as_double();
149 });
150
151 // make synchronous
152 fut.get();
153
154 yaw_goal_tolerance = rclcpp::Parameter("goal_checker.yaw_goal_tolerance", *yawGoalTolerance);
155 parameters.push_back(yaw_goal_tolerance);
156 RCLCPP_INFO(
157 getLogger(),
158 "[CbAbsoluteRotate] updating yaw tolerance local planner to: %lf, from previous value: "
159 "%lf ",
161 }
162
163 if (maxVelTheta)
164 {
165 if (isRosBasePlanner)
166 {
167 // nh.getParam(nodename + "/" + localPlannerName+"/min_vel_theta", oldMinVelTheta);
168 // getCurrentState()->getParam(nodename + "/" + localPlannerName + "/max_vel_theta", oldMaxVelTheta);
169
170 // save old yaw tolerance
171 auto fut = parameters_client->get_parameters(
172 {localPlannerName + ".max_vel_theta"}, [&](auto futureParameters) {
173 auto params = futureParameters.get();
174 oldMaxVelTheta = params[0].as_double();
175 });
176
177 // make synchronous
178 fut.get();
179 }
180
181 max_vel_theta = rclcpp::Parameter(localPlannerName + ".max_vel_theta", *maxVelTheta);
182 min_vel_theta = rclcpp::Parameter(localPlannerName + ".min_vel_theta", -*maxVelTheta);
183 parameters.push_back(max_vel_theta);
184 parameters.push_back(min_vel_theta);
185
186 RCLCPP_INFO(
187 log,
188 "[CbAbsoluteRotate] updating max vel theta local planner to: %lf, from previous value: "
189 "%lf ",
191 RCLCPP_INFO(
192 log,
193 "[CbAbsoluteRotate] updating min vel theta local planner to: %lf, from previous value: "
194 "%lf ",
195 -*maxVelTheta, this->oldMinVelTheta);
196 }
197 }
198 else
199 {
201 {
202 yaw_goal_tolerance = rclcpp::Parameter("goal_checker.yaw_goal_tolerance", oldYawTolerance);
203 RCLCPP_INFO(
204 log,
205 "[CbAbsoluteRotate] restoring yaw tolerance local planner from: %lf, to previous value: "
206 "%lf ",
208 }
209
210 if (maxVelTheta)
211 {
212 if (isRosBasePlanner)
213 {
214 max_vel_theta = rclcpp::Parameter(localPlannerName + ".max_vel_theta", oldMaxVelTheta);
215 min_vel_theta = rclcpp::Parameter(localPlannerName + ".max_vel_theta", oldMinVelTheta);
216 }
217
218 parameters.push_back(max_vel_theta);
219 parameters.push_back(min_vel_theta);
220 RCLCPP_INFO(
221 log,
222 "[CbAbsoluteRotate] restoring max vel theta local planner from: %lf, to previous value: "
223 "%lf ",
225 RCLCPP_INFO(
226 log,
227 "[CbAbsoluteRotate] restoring min vel theta local planner from: %lf, to previous value: "
228 "%lf ",
229 -(*maxVelTheta), this->oldMinVelTheta);
230 }
231 }
232
233 if (parameters.size())
234 {
235 std::stringstream ss;
236 ss << "Executing asynchronous request. Parameters to update: " << std::endl;
237 for (auto & p : parameters)
238 {
239 ss << p.get_name() << " - " << p.value_to_string() << std::endl;
240 }
241
242 RCLCPP_INFO_STREAM(getLogger(), "[CbAbsoluteRotate] " << ss.str());
243
244 auto futureResults = parameters_client->set_parameters(parameters);
245
246 int i = 0;
247 for (auto & res : futureResults.get())
248 {
249 RCLCPP_INFO_STREAM(
250 getLogger(), "[CbAbsoluteRotate] parameter result: " << parameters[i].get_name() << "="
251 << parameters[i].as_string()
252 << ". Result: " << res.successful);
253 i++;
254 }
255
256 RCLCPP_INFO(log, "[CbAbsoluteRotate] parameters updated");
257 }
258 else
259 {
260 RCLCPP_INFO(log, "[CbAbsoluteRotate] skipping parameters update");
261 }
262}
std::optional< float > maxVelTheta

References cl_nav2z::Default, smacc2::ISmaccClientBehavior::getLogger(), smacc2::ISmaccClientBehavior::getNode(), maxVelTheta, oldMaxVelTheta, oldMinVelTheta, oldYawTolerance, cl_nav2z::PureSpinning, spinningPlanner, and yawGoalTolerance.

Referenced by onEntry(), and onExit().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ absoluteGoalAngleDegree

float cl_nav2z::CbAbsoluteRotate::absoluteGoalAngleDegree

Definition at line 34 of file cb_absolute_rotate.hpp.

Referenced by CbAbsoluteRotate(), and onEntry().

◆ listener

std::shared_ptr<tf2_ros::Buffer> cl_nav2z::CbAbsoluteRotate::listener

Definition at line 32 of file cb_absolute_rotate.hpp.

Referenced by onEntry().

◆ maxVelTheta

std::optional<float> cl_nav2z::CbAbsoluteRotate::maxVelTheta

Definition at line 36 of file cb_absolute_rotate.hpp.

Referenced by updateTemporalBehaviorParameters().

◆ oldMaxVelTheta

float cl_nav2z::CbAbsoluteRotate::oldMaxVelTheta
private

Definition at line 48 of file cb_absolute_rotate.hpp.

Referenced by updateTemporalBehaviorParameters().

◆ oldMinVelTheta

float cl_nav2z::CbAbsoluteRotate::oldMinVelTheta
private

Definition at line 49 of file cb_absolute_rotate.hpp.

Referenced by updateTemporalBehaviorParameters().

◆ oldYawTolerance

float cl_nav2z::CbAbsoluteRotate::oldYawTolerance
private

Definition at line 47 of file cb_absolute_rotate.hpp.

Referenced by updateTemporalBehaviorParameters().

◆ spinningPlanner

std::optional<SpinningPlanner> cl_nav2z::CbAbsoluteRotate::spinningPlanner

◆ yawGoalTolerance

std::optional<float> cl_nav2z::CbAbsoluteRotate::yawGoalTolerance

Definition at line 35 of file cb_absolute_rotate.hpp.

Referenced by CbAbsoluteRotate(), and updateTemporalBehaviorParameters().


The documentation for this class was generated from the following files: