SMACC2
Loading...
Searching...
No Matches
cl_px4_mr::CbSineAltitudeCruise Class Reference

#include <cb_sine_altitude_cruise.hpp>

Inheritance diagram for cl_px4_mr::CbSineAltitudeCruise:
Inheritance graph
Collaboration diagram for cl_px4_mr::CbSineAltitudeCruise:
Collaboration graph

Public Member Functions

 CbSineAltitudeCruise (float groundSpeed=2.0f, float amplitude=1.5f, float wavelength=20.0f, float heading=std::numeric_limits< float >::quiet_NaN())
 
void onEntry () override
 
void onExit () override
 
void update () override
 
- Public Member Functions inherited from cl_px4_mr::CbPx4ClientBehaviorBase
template<typename TOrthogonal , typename TSourceObject >
void onStateOrthogonalAllocation ()
 
virtual ~CbPx4ClientBehaviorBase ()
 
void setTimeout (std::chrono::milliseconds timeout)
 
bool hasTimeout () const
 
- Public Member Functions inherited from smacc2::SmaccAsyncClientBehavior
template<typename TOrthogonal , typename TSourceObject >
void onStateOrthogonalAllocation ()
 
virtual ~SmaccAsyncClientBehavior ()
 
template<typename TCallback , typename T >
smacc2::SmaccSignalConnection onSuccess (TCallback callback, T *object)
 
template<typename TCallback , typename T >
smacc2::SmaccSignalConnection onFinished (TCallback callback, T *object)
 
template<typename TCallback , typename T >
smacc2::SmaccSignalConnection onFailure (TCallback callback, T *object)
 
void requestForceFinish ()
 
void executeOnEntry () override
 
void executeOnExit () override
 
void waitOnEntryThread (bool requestFinish)
 
template<typename TCallbackMethod , typename T >
smacc2::SmaccSignalConnection onSuccess (TCallbackMethod callback, T *object)
 
template<typename TCallbackMethod , typename T >
smacc2::SmaccSignalConnection onFinished (TCallbackMethod callback, T *object)
 
template<typename TCallbackMethod , typename T >
smacc2::SmaccSignalConnection onFailure (TCallbackMethod callback, T *object)
 
- Public Member Functions inherited from smacc2::ISmaccClientBehavior
 ISmaccClientBehavior ()
 
virtual ~ISmaccClientBehavior ()
 
ISmaccStateMachine * getStateMachine ()
 
std::string getName () const
 
template<typename SmaccClientType >
void requiresClient (SmaccClientType *&storage)
 
template<typename SmaccComponentType >
void requiresComponent (SmaccComponentType *&storage, ComponentRequirement requirementType=ComponentRequirement::SOFT)
 
template<typename SmaccComponentType >
void requiresComponent (std::string name, SmaccComponentType *&storage, ComponentRequirement requirementType=ComponentRequirement::SOFT)
 
- Public Member Functions inherited from smacc2::ISmaccUpdatable
 ISmaccUpdatable ()
 
 ISmaccUpdatable (rclcpp::Duration duration)
 
void executeUpdate (rclcpp::Node::SharedPtr node)
 
void setUpdatePeriod (rclcpp::Duration duration)
 

Private Attributes

float groundSpeed_
 
float amplitude_
 
float wavelength_
 
float heading_
 
float startX_ = 0.0f
 
float startY_ = 0.0f
 
float baseZ_ = 0.0f
 
float arcLength_ = 0.0f
 
float lastCmdX_ = 0.0f
 
float lastCmdY_ = 0.0f
 
std::atomic< bool > active_ {false}
 
std::chrono::steady_clock::time_point lastUpdateTime_
 

Additional Inherited Members

- Protected Member Functions inherited from cl_px4_mr::CbPx4ClientBehaviorBase
virtual void wireCompletionSignals ()
 
void postPx4Success ()
 
void postPx4Failure ()
 
- Protected Member Functions inherited from smacc2::SmaccAsyncClientBehavior
void postSuccessEvent ()
 
void postFailureEvent ()
 
virtual void dispose () override
 
bool isShutdownRequested ()
 onEntry is executed in a new thread. However the current state cannot be left until the onEntry thread finishes. This flag can be checked from the onEntry thread to force finishing the thread.
 
- Protected Member Functions inherited from smacc2::ISmaccClientBehavior
virtual void runtimeConfigure ()
 
template<typename EventType >
void postEvent (const EventType &ev)
 
template<typename EventType >
void postEvent ()
 
ISmaccState * getCurrentState ()
 
virtual rclcpp::Node::SharedPtr getNode () const
 
virtual rclcpp::Logger getLogger () const
 
- Protected Member Functions inherited from smacc2::ISmaccUpdatable
- Protected Attributes inherited from cl_px4_mr::CbPx4ClientBehaviorBase
CpVehicleCommand * vehicleCommand_ = nullptr
 
CpVehicleStatus * vehicleStatus_ = nullptr
 
CpTrajectorySetpoint * trajectorySetpoint_ = nullptr
 
CpGoalChecker * goalChecker_ = nullptr
 
CpVehicleLocalPosition * localPosition_ = nullptr
 
CpOffboardKeepAlive * offboardKeepAlive_ = nullptr
 

Detailed Description

Definition at line 37 of file cb_sine_altitude_cruise.hpp.

Constructor & Destructor Documentation

◆ CbSineAltitudeCruise()

cl_px4_mr::CbSineAltitudeCruise::CbSineAltitudeCruise ( float groundSpeed = 2.0f,
float amplitude = 1.5f,
float wavelength = 20.0f,
float heading = std::numeric_limits<float>::quiet_NaN() )

Member Function Documentation

◆ onEntry()

void cl_px4_mr::CbSineAltitudeCruise::onEntry ( )
overridevirtual

Reimplemented from smacc2::ISmaccClientBehavior.

Definition at line 34 of file cb_sine_altitude_cruise.cpp.

35{
36 if (localPosition_ == nullptr || !localPosition_->isValid())
37 {
38 RCLCPP_ERROR(
39 getLogger(), "CbSineAltitudeCruise: no valid local position at entry - posting failure");
40 this->postPx4Failure();
41 return;
42 }
43
47
48 if (std::isnan(heading_))
49 {
51 }
53
54 // Peak vertical speed of the commanded path; PX4 defaults limit climb/descent
55 // to ~2-3 m/s and the flown sine flattens beyond that.
56 float peakVerticalSpeed =
57 amplitude_ * 2.0f * static_cast<float>(M_PI) * groundSpeed_ / wavelength_;
58 if (peakVerticalSpeed > 2.0f)
59 {
60 RCLCPP_WARN(
61 getLogger(),
62 "CbSineAltitudeCruise: commanded peak vertical speed %.2f m/s exceeds typical PX4 limits - "
63 "the flown path will flatten",
64 peakVerticalSpeed);
65 }
66
67 arcLength_ = 0.0f;
70 lastUpdateTime_ = std::chrono::steady_clock::now();
71
72 RCLCPP_INFO(
73 getLogger(),
74 "CbSineAltitudeCruise: cruising heading=%.2f rad v=%.2f m/s A=%.2f m lambda=%.2f m "
75 "(continuous - exits only on state change)",
77
79 active_ = true;
80}
std::chrono::steady_clock::time_point lastUpdateTime_
void setPositionNED(float x, float y, float z, float yaw=std::numeric_limits< float >::quiet_NaN())
virtual rclcpp::Logger getLogger() const
float wrapPi(float angle)

References active_, amplitude_, arcLength_, baseZ_, cl_px4_mr::CpVehicleLocalPosition::getHeading(), smacc2::ISmaccClientBehavior::getLogger(), cl_px4_mr::CpVehicleLocalPosition::getX(), cl_px4_mr::CpVehicleLocalPosition::getY(), cl_px4_mr::CpVehicleLocalPosition::getZ(), groundSpeed_, heading_, cl_px4_mr::CpVehicleLocalPosition::isValid(), lastCmdX_, lastCmdY_, lastUpdateTime_, cl_px4_mr::CbPx4ClientBehaviorBase::localPosition_, cl_px4_mr::CbPx4ClientBehaviorBase::postPx4Failure(), cl_px4_mr::CpTrajectorySetpoint::setPositionNED(), startX_, startY_, cl_px4_mr::CbPx4ClientBehaviorBase::trajectorySetpoint_, wavelength_, and cl_px4_mr::wrapPi().

Here is the call graph for this function:

◆ onExit()

void cl_px4_mr::CbSineAltitudeCruise::onExit ( )
overridevirtual

Reimplemented from smacc2::ISmaccClientBehavior.

Definition at line 82 of file cb_sine_altitude_cruise.cpp.

83{
84 if (active_.exchange(false))
85 {
86 // Settle at the entry altitude at the last commanded ground position; the
87 // offboard keep-alive republishes this until the next state commands otherwise.
89 RCLCPP_INFO(
90 getLogger(), "CbSineAltitudeCruise: exiting - settling at base altitude (NED z=%.2f)",
91 baseZ_);
92 }
93}

References active_, baseZ_, smacc2::ISmaccClientBehavior::getLogger(), heading_, lastCmdX_, lastCmdY_, cl_px4_mr::CpTrajectorySetpoint::setPositionNED(), and cl_px4_mr::CbPx4ClientBehaviorBase::trajectorySetpoint_.

Here is the call graph for this function:

◆ update()

void cl_px4_mr::CbSineAltitudeCruise::update ( )
overridevirtual

Reimplemented from cl_px4_mr::CbPx4ClientBehaviorBase.

Definition at line 95 of file cb_sine_altitude_cruise.cpp.

96{
98
99 if (!active_)
100 {
101 return;
102 }
103
104 auto now = std::chrono::steady_clock::now();
105 double dt = std::chrono::duration<double>(now - lastUpdateTime_).count();
106 lastUpdateTime_ = now;
107
108 arcLength_ += groundSpeed_ * static_cast<float>(dt);
109
110 float x = startX_ + arcLength_ * std::cos(heading_);
111 float y = startY_ + arcLength_ * std::sin(heading_);
112 float phase = 2.0f * static_cast<float>(M_PI) * arcLength_ / wavelength_;
113 float z = baseZ_ - amplitude_ * std::sin(phase); // NED: up is negative
114
115 lastCmdX_ = x;
116 lastCmdY_ = y;
118}

References active_, amplitude_, arcLength_, baseZ_, groundSpeed_, heading_, lastCmdX_, lastCmdY_, lastUpdateTime_, cl_px4_mr::CpTrajectorySetpoint::setPositionNED(), startX_, startY_, cl_px4_mr::CbPx4ClientBehaviorBase::trajectorySetpoint_, cl_px4_mr::CbPx4ClientBehaviorBase::update(), and wavelength_.

Here is the call graph for this function:

Member Data Documentation

◆ active_

std::atomic<bool> cl_px4_mr::CbSineAltitudeCruise::active_ {false}
private

Definition at line 60 of file cb_sine_altitude_cruise.hpp.

60{false};

Referenced by onEntry(), onExit(), and update().

◆ amplitude_

float cl_px4_mr::CbSineAltitudeCruise::amplitude_
private

Definition at line 50 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), and update().

◆ arcLength_

float cl_px4_mr::CbSineAltitudeCruise::arcLength_ = 0.0f
private

Definition at line 57 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), and update().

◆ baseZ_

float cl_px4_mr::CbSineAltitudeCruise::baseZ_ = 0.0f
private

Definition at line 56 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), onExit(), and update().

◆ groundSpeed_

float cl_px4_mr::CbSineAltitudeCruise::groundSpeed_
private

Definition at line 49 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), and update().

◆ heading_

float cl_px4_mr::CbSineAltitudeCruise::heading_
private

Definition at line 52 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), onExit(), and update().

◆ lastCmdX_

float cl_px4_mr::CbSineAltitudeCruise::lastCmdX_ = 0.0f
private

Definition at line 58 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), onExit(), and update().

◆ lastCmdY_

float cl_px4_mr::CbSineAltitudeCruise::lastCmdY_ = 0.0f
private

Definition at line 59 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), onExit(), and update().

◆ lastUpdateTime_

std::chrono::steady_clock::time_point cl_px4_mr::CbSineAltitudeCruise::lastUpdateTime_
private

Definition at line 61 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), and update().

◆ startX_

float cl_px4_mr::CbSineAltitudeCruise::startX_ = 0.0f
private

Definition at line 54 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), and update().

◆ startY_

float cl_px4_mr::CbSineAltitudeCruise::startY_ = 0.0f
private

Definition at line 55 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), and update().

◆ wavelength_

float cl_px4_mr::CbSineAltitudeCruise::wavelength_
private

Definition at line 51 of file cb_sine_altitude_cruise.hpp.

Referenced by onEntry(), and update().


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