SMACC2
Loading...
Searching...
No Matches
smacc2_client_library
cl_px4_mr
src
cl_px4_mr
client_behaviors
cb_yaw_scan.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_yaw_scan.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
CbYawScan::CbYawScan
(
float
amplitude,
float
period,
float
baseHeading)
26
: amplitude_(amplitude), period_(std::max(period, 0.1f)), baseHeading_(baseHeading)
27
{
28
}
29
30
void
CbYawScan::onEntry
()
31
{
32
if
(
localPosition_
==
nullptr
|| !
localPosition_
->
isValid
())
33
{
34
RCLCPP_ERROR(
getLogger
(),
"CbYawScan: no valid local position at entry - posting failure"
);
35
this->
postPx4Failure
();
36
return
;
37
}
38
39
holdX_
=
localPosition_
->
getX
();
40
holdY_
=
localPosition_
->
getY
();
41
holdZ_
=
localPosition_
->
getZ
();
42
43
if
(std::isnan(
baseHeading_
))
44
{
45
baseHeading_
=
localPosition_
->
getHeading
();
46
}
47
baseHeading_
=
wrapPi
(
baseHeading_
);
48
49
// Peak yaw rate of the commanded sweep; PX4's autonomous yaw rate limit is
50
// ~0.8 rad/s by default and the flown sweep clips beyond it.
51
float
peakYawRate =
amplitude_
* 2.0f *
static_cast<
float
>
(M_PI) /
period_
;
52
if
(peakYawRate > 0.8f)
53
{
54
RCLCPP_WARN(
55
getLogger
(),
56
"CbYawScan: commanded peak yaw rate %.2f rad/s exceeds typical PX4 limits - the flown "
57
"sweep will clip"
,
58
peakYawRate);
59
}
60
61
elapsed_
= 0.0f;
62
lastUpdateTime_
= std::chrono::steady_clock::now();
63
64
RCLCPP_INFO(
65
getLogger
(),
66
"CbYawScan: scanning around heading=%.2f rad A=%.2f rad T=%.2f s "
67
"(continuous - exits only on state change)"
,
68
baseHeading_
,
amplitude_
,
period_
);
69
70
trajectorySetpoint_
->
setPositionNED
(
holdX_
,
holdY_
,
holdZ_
,
baseHeading_
);
71
active_
=
true
;
72
}
73
74
void
CbYawScan::onExit
()
75
{
76
if
(
active_
.exchange(
false
))
77
{
78
// Restore the base heading; the offboard keep-alive republishes this until
79
// the next state commands otherwise.
80
trajectorySetpoint_
->
setPositionNED
(
holdX_
,
holdY_
,
holdZ_
,
baseHeading_
);
81
RCLCPP_INFO(
getLogger
(),
"CbYawScan: exiting - restoring base heading %.2f rad"
,
baseHeading_
);
82
}
83
}
84
85
void
CbYawScan::update
()
86
{
87
CbPx4ClientBehaviorBase::update
();
88
89
if
(!
active_
)
90
{
91
return
;
92
}
93
94
auto
now = std::chrono::steady_clock::now();
95
double
dt = std::chrono::duration<double>(now -
lastUpdateTime_
).count();
96
lastUpdateTime_
= now;
97
98
elapsed_
+=
static_cast<
float
>
(dt);
99
100
float
phase = 2.0f *
static_cast<
float
>
(M_PI) *
elapsed_
/
period_
;
101
float
yaw =
wrapPi
(
baseHeading_
+
amplitude_
* std::sin(phase));
102
103
trajectorySetpoint_
->
setPositionNED
(
holdX_
,
holdY_
,
holdZ_
, yaw);
104
}
105
106
}
// namespace cl_px4_mr
angle_utils.hpp
cb_yaw_scan.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::CbYawScan::lastUpdateTime_
std::chrono::steady_clock::time_point lastUpdateTime_
Definition
cb_yaw_scan.hpp:57
cl_px4_mr::CbYawScan::holdZ_
float holdZ_
Definition
cb_yaw_scan.hpp:54
cl_px4_mr::CbYawScan::baseHeading_
float baseHeading_
Definition
cb_yaw_scan.hpp:50
cl_px4_mr::CbYawScan::onEntry
void onEntry() override
Definition
cb_yaw_scan.cpp:30
cl_px4_mr::CbYawScan::holdX_
float holdX_
Definition
cb_yaw_scan.hpp:52
cl_px4_mr::CbYawScan::update
void update() override
Definition
cb_yaw_scan.cpp:85
cl_px4_mr::CbYawScan::elapsed_
float elapsed_
Definition
cb_yaw_scan.hpp:55
cl_px4_mr::CbYawScan::onExit
void onExit() override
Definition
cb_yaw_scan.cpp:74
cl_px4_mr::CbYawScan::holdY_
float holdY_
Definition
cb_yaw_scan.hpp:53
cl_px4_mr::CbYawScan::CbYawScan
CbYawScan(float amplitude=0.6f, float period=6.0f, float baseHeading=std::numeric_limits< float >::quiet_NaN())
Definition
cb_yaw_scan.cpp:25
cl_px4_mr::CbYawScan::amplitude_
float amplitude_
Definition
cb_yaw_scan.hpp:48
cl_px4_mr::CbYawScan::period_
float period_
Definition
cb_yaw_scan.hpp:49
cl_px4_mr::CbYawScan::active_
std::atomic< bool > active_
Definition
cb_yaw_scan.hpp:56
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