ld_slip.c
Go to the documentation of this file.
1 #include <gsl/gsl_rng.h>
2 #include <gsl/gsl_randist.h>
3 #include <gsl/gsl_math.h>
4 
5 #include <math.h>
6 #include <options/options.h>
7 
8 #include "../csm/csm_all.h"
9 
10 struct ld_noise_params {
11  int seed;
12 
13  double sigma_xy;
15 
16  const char* file_input;
17  const char* file_output;
18 
19  int debug;
20 };
21 
22 const char * banner =
23  "A simple program for adding slip to odometry \n\n"
24  "The 'odometry' field is set to 'true_pose' + noise.\n"
25  "If 'true_pose' is not available, then the 'odometry' \n"
26  "field is set to 'odometry' + noise.\n\n"
27  "Note: this program does *not* simulate the effect of \n"
28  "slip or odometry error in a realistic way; each scan \n"
29  "in the file is considered separately, the error does \n"
30  "not depend on the traveled distance, etc.\n\n";
31 
32 int main(int argc, const char ** argv) {
33  sm_set_program_name(argv[0]);
34 
35  struct ld_noise_params p;
36 
38 
39  struct option* ops = options_allocate(10);
40  options_double(ops, "sigma_theta_deg", &p.sigma_theta_deg, 0.0,
41  "Std deviation of gaussian noise for theta (deg) (disabled if 0)");
42  options_double(ops, "sigma_xy", &p.sigma_xy, 0.0,
43  "Std deviation of gaussian noise for x,y (disabled if 0)");
44  options_int(ops, "seed", &p.seed, 0,
45  "Seed for random number generator (if 0, use GSL_RNG_SEED env. variable).");
46  options_string(ops, "in", &p.file_input, "stdin", "Input file ");
47  options_string(ops, "out", &p.file_output, "stdout", "Output file ");
48 
49  options_int(ops, "debug", &p.debug, 0, "Shows debug information");
50 
51 
52  if(!options_parse_args(ops, argc, argv)) {
53  options_print_help(ops, stderr);
54  return -1;
55  }
56 
57  sm_debug_write(p.debug);
58 
59  gsl_rng_env_setup();
60  gsl_rng * rng = gsl_rng_alloc (gsl_rng_ranlxs0);
61  if(p.seed != 0)
62  gsl_rng_set(rng, (unsigned int) p.seed);
63 
64 
65  FILE * in = open_file_for_reading(p.file_input);
66  if(!in) return -3;
67 
68  FILE * out = open_file_for_writing(p.file_output);
69  if(!out) return -2;
70 
71  LDP ld; int count=0;
72  while( (ld = ld_read_smart(in))) {
73  count++;
74  if(!ld_valid_fields(ld)) {
75  sm_error("Invalid laser data (#%d in file)\n", count);
76  continue;
77  }
78 
79  if(!any_nan(ld->true_pose, 3))
80  copy_d( (const double*) ld->true_pose, 3, ld->odometry);
81 
82  double e[3] = {0,0,0};
83 
84  if(p.sigma_xy > 0) {
85  e[0] = gsl_ran_gaussian(rng, p.sigma_xy);
86  e[1] = gsl_ran_gaussian(rng, p.sigma_xy);
87  }
88 
89  if(p.sigma_theta_deg > 0) {
90  e[2] = gsl_ran_gaussian(rng, deg2rad(p.sigma_theta_deg));
91  }
92 
93  ld->odometry[0] += e[0];
94  ld->odometry[1] += e[1];
95  ld->odometry[2] += e[2];
96 
97  sm_debug("Adding noise %s.\n", friendly_pose(e));
98 
99  ld_write_as_json(ld, out);
100 
101  ld_free(ld);
102  }
103 
104  return 0;
105 }
copy_d
void copy_d(const double *from, int n, double *to)
Definition: math_utils.c:83
any_nan
int any_nan(const double *d, int n)
Definition: math_utils.c:64
sm_debug
void sm_debug(const char *msg,...)
Definition: logging.c:88
rng
gsl_rng * rng
Definition: ld_resample.c:18
p
struct @0 p
ld_valid_fields
int ld_valid_fields(LDP ld)
Definition: laser_data.c:179
ld_noise_params::sigma_xy
double sigma_xy
Definition: ld_slip.c:13
deg2rad
#define deg2rad(x)
Definition: gpc_test.c:22
ld_noise_params
Definition: ld_noise.c:10
open_file_for_writing
FILE * open_file_for_writing(const char *filename)
Definition: utils.c:25
laser_data::odometry
double odometry[3]
Definition: laser_data.h:39
options.h
ld_free
void ld_free(LDP ld)
Definition: laser_data.c:87
options_double
void options_double(struct option *, const char *name, double *p, double def_value, const char *desc)
Definition: options_interface.c:62
sm_set_program_name
void sm_set_program_name(const char *name)
Definition: logging.c:21
friendly_pose
const char * friendly_pose(const double *pose)
Definition: math_utils.c:266
ld_noise_params::seed
int seed
Definition: ld_noise.c:11
options_allocate
struct option * options_allocate(int n)
Definition: options_interface.c:16
options_int
void options_int(struct option *, const char *name, int *p, int def_value, const char *desc)
Definition: options_interface.c:39
open_file_for_reading
FILE * open_file_for_reading(const char *filename)
Definition: utils.c:19
ops
struct option * ops
Definition: rb_sm.c:31
main
int main(int argc, const char **argv)
Definition: ld_slip.c:32
ld_noise_params::file_output
const char * file_output
Definition: ld_noise.c:15
banner
const char * banner
Definition: ld_slip.c:22
option
Definition: options.h:49
options_print_help
void options_print_help(struct option *options, FILE *f)
Definition: options.c:398
sm_error
void sm_error(const char *msg,...)
Definition: logging.c:49
ld_noise_params::file_input
const char * file_input
Definition: ld_noise.c:14
ld_noise_params::sigma_theta_deg
double sigma_theta_deg
Definition: ld_slip.c:14
laser_data
Definition: laser_data.h:16
ld_noise_params::debug
int debug
Definition: ld_slip.c:19
ld_read_smart
LDP ld_read_smart(FILE *)
Definition: laser_data_load.c:130
laser_data::true_pose
double true_pose[3]
Definition: laser_data.h:38
options_string
void options_string(struct option *, const char *name, const char **p, const char *def_balue, const char *desc)
Definition: options_interface.c:72
options_parse_args
int options_parse_args(struct option *ops, int argc, const char *argv[])
Definition: options.c:66
ld_write_as_json
void ld_write_as_json(LDP ld, FILE *stream)
Definition: laser_data_json.c:258
sm_debug_write
void sm_debug_write(int flag)
Definition: logging.c:16
options_banner
void options_banner(const char *message)
Definition: options.c:33


csm
Author(s): Andrea Censi
autogenerated on Wed Aug 17 2022 02:50:33