From a5670491bdea110010c116179e80d4f80ac5eede Mon Sep 17 00:00:00 2001 From: Tomoki Date: Fri, 5 Jan 2024 14:28:19 +0900 Subject: [PATCH] create InitializeLaserEmitter --- s2e-ff/src/components/aocs/laser_emitter.hpp | 87 +++++++++++-------- .../simulation/spacecraft/ff_components_2.cpp | 2 +- 2 files changed, 50 insertions(+), 39 deletions(-) diff --git a/s2e-ff/src/components/aocs/laser_emitter.hpp b/s2e-ff/src/components/aocs/laser_emitter.hpp index 7513c719..e1fbf13e 100644 --- a/s2e-ff/src/components/aocs/laser_emitter.hpp +++ b/s2e-ff/src/components/aocs/laser_emitter.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "../../library/math/translation_first_dual_quaternion.hpp" @@ -16,18 +17,22 @@ * @class LaserEmitter * @brief Laser Emitter */ -class LaserEmitter { +class LaserEmitter : public GaussianBeamBase { public: /** * @fn LaserEmitter * @brief Constructor */ - LaserEmitter() : dynamics_(nullptr) {} - /** - * @fn LaserEmitter - * @brief Constructor - */ - LaserEmitter(const std::string file_name, const Dynamics* dynamics, const size_t id = 0) : dynamics_(dynamics) { Initialize(file_name, id); } + LaserEmitter(const Dynamics& dynamics, libra::Vector<3> emitting_direction_c, double emission_angle_rad, + libra::TranslationFirstDualQuaternion dual_quaternion_c2b, double emission_power_W, double radius_beam_waist_m, + double rayleigh_length_m, double rayleigh_length_offset_m, double wavelength_m) + : GaussianBeamBase(wavelength_m, radius_beam_waist_m, emission_power_W), + dynamics_(dynamics), + emitting_direction_c_(emitting_direction_c), + emission_angle_rad_(emission_angle_rad), + dual_quaternion_c2b_(dual_quaternion_c2b), + rayleigh_length_m_(rayleigh_length_m), + rayleigh_length_offset_m_(rayleigh_length_offset_m) {} /** * @fn ~LaserEmitter * @brief Destructor @@ -35,8 +40,8 @@ class LaserEmitter { ~LaserEmitter() {} inline libra::Vector<3> GetLaserPosition_i_m() const { - libra::Vector<3> spacecraft_position_i2b_m = dynamics_->GetOrbit().GetPosition_i_m(); - libra::Quaternion spacecraft_attitude_i2b = dynamics_->GetAttitude().GetQuaternion_i2b(); + libra::Vector<3> spacecraft_position_i2b_m = dynamics_.GetOrbit().GetPosition_i_m(); + libra::Quaternion spacecraft_attitude_i2b = dynamics_.GetAttitude().GetQuaternion_i2b(); libra::TranslationFirstDualQuaternion dual_quaternion_i2b(-spacecraft_position_i2b_m, spacecraft_attitude_i2b.Conjugate()); // Component -> Inertial frame @@ -47,8 +52,8 @@ class LaserEmitter { inline libra::Vector<3> GetEmittingDirection_i() const { // Body -> Inertial frame - libra::Vector<3> spacecraft_position_i2b_m = dynamics_->GetOrbit().GetPosition_i_m(); - libra::Quaternion spacecraft_attitude_i2b = dynamics_->GetAttitude().GetQuaternion_i2b(); + libra::Vector<3> spacecraft_position_i2b_m = dynamics_.GetOrbit().GetPosition_i_m(); + libra::Quaternion spacecraft_attitude_i2b = dynamics_.GetAttitude().GetQuaternion_i2b(); libra::TranslationFirstDualQuaternion dual_quaternion_i2b(-spacecraft_position_i2b_m, spacecraft_attitude_i2b.Conjugate()); // Component -> Inertial frame @@ -62,13 +67,12 @@ class LaserEmitter { } inline double GetEmissionAngle_rad() const { return emission_angle_rad_; } - inline double GetEmissionPower_W() const { return emission_power_W_; } - inline double GetRadiusBeamWaist_m() const { return radius_beam_waist_m_; } + inline double GetEmissionPower_W() const { return GetTotalPower_W(); } inline double GetRayleighLength_m() const { return rayleigh_length_m_; } inline double GetRayleighLengthOffset_m() const { return rayleigh_length_offset_m_; } inline double GetBeamWidthRadius_m(const double emission_distance_m) const { - double beam_radius_m = radius_beam_waist_m_ * sqrt(1 + pow((emission_distance_m - rayleigh_length_offset_m_) / rayleigh_length_m_, 2.0)); + double beam_radius_m = GetBeamWaistRadius_m() * sqrt(1 + pow((emission_distance_m - rayleigh_length_offset_m_) / rayleigh_length_m_, 2.0)); return beam_radius_m; } @@ -77,34 +81,41 @@ class LaserEmitter { double emission_angle_rad_ = 0.0; //!< Laser emitting angle from the emitting direction [rad] libra::TranslationFirstDualQuaternion dual_quaternion_c2b_; //!< Dual quaternion from body to component frame - double emission_power_W_ = 0.0; //!< Laser emission power [W] - double radius_beam_waist_m_ = 0.0; //!< Beam waist of the laser [m] double rayleigh_length_m_ = 0.0; //!< Rayleigh length (range) of the laser [m] double rayleigh_length_offset_m_ = 4.65; //!< Rayleigh length (range) position offset of the laser [m] // Reference - const Dynamics* dynamics_; - - // Functions - void Initialize(const std::string file_name, const size_t id = 0) { - IniAccess ini_file(file_name); - std::string name = "LASER_EMITTER_"; - const std::string section_name = name + std::to_string(static_cast(id)); - - libra::Quaternion quaternion_b2c; - ini_file.ReadQuaternion(section_name.c_str(), "quaternion_b2c", quaternion_b2c); - libra::Vector<3> position_b_m; - ini_file.ReadVector(section_name.c_str(), "position_b_m", position_b_m); - dual_quaternion_c2b_ = libra::TranslationFirstDualQuaternion(-position_b_m, quaternion_b2c.Conjugate()).QuaternionConjugate(); - - ini_file.ReadVector(section_name.c_str(), "emitting_direction_c", emitting_direction_c_); - emission_angle_rad_ = ini_file.ReadDouble(section_name.c_str(), "emission_angle_rad"); - emission_power_W_ = ini_file.ReadDouble(section_name.c_str(), "emission_power_W"); - - radius_beam_waist_m_ = ini_file.ReadDouble(section_name.c_str(), "radius_beam_waist_m"); - rayleigh_length_m_ = ini_file.ReadDouble(section_name.c_str(), "rayleigh_length_m"); - rayleigh_length_offset_m_ = ini_file.ReadDouble(section_name.c_str(), "rayleigh_length_offset_m"); - } + const Dynamics& dynamics_; +}; + +LaserEmitter InitializeLaserEmitter(const std::string file_name, const Dynamics& dynamics, const size_t id = 0) { + IniAccess ini_file(file_name); + std::string name = "LASER_EMITTER_"; + const std::string section_name = name + std::to_string(static_cast(id)); + + libra::Quaternion quaternion_b2c; + ini_file.ReadQuaternion(section_name.c_str(), "quaternion_b2c", quaternion_b2c); + libra::Vector<3> position_b_m; + ini_file.ReadVector(section_name.c_str(), "position_b_m", position_b_m); + libra::TranslationFirstDualQuaternion dual_quaternion_c2b = + libra::TranslationFirstDualQuaternion(-position_b_m, quaternion_b2c.Conjugate()).QuaternionConjugate(); + + libra::Vector<3> emitting_direction_c{0.0}; + ini_file.ReadVector(section_name.c_str(), "emitting_direction_c", emitting_direction_c); + + double emission_angle_rad = ini_file.ReadDouble(section_name.c_str(), "emission_angle_rad"); + double emission_power_W = ini_file.ReadDouble(section_name.c_str(), "emission_power_W"); + + double radius_beam_waist_m = ini_file.ReadDouble(section_name.c_str(), "radius_beam_waist_m"); + double rayleigh_length_m = ini_file.ReadDouble(section_name.c_str(), "rayleigh_length_m"); + double rayleigh_length_offset_m = ini_file.ReadDouble(section_name.c_str(), "rayleigh_length_offset_m"); + + double wavelength_m = libra::pi * radius_beam_waist_m * radius_beam_waist_m / rayleigh_length_m; + + LaserEmitter laser_emitter(dynamics, emitting_direction_c, emission_angle_rad, dual_quaternion_c2b, emission_power_W, radius_beam_waist_m, + rayleigh_length_m, rayleigh_length_offset_m, wavelength_m); + + return laser_emitter; }; #endif // S2E_COMPONENTS_LASER_EMITTER_HPP_ diff --git a/s2e-ff/src/simulation/spacecraft/ff_components_2.cpp b/s2e-ff/src/simulation/spacecraft/ff_components_2.cpp index e5e67e1f..a5110dd6 100644 --- a/s2e-ff/src/simulation/spacecraft/ff_components_2.cpp +++ b/s2e-ff/src/simulation/spacecraft/ff_components_2.cpp @@ -33,7 +33,7 @@ FfComponents2::FfComponents2(const Dynamics* dynamics, const Structure* structur IniAccess laser_emitter_file(file_name); size_t number_of_laser_emitters = laser_emitter_file.ReadInt("GENERAL", "number_of_laser_emitters"); for (size_t id = 0; id < number_of_laser_emitters; id++) { - laser_emitters_.push_back(new LaserEmitter(file_name, dynamics_, id)); + laser_emitters_.push_back(new LaserEmitter(InitializeLaserEmitter(file_name, *dynamics_, id))); } inter_spacecraft_communication.SetLaserEmitter(laser_emitters_);