Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | List of all members
GmclNode Class Reference

Public Member Functions

 GmclNode ()
 
int process ()
 
void runFromBag (const std::string &in_bag_fn, bool trigger_global_localization=false)
 Uses TF and LaserScan messages from bag file to drive AMCL instead. More...
 
void savePoseToServer ()
 
 ~GmclNode ()
 

Private Member Functions

void applyInitialPose ()
 
void checkLaserReceived (const ros::TimerEvent &event)
 
map_tconvertMap (const nav_msgs::OccupancyGrid &map_msg)
 
void freeMapDependentMemory ()
 
bool getOdomPose (geometry_msgs::PoseStamped &pose, double &x, double &y, double &yaw, const ros::Time &t, const std::string &f)
 
bool globalLocalizationCallback (std_srvs::Empty::Request &req, std_srvs::Empty::Response &res)
 
void handelNewLaser (const sensor_msgs::LaserScanConstPtr &laser_scan)
 
void handleInitialPoseMessage (const geometry_msgs::PoseWithCovarianceStamped &msg)
 
void handleMapMessage (const nav_msgs::OccupancyGrid &msg)
 
void initialPoseReceived (const geometry_msgs::PoseWithCovarianceStampedConstPtr &msg)
 
void laserReceived (const sensor_msgs::LaserScanConstPtr &laser_scan)
 
void mapReceived (const nav_msgs::OccupancyGridConstPtr &msg)
 
bool nomotionUpdateCallback (std_srvs::Empty::Request &req, std_srvs::Empty::Response &res)
 
void reconfigureCB (gmcl::GMCLConfig &config, uint32_t level)
 
void requestMap ()
 
bool setMapCallback (nav_msgs::SetMap::Request &req, nav_msgs::SetMap::Response &res)
 
void standardDeviationDiagnostics (diagnostic_updater::DiagnosticStatusWrapper &diagnostic_status)
 
void updatePoseFromServer ()
 

Static Private Member Functions

static pf_vector_t uniformPoseGenerator (pf_t *pf, void *arg, void *e_arg)
 

Private Attributes

double a_thresh_
 
double alpha1_
 
double alpha2_
 
double alpha3_
 
double alpha4_
 
double alpha5_
 
double alpha_fast_
 
double alpha_slow_
 
ros::WallDuration bag_scan_period_
 
std::string base_frame_id_
 
double beam_skip_distance_
 
double beam_skip_error_threshold_
 
double beam_skip_threshold_
 
ros::Timer check_laser_timer_
 
ros::Duration cloud_pub_interval
 
boost::recursive_mutex configuration_mutex_
 
double crossover_alpha_
 
double d_thresh_
 
gmcl::GMCLConfig default_config_
 
diagnostic_updater::Updater diagnosic_updater_
 
bool do_beamskip_
 
dynamic_reconfigure::Server< gmcl::GMCLConfig > * dsrv_
 
energy_map_tenergy_map_
 
ros::Publisher energy_particlecloud_pub_
 
bool first_map_only_
 
bool first_map_received_
 
bool first_reconfigure_call_
 
std::map< std::string, int > frame_to_laser_
 
std::string global_frame_id_
 
ros::ServiceServer global_loc_srv_
 
ros::Duration gui_publish_period
 
double init_cov_ [3]
 
double init_pose_ [3]
 
gmcl_hyp_tinitial_pose_hyp_
 
ros::Subscriber initial_pose_sub_
 
ros::Subscriber initial_pose_sub_old_
 
double lambda_short_
 
GMCLLaserlaser_
 
ros::Duration laser_check_interval_
 
int laser_index
 
double laser_likelihood_max_dist_
 
double laser_max_range_
 
double laser_min_range_
 
laser_model_t laser_model_type_
 
tf2_ros::MessageFilter< sensor_msgs::LaserScan > * laser_scan_filter_
 
message_filters::Subscriber< sensor_msgs::LaserScan > * laser_scan_sub_
 
std::vector< GMCLLaser * > lasers_
 
std::vector< bool > lasers_update_
 
ros::Time last_cloud_pub_time
 
ros::Time last_laser_received_ts_
 
geometry_msgs::PoseWithCovarianceStamped last_published_pose
 
geometry_msgs::PoseStamped latest_odom_pose_
 
tf2::Transform latest_tf_
 
bool latest_tf_valid_
 
std::vector< GMCLLaserData * > ldata_
 
bool m_force_update
 
map_tmap_
 
ros::Subscriber map_sub_
 
char * mapdata
 
int max_beams_
 
int max_particles_
 
int min_particles_
 
double mutation_prob_
 
int N_aux_particles_
 
ros::NodeHandle nh_
 
ros::ServiceServer nomotion_update_srv_
 
GMCLOdomodom_
 
std::string odom_frame_id_
 
odom_model_t odom_model_type_
 
ros::Publisher particlecloud_pub_
 
pf_tpf_
 
double pf_err_
 
bool pf_init_
 
pf_model_type pf_model_
 
pf_vector_t pf_odom_pose_
 
double pf_z_
 
ros::Publisher pose_pub_
 
ros::NodeHandle private_nh_
 
bool pub_energy_map_
 
int resample_count_
 
int resample_interval_
 
double resolution
 
double resolution_x_
 
double resolution_y_
 
ros::Time save_pose_last_time
 
ros::Duration save_pose_period
 
bool selective_resampling_
 
bool sent_first_transform_
 
ros::ServiceServer set_map_srv_
 
double sigma_hit_
 
double std_warn_level_x_
 
double std_warn_level_y_
 
double std_warn_level_yaw_
 
int sx
 
int sy
 
std::shared_ptr< tf2_ros::Buffertf_
 
bool tf_broadcast_
 
std::shared_ptr< tf2_ros::TransformBroadcastertfb_
 
std::shared_ptr< tf2_ros::TransformListenertfl_
 
double threshold_val_
 
ros::Duration transform_tolerance_
 
bool use_map_topic_
 
double z_hit_
 
double z_max_
 
double z_rand_
 
double z_short_
 

Static Private Attributes

static std::vector< std::pair< int, int > > free_space_indices
 

Detailed Description

Definition at line 140 of file gmcl_node.cpp.

Constructor & Destructor Documentation

◆ GmclNode()

GmclNode::GmclNode ( )

Definition at line 367 of file gmcl_node.cpp.

◆ ~GmclNode()

GmclNode::~GmclNode ( )

Definition at line 1117 of file gmcl_node.cpp.

Member Function Documentation

◆ applyInitialPose()

void GmclNode::applyInitialPose ( )
private

If initial_pose_hyp_ and map_ are both non-null, apply the initial pose to the particle filter state. initial_pose_hyp_ is deleted and set to NULL after it is used.

Definition at line 1919 of file gmcl_node.cpp.

◆ checkLaserReceived()

void GmclNode::checkLaserReceived ( const ros::TimerEvent event)
private

Definition at line 906 of file gmcl_node.cpp.

◆ convertMap()

map_t * GmclNode::convertMap ( const nav_msgs::OccupancyGrid &  map_msg)
private

Convert an OccupancyGrid map message into the internal representation. This allocates a map_t and returns it.

Definition at line 1091 of file gmcl_node.cpp.

◆ freeMapDependentMemory()

void GmclNode::freeMapDependentMemory ( )
private

Definition at line 1066 of file gmcl_node.cpp.

◆ getOdomPose()

bool GmclNode::getOdomPose ( geometry_msgs::PoseStamped &  pose,
double &  x,
double &  y,
double &  yaw,
const ros::Time t,
const std::string &  f 
)
private

Definition at line 1127 of file gmcl_node.cpp.

◆ globalLocalizationCallback()

bool GmclNode::globalLocalizationCallback ( std_srvs::Empty::Request &  req,
std_srvs::Empty::Response &  res 
)
private

Definition at line 1300 of file gmcl_node.cpp.

◆ handelNewLaser()

void GmclNode::handelNewLaser ( const sensor_msgs::LaserScanConstPtr &  laser_scan)
private

Definition at line 1346 of file gmcl_node.cpp.

◆ handleInitialPoseMessage()

void GmclNode::handleInitialPoseMessage ( const geometry_msgs::PoseWithCovarianceStamped &  msg)
private

Definition at line 1838 of file gmcl_node.cpp.

◆ handleMapMessage()

void GmclNode::handleMapMessage ( const nav_msgs::OccupancyGrid &  msg)
private

Definition at line 948 of file gmcl_node.cpp.

◆ initialPoseReceived()

void GmclNode::initialPoseReceived ( const geometry_msgs::PoseWithCovarianceStampedConstPtr &  msg)
private

Definition at line 1832 of file gmcl_node.cpp.

◆ laserReceived()

void GmclNode::laserReceived ( const sensor_msgs::LaserScanConstPtr &  laser_scan)
private

Definition at line 1464 of file gmcl_node.cpp.

◆ mapReceived()

void GmclNode::mapReceived ( const nav_msgs::OccupancyGridConstPtr &  msg)
private

Definition at line 936 of file gmcl_node.cpp.

◆ nomotionUpdateCallback()

bool GmclNode::nomotionUpdateCallback ( std_srvs::Empty::Request &  req,
std_srvs::Empty::Response &  res 
)
private

Definition at line 1325 of file gmcl_node.cpp.

◆ process()

int GmclNode::process ( )

◆ reconfigureCB()

void GmclNode::reconfigureCB ( gmcl::GMCLConfig &  config,
uint32_t  level 
)
private

Definition at line 551 of file gmcl_node.cpp.

◆ requestMap()

void GmclNode::requestMap ( )
private

Definition at line 918 of file gmcl_node.cpp.

◆ runFromBag()

void GmclNode::runFromBag ( const std::string &  in_bag_fn,
bool  trigger_global_localization = false 
)

Uses TF and LaserScan messages from bag file to drive AMCL instead.

Parameters
in_bag_fninput bagfile
trigger_global_localizationwhether to trigger global localization before starting to process the bagfile

Definition at line 746 of file gmcl_node.cpp.

◆ savePoseToServer()

void GmclNode::savePoseToServer ( )

Definition at line 839 of file gmcl_node.cpp.

◆ setMapCallback()

bool GmclNode::setMapCallback ( nav_msgs::SetMap::Request &  req,
nav_msgs::SetMap::Response &  res 
)
private

Definition at line 1334 of file gmcl_node.cpp.

◆ standardDeviationDiagnostics()

void GmclNode::standardDeviationDiagnostics ( diagnostic_updater::DiagnosticStatusWrapper diagnostic_status)
private

Definition at line 1932 of file gmcl_node.cpp.

◆ uniformPoseGenerator()

pf_vector_t GmclNode::uniformPoseGenerator ( pf_t pf,
void *  arg,
void *  e_arg 
)
staticprivate

Definition at line 1154 of file gmcl_node.cpp.

◆ updatePoseFromServer()

void GmclNode::updatePoseFromServer ( )
private

Definition at line 863 of file gmcl_node.cpp.

Member Data Documentation

◆ a_thresh_

double GmclNode::a_thresh_
private

Definition at line 236 of file gmcl_node.cpp.

◆ alpha1_

double GmclNode::alpha1_
private

Definition at line 294 of file gmcl_node.cpp.

◆ alpha2_

double GmclNode::alpha2_
private

Definition at line 294 of file gmcl_node.cpp.

◆ alpha3_

double GmclNode::alpha3_
private

Definition at line 294 of file gmcl_node.cpp.

◆ alpha4_

double GmclNode::alpha4_
private

Definition at line 294 of file gmcl_node.cpp.

◆ alpha5_

double GmclNode::alpha5_
private

Definition at line 294 of file gmcl_node.cpp.

◆ alpha_fast_

double GmclNode::alpha_fast_
private

Definition at line 295 of file gmcl_node.cpp.

◆ alpha_slow_

double GmclNode::alpha_slow_
private

Definition at line 295 of file gmcl_node.cpp.

◆ bag_scan_period_

ros::WallDuration GmclNode::bag_scan_period_
private

Definition at line 254 of file gmcl_node.cpp.

◆ base_frame_id_

std::string GmclNode::base_frame_id_
private

Definition at line 201 of file gmcl_node.cpp.

◆ beam_skip_distance_

double GmclNode::beam_skip_distance_
private

Definition at line 300 of file gmcl_node.cpp.

◆ beam_skip_error_threshold_

double GmclNode::beam_skip_error_threshold_
private

Definition at line 300 of file gmcl_node.cpp.

◆ beam_skip_threshold_

double GmclNode::beam_skip_threshold_
private

Definition at line 300 of file gmcl_node.cpp.

◆ check_laser_timer_

ros::Timer GmclNode::check_laser_timer_
private

Definition at line 291 of file gmcl_node.cpp.

◆ cloud_pub_interval

ros::Duration GmclNode::cloud_pub_interval
private

Definition at line 250 of file gmcl_node.cpp.

◆ configuration_mutex_

boost::recursive_mutex GmclNode::configuration_mutex_
private

Definition at line 288 of file gmcl_node.cpp.

◆ crossover_alpha_

double GmclNode::crossover_alpha_
private

Definition at line 296 of file gmcl_node.cpp.

◆ d_thresh_

double GmclNode::d_thresh_
private

Definition at line 236 of file gmcl_node.cpp.

◆ default_config_

gmcl::GMCLConfig GmclNode::default_config_
private

Definition at line 290 of file gmcl_node.cpp.

◆ diagnosic_updater_

diagnostic_updater::Updater GmclNode::diagnosic_updater_
private

Definition at line 278 of file gmcl_node.cpp.

◆ do_beamskip_

bool GmclNode::do_beamskip_
private

Definition at line 299 of file gmcl_node.cpp.

◆ dsrv_

dynamic_reconfigure::Server<gmcl::GMCLConfig>* GmclNode::dsrv_
private

Definition at line 289 of file gmcl_node.cpp.

◆ energy_map_

energy_map_t* GmclNode::energy_map_
private

Definition at line 218 of file gmcl_node.cpp.

◆ energy_particlecloud_pub_

ros::Publisher GmclNode::energy_particlecloud_pub_
private

Definition at line 271 of file gmcl_node.cpp.

◆ first_map_only_

bool GmclNode::first_map_only_
private

Definition at line 205 of file gmcl_node.cpp.

◆ first_map_received_

bool GmclNode::first_map_received_
private

Definition at line 285 of file gmcl_node.cpp.

◆ first_reconfigure_call_

bool GmclNode::first_reconfigure_call_
private

Definition at line 286 of file gmcl_node.cpp.

◆ frame_to_laser_

std::map< std::string, int > GmclNode::frame_to_laser_
private

Definition at line 229 of file gmcl_node.cpp.

◆ free_space_indices

std::vector< std::pair< int, int > > GmclNode::free_space_indices
staticprivate

Definition at line 171 of file gmcl_node.cpp.

◆ global_frame_id_

std::string GmclNode::global_frame_id_
private

Definition at line 202 of file gmcl_node.cpp.

◆ global_loc_srv_

ros::ServiceServer GmclNode::global_loc_srv_
private

Definition at line 272 of file gmcl_node.cpp.

◆ gui_publish_period

ros::Duration GmclNode::gui_publish_period
private

Definition at line 207 of file gmcl_node.cpp.

◆ init_cov_

double GmclNode::init_cov_[3]
private

Definition at line 304 of file gmcl_node.cpp.

◆ init_pose_

double GmclNode::init_pose_[3]
private

Definition at line 303 of file gmcl_node.cpp.

◆ initial_pose_hyp_

gmcl_hyp_t* GmclNode::initial_pose_hyp_
private

Definition at line 284 of file gmcl_node.cpp.

◆ initial_pose_sub_

ros::Subscriber GmclNode::initial_pose_sub_
private

Definition at line 225 of file gmcl_node.cpp.

◆ initial_pose_sub_old_

ros::Subscriber GmclNode::initial_pose_sub_old_
private

Definition at line 275 of file gmcl_node.cpp.

◆ lambda_short_

double GmclNode::lambda_short_
private

Definition at line 297 of file gmcl_node.cpp.

◆ laser_

GMCLLaser* GmclNode::laser_
private

Definition at line 247 of file gmcl_node.cpp.

◆ laser_check_interval_

ros::Duration GmclNode::laser_check_interval_
private

Definition at line 313 of file gmcl_node.cpp.

◆ laser_index

int GmclNode::laser_index
private

Definition at line 248 of file gmcl_node.cpp.

◆ laser_likelihood_max_dist_

double GmclNode::laser_likelihood_max_dist_
private

Definition at line 301 of file gmcl_node.cpp.

◆ laser_max_range_

double GmclNode::laser_max_range_
private

Definition at line 240 of file gmcl_node.cpp.

◆ laser_min_range_

double GmclNode::laser_min_range_
private

Definition at line 239 of file gmcl_node.cpp.

◆ laser_model_type_

laser_model_t GmclNode::laser_model_type_
private

Definition at line 305 of file gmcl_node.cpp.

◆ laser_scan_filter_

tf2_ros::MessageFilter<sensor_msgs::LaserScan>* GmclNode::laser_scan_filter_
private

Definition at line 224 of file gmcl_node.cpp.

◆ laser_scan_sub_

message_filters::Subscriber<sensor_msgs::LaserScan>* GmclNode::laser_scan_sub_
private

Definition at line 223 of file gmcl_node.cpp.

◆ lasers_

std::vector< GMCLLaser* > GmclNode::lasers_
private

Definition at line 226 of file gmcl_node.cpp.

◆ lasers_update_

std::vector< bool > GmclNode::lasers_update_
private

Definition at line 228 of file gmcl_node.cpp.

◆ last_cloud_pub_time

ros::Time GmclNode::last_cloud_pub_time
private

Definition at line 251 of file gmcl_node.cpp.

◆ last_laser_received_ts_

ros::Time GmclNode::last_laser_received_ts_
private

Definition at line 312 of file gmcl_node.cpp.

◆ last_published_pose

geometry_msgs::PoseWithCovarianceStamped GmclNode::last_published_pose
private

Definition at line 211 of file gmcl_node.cpp.

◆ latest_odom_pose_

geometry_msgs::PoseStamped GmclNode::latest_odom_pose_
private

Definition at line 198 of file gmcl_node.cpp.

◆ latest_tf_

tf2::Transform GmclNode::latest_tf_
private

Definition at line 164 of file gmcl_node.cpp.

◆ latest_tf_valid_

bool GmclNode::latest_tf_valid_
private

Definition at line 165 of file gmcl_node.cpp.

◆ ldata_

std::vector< GMCLLaserData* > GmclNode::ldata_
private

Definition at line 227 of file gmcl_node.cpp.

◆ m_force_update

bool GmclNode::m_force_update
private

Definition at line 244 of file gmcl_node.cpp.

◆ map_

map_t* GmclNode::map_
private

Definition at line 213 of file gmcl_node.cpp.

◆ map_sub_

ros::Subscriber GmclNode::map_sub_
private

Definition at line 276 of file gmcl_node.cpp.

◆ mapdata

char* GmclNode::mapdata
private

Definition at line 214 of file gmcl_node.cpp.

◆ max_beams_

int GmclNode::max_beams_
private

Definition at line 293 of file gmcl_node.cpp.

◆ max_particles_

int GmclNode::max_particles_
private

Definition at line 293 of file gmcl_node.cpp.

◆ min_particles_

int GmclNode::min_particles_
private

Definition at line 293 of file gmcl_node.cpp.

◆ mutation_prob_

double GmclNode::mutation_prob_
private

Definition at line 296 of file gmcl_node.cpp.

◆ N_aux_particles_

int GmclNode::N_aux_particles_
private

Definition at line 293 of file gmcl_node.cpp.

◆ nh_

ros::NodeHandle GmclNode::nh_
private

Definition at line 267 of file gmcl_node.cpp.

◆ nomotion_update_srv_

ros::ServiceServer GmclNode::nomotion_update_srv_
private

Definition at line 273 of file gmcl_node.cpp.

◆ odom_

GMCLOdom* GmclNode::odom_
private

Definition at line 246 of file gmcl_node.cpp.

◆ odom_frame_id_

std::string GmclNode::odom_frame_id_
private

Definition at line 195 of file gmcl_node.cpp.

◆ odom_model_type_

odom_model_t GmclNode::odom_model_type_
private

Definition at line 302 of file gmcl_node.cpp.

◆ particlecloud_pub_

ros::Publisher GmclNode::particlecloud_pub_
private

Definition at line 270 of file gmcl_node.cpp.

◆ pf_

pf_t* GmclNode::pf_
private

Definition at line 232 of file gmcl_node.cpp.

◆ pf_err_

double GmclNode::pf_err_
private

Definition at line 233 of file gmcl_node.cpp.

◆ pf_init_

bool GmclNode::pf_init_
private

Definition at line 234 of file gmcl_node.cpp.

◆ pf_model_

pf_model_type GmclNode::pf_model_
private

Definition at line 241 of file gmcl_node.cpp.

◆ pf_odom_pose_

pf_vector_t GmclNode::pf_odom_pose_
private

Definition at line 235 of file gmcl_node.cpp.

◆ pf_z_

double GmclNode::pf_z_
private

Definition at line 233 of file gmcl_node.cpp.

◆ pose_pub_

ros::Publisher GmclNode::pose_pub_
private

Definition at line 269 of file gmcl_node.cpp.

◆ private_nh_

ros::NodeHandle GmclNode::private_nh_
private

Definition at line 268 of file gmcl_node.cpp.

◆ pub_energy_map_

bool GmclNode::pub_energy_map_
private

Definition at line 221 of file gmcl_node.cpp.

◆ resample_count_

int GmclNode::resample_count_
private

Definition at line 238 of file gmcl_node.cpp.

◆ resample_interval_

int GmclNode::resample_interval_
private

Definition at line 237 of file gmcl_node.cpp.

◆ resolution

double GmclNode::resolution
private

Definition at line 216 of file gmcl_node.cpp.

◆ resolution_x_

double GmclNode::resolution_x_
private

Definition at line 219 of file gmcl_node.cpp.

◆ resolution_y_

double GmclNode::resolution_y_
private

Definition at line 219 of file gmcl_node.cpp.

◆ save_pose_last_time

ros::Time GmclNode::save_pose_last_time
private

Definition at line 208 of file gmcl_node.cpp.

◆ save_pose_period

ros::Duration GmclNode::save_pose_period
private

Definition at line 209 of file gmcl_node.cpp.

◆ selective_resampling_

bool GmclNode::selective_resampling_
private

Definition at line 307 of file gmcl_node.cpp.

◆ sent_first_transform_

bool GmclNode::sent_first_transform_
private

Definition at line 162 of file gmcl_node.cpp.

◆ set_map_srv_

ros::ServiceServer GmclNode::set_map_srv_
private

Definition at line 274 of file gmcl_node.cpp.

◆ sigma_hit_

double GmclNode::sigma_hit_
private

Definition at line 297 of file gmcl_node.cpp.

◆ std_warn_level_x_

double GmclNode::std_warn_level_x_
private

Definition at line 280 of file gmcl_node.cpp.

◆ std_warn_level_y_

double GmclNode::std_warn_level_y_
private

Definition at line 281 of file gmcl_node.cpp.

◆ std_warn_level_yaw_

double GmclNode::std_warn_level_yaw_
private

Definition at line 282 of file gmcl_node.cpp.

◆ sx

int GmclNode::sx
private

Definition at line 215 of file gmcl_node.cpp.

◆ sy

int GmclNode::sy
private

Definition at line 215 of file gmcl_node.cpp.

◆ tf_

std::shared_ptr<tf2_ros::Buffer> GmclNode::tf_
private

Definition at line 160 of file gmcl_node.cpp.

◆ tf_broadcast_

bool GmclNode::tf_broadcast_
private

Definition at line 306 of file gmcl_node.cpp.

◆ tfb_

std::shared_ptr<tf2_ros::TransformBroadcaster> GmclNode::tfb_
private

Definition at line 158 of file gmcl_node.cpp.

◆ tfl_

std::shared_ptr<tf2_ros::TransformListener> GmclNode::tfl_
private

Definition at line 159 of file gmcl_node.cpp.

◆ threshold_val_

double GmclNode::threshold_val_
private

Definition at line 220 of file gmcl_node.cpp.

◆ transform_tolerance_

ros::Duration GmclNode::transform_tolerance_
private

Definition at line 265 of file gmcl_node.cpp.

◆ use_map_topic_

bool GmclNode::use_map_topic_
private

Definition at line 204 of file gmcl_node.cpp.

◆ z_hit_

double GmclNode::z_hit_
private

Definition at line 297 of file gmcl_node.cpp.

◆ z_max_

double GmclNode::z_max_
private

Definition at line 297 of file gmcl_node.cpp.

◆ z_rand_

double GmclNode::z_rand_
private

Definition at line 297 of file gmcl_node.cpp.

◆ z_short_

double GmclNode::z_short_
private

Definition at line 297 of file gmcl_node.cpp.


The documentation for this class was generated from the following file:


gmcl
Author(s): Mhd Ali Alshikh Khalil, adler1994@gmail.com
autogenerated on Wed Mar 2 2022 00:20:15