SMACC2
Loading...
Searching...
No Matches
smacc2_client_library
cl_px4_mr
src
cl_px4_mr
client_behaviors
cb_orbit_location.cpp
Go to the documentation of this file.
1
// Copyright 2025 Robosoft 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_orbit_location.hpp
>
16
#include <
cl_px4_mr/components/cp_trajectory_setpoint.hpp
>
17
#include <
cl_px4_mr/components/cp_vehicle_local_position.hpp
>
18
19
namespace
cl_px4_mr
20
{
21
22
CbOrbitLocation::CbOrbitLocation
(
23
float
centerX,
float
centerY,
float
altitude,
float
radius,
float
angularVelocity,
int
numOrbits)
24
: centerX_(centerX),
25
centerY_(centerY),
26
altitude_(altitude),
27
radius_(radius),
28
angularVelocity_(angularVelocity),
29
numOrbits_(numOrbits)
30
{
31
}
32
33
void
CbOrbitLocation::onEntry
()
34
{
35
// Compute starting angle from current position relative to center
36
float
dx =
localPosition_
->
getX
() -
centerX_
;
37
float
dy =
localPosition_
->
getY
() -
centerY_
;
38
startAngle_
= std::atan2(dy, dx);
39
currentAngle_
=
startAngle_
;
40
lastUpdateTime_
= std::chrono::steady_clock::now();
41
42
// Command initial orbit position
43
float
x =
centerX_
+
radius_
* std::cos(
currentAngle_
);
44
float
y =
centerY_
+
radius_
* std::sin(
currentAngle_
);
45
float
z = -
altitude_
;
// NED: up is negative
46
float
yaw =
currentAngle_
+ M_PI;
// Face toward center
47
48
RCLCPP_INFO(
49
getLogger
(),
"CbOrbitLocation: starting orbit center=[%.2f, %.2f] r=%.2f alt=%.2f orbits=%d"
,
50
centerX_
,
centerY_
,
radius_
,
altitude_
,
numOrbits_
);
51
52
trajectorySetpoint_
->
setPositionNED
(x, y, z, yaw);
53
}
54
55
void
CbOrbitLocation::onExit
() {}
56
57
void
CbOrbitLocation::update
()
58
{
59
CbPx4ClientBehaviorBase::update
();
60
61
auto
now = std::chrono::steady_clock::now();
62
double
dt = std::chrono::duration<double>(now -
lastUpdateTime_
).count();
63
lastUpdateTime_
= now;
64
65
// Advance angle
66
currentAngle_
+=
angularVelocity_
* dt;
67
68
// Compute new position on circle
69
float
x =
centerX_
+
radius_
* std::cos(
currentAngle_
);
70
float
y =
centerY_
+
radius_
* std::sin(
currentAngle_
);
71
float
z = -
altitude_
;
// NED
72
float
yaw =
currentAngle_
+ M_PI;
// Face toward center
73
74
trajectorySetpoint_
->
setPositionNED
(x, y, z, yaw);
75
76
// Check if we've completed the required number of orbits
77
float
totalAngle =
currentAngle_
-
startAngle_
;
78
float
requiredAngle =
numOrbits_
* 2.0f * M_PI;
79
80
if
(totalAngle >= requiredAngle)
81
{
82
RCLCPP_INFO(
getLogger
(),
"CbOrbitLocation: %d orbits completed - posting success"
,
numOrbits_
);
83
this->
postPx4Success
();
84
}
85
}
86
87
}
// namespace cl_px4_mr
cb_orbit_location.hpp
cl_px4_mr::CbOrbitLocation::altitude_
float altitude_
Definition
cb_orbit_location.hpp:43
cl_px4_mr::CbOrbitLocation::onEntry
void onEntry() override
Definition
cb_orbit_location.cpp:33
cl_px4_mr::CbOrbitLocation::lastUpdateTime_
std::chrono::steady_clock::time_point lastUpdateTime_
Definition
cb_orbit_location.hpp:50
cl_px4_mr::CbOrbitLocation::currentAngle_
float currentAngle_
Definition
cb_orbit_location.hpp:48
cl_px4_mr::CbOrbitLocation::update
void update() override
Definition
cb_orbit_location.cpp:57
cl_px4_mr::CbOrbitLocation::startAngle_
float startAngle_
Definition
cb_orbit_location.hpp:49
cl_px4_mr::CbOrbitLocation::CbOrbitLocation
CbOrbitLocation(float centerX, float centerY, float altitude, float radius=5.0f, float angularVelocity=0.5f, int numOrbits=3)
Definition
cb_orbit_location.cpp:22
cl_px4_mr::CbOrbitLocation::numOrbits_
int numOrbits_
Definition
cb_orbit_location.hpp:46
cl_px4_mr::CbOrbitLocation::radius_
float radius_
Definition
cb_orbit_location.hpp:44
cl_px4_mr::CbOrbitLocation::angularVelocity_
float angularVelocity_
Definition
cb_orbit_location.hpp:45
cl_px4_mr::CbOrbitLocation::centerX_
float centerX_
Definition
cb_orbit_location.hpp:41
cl_px4_mr::CbOrbitLocation::centerY_
float centerY_
Definition
cb_orbit_location.hpp:42
cl_px4_mr::CbOrbitLocation::onExit
void onExit() override
Definition
cb_orbit_location.cpp:55
cl_px4_mr::CbPx4ClientBehaviorBase::update
void update() override
Definition
cb_px4_client_behavior_base.hpp:85
cl_px4_mr::CbPx4ClientBehaviorBase::postPx4Success
void postPx4Success()
Definition
cb_px4_client_behavior_base.hpp:113
cl_px4_mr::CbPx4ClientBehaviorBase::localPosition_
CpVehicleLocalPosition * localPosition_
Definition
cb_px4_client_behavior_base.hpp:133
cl_px4_mr::CbPx4ClientBehaviorBase::trajectorySetpoint_
CpTrajectorySetpoint * trajectorySetpoint_
Definition
cb_px4_client_behavior_base.hpp:131
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:52
cl_px4_mr::CpVehicleLocalPosition::getX
float getX() const
Definition
cp_vehicle_local_position.cpp:46
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:29
Generated by
1.12.0