Skip to content

Commit

Permalink
create InitializeLaserEmitter
Browse files Browse the repository at this point in the history
  • Loading branch information
Tomoki committed Jan 5, 2024
1 parent dc36110 commit a567049
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 39 deletions.
87 changes: 49 additions & 38 deletions s2e-ff/src/components/aocs/laser_emitter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,34 +9,39 @@
#include <dynamics/dynamics.hpp>
#include <library/initialize/initialize_file_access.hpp>
#include <library/math/vector.hpp>
#include <library/optics/gaussian_beam_base.hpp>

#include "../../library/math/translation_first_dual_quaternion.hpp"

/**
* @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
*/
~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
Expand All @@ -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
Expand All @@ -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;
}

Expand All @@ -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<long long>(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<long long>(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_
2 changes: 1 addition & 1 deletion s2e-ff/src/simulation/spacecraft/ff_components_2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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_);

Expand Down

0 comments on commit a567049

Please sign in to comment.