Skip to content

Commit 9421a39

Browse files
committed
Add target direction calculation
1 parent adbc79b commit 9421a39

File tree

4 files changed

+23
-7
lines changed

4 files changed

+23
-7
lines changed

settings/sample_satellite/satellite.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// RK4 : Attitude Propagation with RK4 including disturbances and control torque
44
// CANTILEVER_VIBRATION : Attitude Propagation with the consideration of the cantilever vibration (flexible structure) including disturbances and control torque.
55
// CONTROLLED : Attitude Calculation with Controlled Attitude mode. All disturbances and control torque are ignored.
6-
propagate_mode = RK4
6+
propagate_mode = CONTROLLED
77

88
// Initialize Attitude mode
99
// MANUAL : Initialize Quaternion_i2b manually below
@@ -37,7 +37,7 @@ initial_torque_b_Nm(2) = 0.000
3737
// GROUND_SPEED_DIRECTION_POINTING
3838
// ORBIT_NORMAL_POINTING
3939
// EARTH_SURFACE_POINTING
40-
main_mode = INERTIAL_STABILIZE
40+
main_mode = EARTH_SURFACE_POINTING
4141
sub_mode = SUN_POINTING
4242

4343
// Pointing direction @ body frame for main pointing mode

src/dynamics/attitude/controlled_attitude.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@ namespace s2e::dynamics::attitude {
1111

1212
ControlledAttitude::ControlledAttitude(const AttitudeControlMode main_mode, const AttitudeControlMode sub_mode, const math::Quaternion quaternion_i2b,
1313
const math::Vector<3> main_target_direction_b, const math::Vector<3> sub_target_direction_b,
14-
const math::Matrix<3, 3>& inertia_tensor_kgm2,
14+
const math::Matrix<3, 3>& inertia_tensor_kgm2, const geodesy::GeodeticPosition target_earth_surface_position,
1515
const environment::LocalCelestialInformation* local_celestial_information, const orbit::Orbit* orbit,
1616
const std::string& simulation_object_name)
1717
: Attitude(inertia_tensor_kgm2, simulation_object_name),
1818
main_mode_(main_mode),
1919
sub_mode_(sub_mode),
2020
main_target_direction_b_(main_target_direction_b),
2121
sub_target_direction_b_(sub_target_direction_b),
22+
target_earth_surface_position_(target_earth_surface_position),
2223
local_celestial_information_(local_celestial_information),
2324
orbit_(orbit) {
2425
quaternion_i2b_ = quaternion_i2b;
@@ -100,6 +101,11 @@ math::Vector<3> ControlledAttitude::CalcTargetDirection_i(AttitudeControlMode mo
100101
direction = dcm_ecef2eci * orbit_->GetVelocity_ecef_m_s();
101102
} else if (mode == AttitudeControlMode::kOrbitNormalPointing) {
102103
direction = OuterProduct(orbit_->GetPosition_i_m(), orbit_->GetVelocity_i_m_s());
104+
} else if (mode == AttitudeControlMode::kEarthSurfacePointing) {
105+
math::Vector<3> earth_surface_target_position_ecef_m = target_earth_surface_position_.CalcEcefPosition();
106+
math::Vector<3> earth_surface_target_position_i_m = local_celestial_information_->GetGlobalInformation().GetEarthRotation().GetDcmJ2000ToEcef().Transpose()*earth_surface_target_position_ecef_m;
107+
108+
direction = earth_surface_target_position_i_m - orbit_->GetPosition_i_m();
103109
}
104110
direction = direction.CalcNormalizedVector();
105111
return direction;
@@ -149,7 +155,7 @@ AttitudeControlMode ConvertStringToCtrlMode(const std::string mode) {
149155
return AttitudeControlMode::kGroundSpeedDirectionPointing;
150156
} else if (mode == "ORBIT_NORMAL_POINTING") {
151157
return AttitudeControlMode::kOrbitNormalPointing;
152-
} else if (mode == "Earth_SURFACE_POINTING") {
158+
} else if (mode == "EARTH_SURFACE_POINTING") {
153159
return AttitudeControlMode::kEarthSurfacePointing;
154160
} else {
155161
return AttitudeControlMode::kNoControl;

src/dynamics/attitude/controlled_attitude.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,15 @@ class ControlledAttitude : public Attitude {
5353
* @param [in] main_target_direction_b: Main target direction on the body fixed frame
5454
* @param [in] sub_target_direction_b: Sun target direction on the body fixed frame
5555
* @param [in] inertia_tensor_kgm2: Inertia tensor of the spacecraft [kg m^2]
56+
* @param [in] target_earth_surface_position: Target position on the Earth surface for Earth surface pointing mode
5657
* @param [in] local_celestial_information: Local celestial information
5758
* @param [in] orbit: Orbit
5859
* @param [in] simulation_object_name: Simulation object name for Monte-Carlo simulation
5960
*/
6061
ControlledAttitude(const AttitudeControlMode main_mode, const AttitudeControlMode sub_mode, const math::Quaternion quaternion_i2b,
6162
const math::Vector<3> main_target_direction_b, const math::Vector<3> sub_target_direction_b,
62-
const math::Matrix<3, 3>& inertia_tensor_kgm2, const environment::LocalCelestialInformation* local_celestial_information,
63+
const math::Matrix<3, 3>& inertia_tensor_kgm2, const geodesy::GeodeticPosition target_earth_surface_position,
64+
const environment::LocalCelestialInformation* local_celestial_information,
6365
const orbit::Orbit* orbit, const std::string& simulation_object_name = "attitude");
6466
/**
6567
* @fn ~ControlledAttitude

src/dynamics/attitude/initialize_attitude.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,16 @@ Attitude* InitAttitude(std::string file_name, const orbit::Orbit* orbit, const e
3636
ini_file_ca.ReadVector(section_ca_, "main_pointing_direction_b", main_target_direction_b);
3737
ini_file_ca.ReadVector(section_ca_, "sub_pointing_direction_b", sub_target_direction_b);
3838
std::string mc_name_temp = section_ + std::to_string(spacecraft_id) + "_TEMP";
39+
40+
// Earth surface pointing mode
41+
double latitude_deg, longitude_deg, altitude_m;
42+
latitude_deg = ini_file_ca.ReadDouble(section_ca_, "target_position_latitude_deg");
43+
longitude_deg = ini_file_ca.ReadDouble(section_ca_, "target_position_longitude_deg");
44+
altitude_m = ini_file_ca.ReadDouble(section_ca_, "altitude_m");
45+
geodesy::GeodeticPosition target_position(latitude_deg * math::deg_to_rad, longitude_deg * math::deg_to_rad, altitude_m);
46+
3947
Attitude* attitude_temp = new ControlledAttitude(main_mode, sub_mode, quaternion_i2b, main_target_direction_b, sub_target_direction_b,
40-
inertia_tensor_kgm2, local_celestial_information, orbit, mc_name_temp);
48+
inertia_tensor_kgm2, target_position, local_celestial_information, orbit, mc_name_temp);
4149
attitude_temp->Propagate(step_width_s);
4250
quaternion_i2b = attitude_temp->GetQuaternion_i2b();
4351
omega_b = math::Vector<3>(0.0);
@@ -92,7 +100,7 @@ Attitude* InitAttitude(std::string file_name, const orbit::Orbit* orbit, const e
92100
geodesy::GeodeticPosition target_position(latitude_deg * math::deg_to_rad, longitude_deg * math::deg_to_rad, altitude_m);
93101

94102
attitude = new ControlledAttitude(main_mode, sub_mode, quaternion_i2b, main_target_direction_b, sub_target_direction_b, inertia_tensor_kgm2,
95-
local_celestial_information, orbit, mc_name);
103+
target_position, local_celestial_information, orbit, mc_name);
96104
} else {
97105
std::cerr << "ERROR: attitude propagation mode: " << propagate_mode << " is not defined!" << std::endl;
98106
std::cerr << "The attitude mode is automatically set as RK4" << std::endl;

0 commit comments

Comments
 (0)