SMACC2
Loading...
Searching...
No Matches
smacc2_client_library
cl_px4_mr
src
cl_px4_mr
client_behaviors
cb_sine_altitude_cruise.cpp
Go to the documentation of this file.
1
// Copyright 2026 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
#include <
cl_px4_mr/client_behaviors/cb_sine_altitude_cruise.hpp
>
16
#include <
cl_px4_mr/components/cp_trajectory_setpoint.hpp
>
17
#include <
cl_px4_mr/components/cp_vehicle_local_position.hpp
>
18
#include <
cl_px4_mr/utils/angle_utils.hpp
>
19
20
#include <algorithm>
21
22
namespace
cl_px4_mr
23
{
24
25
CbSineAltitudeCruise::CbSineAltitudeCruise
(
26
float
groundSpeed,
float
amplitude,
float
wavelength,
float
heading)
27
: groundSpeed_(groundSpeed),
28
amplitude_(amplitude),
29
wavelength_(std::max(wavelength, 0.1f)),
30
heading_(heading)
31
{
32
}
33
34
void
CbSineAltitudeCruise::onEntry
()
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
44
startX_
=
localPosition_
->
getX
();
45
startY_
=
localPosition_
->
getY
();
46
baseZ_
=
localPosition_
->
getZ
();
47
48
if
(std::isnan(
heading_
))
49
{
50
heading_
=
localPosition_
->
getHeading
();
51
}
52
heading_
=
wrapPi
(
heading_
);
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;
68
lastCmdX_
=
startX_
;
69
lastCmdY_
=
startY_
;
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)"
,
76
heading_
,
groundSpeed_
,
amplitude_
,
wavelength_
);
77
78
trajectorySetpoint_
->
setPositionNED
(
startX_
,
startY_
,
baseZ_
,
heading_
);
79
active_
=
true
;
80
}
81
82
void
CbSineAltitudeCruise::onExit
()
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.
88
trajectorySetpoint_
->
setPositionNED
(
lastCmdX_
,
lastCmdY_
,
baseZ_
,
heading_
);
89
RCLCPP_INFO(
90
getLogger
(),
"CbSineAltitudeCruise: exiting - settling at base altitude (NED z=%.2f)"
,
91
baseZ_
);
92
}
93
}
94
95
void
CbSineAltitudeCruise::update
()
96
{
97
CbPx4ClientBehaviorBase::update
();
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;
117
trajectorySetpoint_
->
setPositionNED
(x, y, z,
heading_
);
118
}
119
120
}
// namespace cl_px4_mr
angle_utils.hpp
cb_sine_altitude_cruise.hpp
cl_px4_mr::CbPx4ClientBehaviorBase::update
void update() override
Definition
cb_px4_client_behavior_base.hpp:92
cl_px4_mr::CbPx4ClientBehaviorBase::localPosition_
CpVehicleLocalPosition * localPosition_
Definition
cb_px4_client_behavior_base.hpp:141
cl_px4_mr::CbPx4ClientBehaviorBase::trajectorySetpoint_
CpTrajectorySetpoint * trajectorySetpoint_
Definition
cb_px4_client_behavior_base.hpp:139
cl_px4_mr::CbPx4ClientBehaviorBase::postPx4Failure
void postPx4Failure()
Definition
cb_px4_client_behavior_base.hpp:129
cl_px4_mr::CbSineAltitudeCruise::heading_
float heading_
Definition
cb_sine_altitude_cruise.hpp:52
cl_px4_mr::CbSineAltitudeCruise::onExit
void onExit() override
Definition
cb_sine_altitude_cruise.cpp:82
cl_px4_mr::CbSineAltitudeCruise::baseZ_
float baseZ_
Definition
cb_sine_altitude_cruise.hpp:56
cl_px4_mr::CbSineAltitudeCruise::groundSpeed_
float groundSpeed_
Definition
cb_sine_altitude_cruise.hpp:49
cl_px4_mr::CbSineAltitudeCruise::wavelength_
float wavelength_
Definition
cb_sine_altitude_cruise.hpp:51
cl_px4_mr::CbSineAltitudeCruise::amplitude_
float amplitude_
Definition
cb_sine_altitude_cruise.hpp:50
cl_px4_mr::CbSineAltitudeCruise::lastCmdX_
float lastCmdX_
Definition
cb_sine_altitude_cruise.hpp:58
cl_px4_mr::CbSineAltitudeCruise::CbSineAltitudeCruise
CbSineAltitudeCruise(float groundSpeed=2.0f, float amplitude=1.5f, float wavelength=20.0f, float heading=std::numeric_limits< float >::quiet_NaN())
Definition
cb_sine_altitude_cruise.cpp:25
cl_px4_mr::CbSineAltitudeCruise::onEntry
void onEntry() override
Definition
cb_sine_altitude_cruise.cpp:34
cl_px4_mr::CbSineAltitudeCruise::startX_
float startX_
Definition
cb_sine_altitude_cruise.hpp:54
cl_px4_mr::CbSineAltitudeCruise::update
void update() override
Definition
cb_sine_altitude_cruise.cpp:95
cl_px4_mr::CbSineAltitudeCruise::lastUpdateTime_
std::chrono::steady_clock::time_point lastUpdateTime_
Definition
cb_sine_altitude_cruise.hpp:61
cl_px4_mr::CbSineAltitudeCruise::startY_
float startY_
Definition
cb_sine_altitude_cruise.hpp:55
cl_px4_mr::CbSineAltitudeCruise::active_
std::atomic< bool > active_
Definition
cb_sine_altitude_cruise.hpp:60
cl_px4_mr::CbSineAltitudeCruise::arcLength_
float arcLength_
Definition
cb_sine_altitude_cruise.hpp:57
cl_px4_mr::CbSineAltitudeCruise::lastCmdY_
float lastCmdY_
Definition
cb_sine_altitude_cruise.hpp:59
cl_px4_mr::CpTrajectorySetpoint::setPositionNED
void setPositionNED(float x, float y, float z, float yaw=std::numeric_limits< float >::quiet_NaN())
Definition
cp_trajectory_setpoint.cpp:46
cl_px4_mr::CpVehicleLocalPosition::getY
float getY() const
Definition
cp_vehicle_local_position.cpp:104
cl_px4_mr::CpVehicleLocalPosition::getX
float getX() const
Definition
cp_vehicle_local_position.cpp:98
cl_px4_mr::CpVehicleLocalPosition::isValid
bool isValid() const
Definition
cp_vehicle_local_position.cpp:122
cl_px4_mr::CpVehicleLocalPosition::getHeading
float getHeading() const
Definition
cp_vehicle_local_position.cpp:116
cl_px4_mr::CpVehicleLocalPosition::getZ
float getZ() const
Definition
cp_vehicle_local_position.cpp:110
smacc2::ISmaccClientBehavior::getLogger
virtual rclcpp::Logger getLogger() const
Definition
smacc_client_behavior_base.cpp:43
cp_trajectory_setpoint.hpp
cp_vehicle_local_position.hpp
cl_px4_mr
Definition
cl_px4_mr.hpp:30
cl_px4_mr::wrapPi
float wrapPi(float angle)
Definition
angle_utils.hpp:25
Generated by
1.12.0