From 3fe89dfb7183af077f122521ab462705e2e1c28b Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 12:03:45 -0400 Subject: [PATCH 01/41] go config lidar rename --- config/config.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/config/config.go b/config/config.go index 21097c20..879f4a10 100644 --- a/config/config.go +++ b/config/config.go @@ -14,19 +14,19 @@ func newError(configError string) error { // Config describes how to configure the SLAM service. type Config struct { - Sensors []string `json:"sensors"` + Camera map[string]string `json:"camera"` ConfigParams map[string]string `json:"config_params"` DataDirectory string `json:"data_dir"` - DataRateMsec int `json:"data_rate_msec"` + DataFreqHz int `json:"data_freq_hz"` MapRateSec *int `json:"map_rate_sec"` } -var errSensorsMustNotBeEmpty = errors.New("\"sensors\" must not be empty") +var errCameraMustNotBeEmpty = errors.New("\"camera\" must not be empty") // Validate creates the list of implicit dependencies. -func (config *Config) Validate(path string) ([]string, error) { - if config.Sensors == nil || len(config.Sensors) < 1 { - return nil, utils.NewConfigValidationError(path, errSensorsMustNotBeEmpty) +func (config *Config) Validate(path string) (map[string]string, error) { + if config.Camera == nil || len(config.Camera) < 1 { + return nil, utils.NewConfigValidationError(path, errCameraMustNotBeEmpty) } if config.ConfigParams["mode"] == "" { @@ -37,15 +37,15 @@ func (config *Config) Validate(path string) ([]string, error) { return nil, utils.NewConfigValidationFieldRequiredError(path, "data_dir") } - if config.DataRateMsec < 0 { - return nil, errors.New("cannot specify data_rate_msec less than zero") + if config.DataFreqHz < 0 { + return nil, errors.New("cannot specify data_freq_hz less than zero") } if config.MapRateSec != nil && *config.MapRateSec < 0 { return nil, errors.New("cannot specify map_rate_sec less than zero") } - deps := config.Sensors + deps := config.Camera return deps, nil } @@ -53,12 +53,12 @@ func (config *Config) Validate(path string) ([]string, error) { // GetOptionalParameters sets any unset optional config parameters to the values passed to this function, // and returns them. func GetOptionalParameters(config *Config, - defaultDataRateMsec, defaultMapRateSec int, logger golog.Logger, + defaultDataFreqHz, defaultMapRateSec int, logger golog.Logger, ) (int, int) { - dataRateMsec := config.DataRateMsec - if config.DataRateMsec == 0 { - dataRateMsec = defaultDataRateMsec - logger.Debugf("no data_rate_msec given, setting to default value of %d", defaultDataRateMsec) + dataFreqHz := config.DataFreqHz + if config.DataFreqHz == 0 { + dataFreqHz = defaultDataFreqHz + logger.Debugf("no data_freq_hz given, setting to default value of %d", defaultDataFreqHz) } mapRateSec := 0 @@ -69,5 +69,5 @@ func GetOptionalParameters(config *Config, mapRateSec = *config.MapRateSec } - return dataRateMsec, mapRateSec + return dataFreqHz, mapRateSec } From 00badc564ddd18136a5d9917c79b34a478ae86ef Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 12:44:57 -0400 Subject: [PATCH 02/41] more go config changes --- config/config.go | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/config/config.go b/config/config.go index 879f4a10..d9250c27 100644 --- a/config/config.go +++ b/config/config.go @@ -2,6 +2,8 @@ package config import ( + "strconv" + "github.com/edaniels/golog" "github.com/pkg/errors" "go.viam.com/utils" @@ -17,16 +19,27 @@ type Config struct { Camera map[string]string `json:"camera"` ConfigParams map[string]string `json:"config_params"` DataDirectory string `json:"data_dir"` - DataFreqHz int `json:"data_freq_hz"` MapRateSec *int `json:"map_rate_sec"` } -var errCameraMustNotBeEmpty = errors.New("\"camera\" must not be empty") +var errCameraMustHaveName = errors.New("\"camera\" must have name") // Validate creates the list of implicit dependencies. func (config *Config) Validate(path string) (map[string]string, error) { - if config.Camera == nil || len(config.Camera) < 1 { - return nil, utils.NewConfigValidationError(path, errCameraMustNotBeEmpty) + _, ok := config.Camera["name"] + if !ok { + return nil, utils.NewConfigValidationError(path, errCameraMustHaveName) + } + data_freq_hz, ok := config.Camera["data_freq_hz"] + if ok { + data_freq_hz, err := strconv.Atoi(data_freq_hz) + if err != nil { + return nil, errors.New("data_freq_hz must be a number") + } + if data_freq_hz < 0 { + return nil, errors.New("cannot specify data_freq_hz less than zero") + } + } if config.ConfigParams["mode"] == "" { @@ -37,10 +50,6 @@ func (config *Config) Validate(path string) (map[string]string, error) { return nil, utils.NewConfigValidationFieldRequiredError(path, "data_dir") } - if config.DataFreqHz < 0 { - return nil, errors.New("cannot specify data_freq_hz less than zero") - } - if config.MapRateSec != nil && *config.MapRateSec < 0 { return nil, errors.New("cannot specify map_rate_sec less than zero") } @@ -55,10 +64,12 @@ func (config *Config) Validate(path string) (map[string]string, error) { func GetOptionalParameters(config *Config, defaultDataFreqHz, defaultMapRateSec int, logger golog.Logger, ) (int, int) { - dataFreqHz := config.DataFreqHz - if config.DataFreqHz == 0 { - dataFreqHz = defaultDataFreqHz + dataFreqHz := defaultDataFreqHz + dataFreqHzIn, ok := config.Camera["data_freq_hz"] + if !ok { logger.Debugf("no data_freq_hz given, setting to default value of %d", defaultDataFreqHz) + } else { + dataFreqHz, _ = strconv.Atoi(dataFreqHzIn) } mapRateSec := 0 From c6601b4725f770bfb66776733383df050105c313 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 14:03:39 -0400 Subject: [PATCH 03/41] go config passing tests with new sensors naming --- config/config.go | 4 +-- config/config_test.go | 70 +++++++++++++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/config/config.go b/config/config.go index d9250c27..4cb1d64c 100644 --- a/config/config.go +++ b/config/config.go @@ -22,7 +22,7 @@ type Config struct { MapRateSec *int `json:"map_rate_sec"` } -var errCameraMustHaveName = errors.New("\"camera\" must have name") +var errCameraMustHaveName = errors.New("\"camera[name]\" is required") // Validate creates the list of implicit dependencies. func (config *Config) Validate(path string) (map[string]string, error) { @@ -34,7 +34,7 @@ func (config *Config) Validate(path string) (map[string]string, error) { if ok { data_freq_hz, err := strconv.Atoi(data_freq_hz) if err != nil { - return nil, errors.New("data_freq_hz must be a number") + return nil, errors.New("data_freq_hz must only contain digits") } if data_freq_hz < 0 { return nil, errors.New("cannot specify data_freq_hz less than zero") diff --git a/config/config_test.go b/config/config_test.go index e056d95b..ab977286 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -18,7 +18,7 @@ func TestValidate(t *testing.T) { model := resource.DefaultModelFamily.WithModel("test") cfgService := resource.Config{Name: "test", API: slam.API, Model: model} _, err := newConfig(cfgService) - test.That(t, err, test.ShouldBeError, newError("error validating \"services.slam.attributes.fake\": \"sensors\" must not be empty")) + test.That(t, err, test.ShouldBeError, newError("error validating \"services.slam.attributes.fake\": \"camera[name]\" is required")) }) t.Run("Simplest valid config", func(t *testing.T) { @@ -28,13 +28,13 @@ func TestValidate(t *testing.T) { }) t.Run("Config without required fields", func(t *testing.T) { - requiredFields := []string{"data_dir", "sensors"} + requiredFields := []string{"data_dir", "camera"} dataDirErr := utils.NewConfigValidationFieldRequiredError(testCfgPath, requiredFields[0]) - sensorsErr := utils.NewConfigValidationError(testCfgPath, errSensorsMustNotBeEmpty) + cameraErr := utils.NewConfigValidationError(testCfgPath, errCameraMustHaveName) expectedErrors := []error{ newError(dataDirErr.Error()), - newError(sensorsErr.Error()), + newError(cameraErr.Error()), } for i, requiredField := range requiredFields { logger.Debugf("Testing SLAM config without %s\n", requiredField) @@ -50,6 +50,16 @@ func TestValidate(t *testing.T) { delete(cfgService.Attributes["config_params"].(map[string]string), "mode") _, err := newConfig(cfgService) test.That(t, err, test.ShouldBeError, newError(utils.NewConfigValidationFieldRequiredError(testCfgPath, "config_params[mode]").Error())) + + }) + + t.Run("Config without camera name", func(t *testing.T) { + // Test for missing camera name attribute + logger.Debug("Testing SLAM config without camera[name]") + cfgService := makeCfgService() + delete(cfgService.Attributes["camera"].(map[string]string), "name") + _, err := newConfig(cfgService) + test.That(t, err, test.ShouldBeError, newError(utils.NewConfigValidationFieldRequiredError(testCfgPath, "camera[name]").Error())) }) t.Run("Config with invalid parameter type", func(t *testing.T) { @@ -63,12 +73,28 @@ func TestValidate(t *testing.T) { test.That(t, err, test.ShouldBeNil) }) + t.Run("Config with invalid camera data_freq_hz", func(t *testing.T) { + cfgService := makeCfgService() + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "twenty", + } + _, err := newConfig(cfgService) + test.That(t, err, test.ShouldBeError, newError("data_freq_hz must only contain digits")) + }) + t.Run("Config with out of range values", func(t *testing.T) { cfgService := makeCfgService() - cfgService.Attributes["data_rate_msec"] = -1 + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "-1", + } _, err := newConfig(cfgService) - test.That(t, err, test.ShouldBeError, newError("cannot specify data_rate_msec less than zero")) - cfgService.Attributes["data_rate_msec"] = 1 + test.That(t, err, test.ShouldBeError, newError("cannot specify data_freq_hz less than zero")) + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "1", + } cfgService.Attributes["map_rate_sec"] = -1 _, err = newConfig(cfgService) test.That(t, err, test.ShouldBeError, newError("cannot specify map_rate_sec less than zero")) @@ -76,8 +102,10 @@ func TestValidate(t *testing.T) { t.Run("All parameters e2e", func(t *testing.T) { cfgService := makeCfgService() - cfgService.Attributes["sensors"] = []string{"a", "b"} - cfgService.Attributes["data_rate_msec"] = 1001 + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "20", + } cfgService.Attributes["map_rate_sec"] = 1002 cfgService.Attributes["config_params"] = map[string]string{ @@ -88,8 +116,7 @@ func TestValidate(t *testing.T) { cfg, err := newConfig(cfgService) test.That(t, err, test.ShouldBeNil) test.That(t, cfg.DataDirectory, test.ShouldEqual, cfgService.Attributes["data_dir"]) - test.That(t, cfg.Sensors, test.ShouldResemble, cfgService.Attributes["sensors"]) - test.That(t, cfg.DataRateMsec, test.ShouldEqual, cfgService.Attributes["data_rate_msec"]) + test.That(t, cfg.Camera, test.ShouldResemble, cfgService.Attributes["camera"]) test.That(t, *cfg.MapRateSec, test.ShouldEqual, cfgService.Attributes["map_rate_sec"]) test.That(t, cfg.ConfigParams, test.ShouldResemble, cfgService.Attributes["config_params"]) }) @@ -104,7 +131,10 @@ func makeCfgService() resource.Config { "mode": "test mode", } cfgService.Attributes["data_dir"] = "path" - cfgService.Attributes["sensors"] = []string{"a"} + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "20", + } return cfgService } @@ -113,32 +143,34 @@ func TestGetOptionalParameters(t *testing.T) { t.Run("Pass default parameters", func(t *testing.T) { cfgService := makeCfgService() - cfgService.Attributes["sensors"] = []string{"a"} + cfgService.Attributes["camera"] = map[string]string{"name": "a"} cfg, err := newConfig(cfgService) test.That(t, err, test.ShouldBeNil) - dataRateMsec, mapRateSec := GetOptionalParameters( + dataFreqHz, mapRateSec := GetOptionalParameters( cfg, 1001, 1002, logger) - test.That(t, dataRateMsec, test.ShouldEqual, 1001) + test.That(t, dataFreqHz, test.ShouldEqual, 1001) test.That(t, mapRateSec, test.ShouldEqual, 1002) }) t.Run("Return overrides", func(t *testing.T) { cfgService := makeCfgService() - cfgService.Attributes["sensors"] = []string{"a"} + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "1", + } cfg, err := newConfig(cfgService) two := 2 - cfg.DataRateMsec = 1 cfg.MapRateSec = &two test.That(t, err, test.ShouldBeNil) - dataRateMsec, mapRateSec := GetOptionalParameters( + dataFreqHz, mapRateSec := GetOptionalParameters( cfg, 1001, 1002, logger) - test.That(t, dataRateMsec, test.ShouldEqual, 1) + test.That(t, dataFreqHz, test.ShouldEqual, 1) test.That(t, mapRateSec, test.ShouldEqual, 2) }) } From 4c276e3c0083b5a339745b80182d4d8baeaaa75c Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 14:14:56 -0400 Subject: [PATCH 04/41] fixed naming in integration tests --- integration_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integration_test.go b/integration_test.go index c0d0f09a..a34b3482 100644 --- a/integration_test.go +++ b/integration_test.go @@ -110,7 +110,7 @@ func testHelperCartographer( defer termFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"stub_lidar"}, + Camera: map[string]string{"name": "stub_lidar"}, ConfigParams: map[string]string{ "mode": reflect.ValueOf(subAlgo).String(), }, @@ -120,7 +120,7 @@ func testHelperCartographer( done := make(chan struct{}) sensorReadingInterval := time.Millisecond * 200 - timedSensor, err := testhelper.IntegrationLidarTimedSensor(t, attrCfg.Sensors[0], replaySensor, sensorReadingInterval, done) + timedSensor, err := testhelper.IntegrationLidarTimedSensor(t, attrCfg.Camera["name"], replaySensor, sensorReadingInterval, done) test.That(t, err, test.ShouldBeNil) svc, err := testhelper.CreateIntegrationSLAMService(t, attrCfg, timedSensor, logger) @@ -140,7 +140,7 @@ func testHelperCartographer( test.That(t, errors.New("test timeout"), test.ShouldBeNil) } - testCartographerPosition(t, svc, attrCfg.Sensors[0]) + testCartographerPosition(t, svc, attrCfg.Camera["name"]) testCartographerMap(t, svc, cSvc.SlamMode == cartofacade.LocalizingMode) internalState, err := slam.GetInternalStateFull(context.Background(), svc) From ba1a345d05a652c83b0ad000773ac8534fdcc7b0 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 15:23:06 -0400 Subject: [PATCH 05/41] structural changes to lidar --- sensors/sensors.go | 57 +++++++++++++++++++++++++------------------- viam_cartographer.go | 1 - 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/sensors/sensors.go b/sensors/sensors.go index 5cf7b6d9..c725dc94 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -4,7 +4,7 @@ package sensors import ( "bytes" "context" - "strings" + "strconv" "time" "github.com/edaniels/golog" @@ -18,16 +18,14 @@ import ( ) const ( - // The Lidar is expected to be located at the first - // index in the provided `sensors` array in the slam - // service configuration. - lidarIndex = 0 + defaultDataFreqHz = 20 ) // Lidar represents a LIDAR sensor. type Lidar struct { - Name string - lidar camera.Camera + Name string + lidar camera.Camera + dataFreqHz int } // TimedSensorReadingResponse represents a sensor reading with a time & allows the caller to know if the reading is from a replay sensor. @@ -46,38 +44,49 @@ type TimedSensor interface { func NewLidar( ctx context.Context, deps resource.Dependencies, - sensors []string, + cam map[string]string, logger golog.Logger, ) (Lidar, error) { _, span := trace.StartSpan(ctx, "viamcartographer::sensors::NewLidar") defer span.End() - // An empty `sensors: []` array is allowed in offline mode. - if len(sensors) == 0 { - logger.Debug("no sensor provided in 'sensors' config parameter") + // An empty camera field is allowed in offline mode. + _, ok := cam["name"] + if !ok { + logger.Debug("no camera provided in 'camera' config parameter") return Lidar{}, nil } - // If there is a sensor provided in the 'sensors' array, we enforce that only one - // sensor has to be provided. - if len(sensors) != 1 { - return Lidar{}, errors.Errorf("configuring lidar camera error: "+ - "'sensors' must contain only one lidar camera, but is 'sensors: [%v]'", - strings.Join(sensors, ", ")) - } - - name, err := getName(sensors, lidarIndex) - if err != nil { - return Lidar{}, err + name := cam["name"] + dataFreqHz := defaultDataFreqHz + dataFreqHzIn, ok := cam["data_freq_hz"] + if !ok { + logger.Debugf("no data_freq_hz given, setting to default value of %d", defaultDataFreqHz) + } else { + var err error + dataFreqHz, err = strconv.Atoi(dataFreqHzIn) + if err != nil { + logger.Debug("data_freq_hz must only contain digits, setting to default value of %d", defaultDataFreqHz) + } } newLidar, err := camera.FromDependencies(deps, name) if err != nil { return Lidar{}, errors.Wrapf(err, "error getting lidar camera %v for slam service", name) } + // If there is a camera provided in the 'camera' field, we enforce that it supports PCD. + properties, err := newLidar.Properties(ctx) + if err != nil { + return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", name) + } + if !properties.SupportsPCD { + return Lidar{}, errors.Errorf("configuring lidar camera error: " + + "'camera' must support PCD") + } return Lidar{ - Name: name, - lidar: newLidar, + Name: name, + lidar: newLidar, + dataFreqHz: dataFreqHz, }, nil } diff --git a/viam_cartographer.go b/viam_cartographer.go index 8309e0c5..078a121b 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -401,7 +401,6 @@ type CartographerService struct { cartofacade cartofacade.Interface cartoFacadeTimeout time.Duration - dataRateMs int mapRateSec int cancelSensorProcessFunc func() From 41f06ad1a51a615687624a822acc7dad6877e87b Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 15:30:58 -0400 Subject: [PATCH 06/41] initial changes --- cartofacade/capi.go | 2 +- cartofacade/testhelpers.go | 4 ++-- config/config.go | 15 +++------------ sensors/sensors_test.go | 4 ++-- viam_cartographer.go | 20 ++++++++++---------- 5 files changed, 18 insertions(+), 27 deletions(-) diff --git a/cartofacade/capi.go b/cartofacade/capi.go index 52770afd..209554bc 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -99,7 +99,7 @@ const ( // CartoConfig contains config values from app type CartoConfig struct { - Sensors []string + Camera map[string]string MapRateSecond int DataDir string ComponentReference string diff --git a/cartofacade/testhelpers.go b/cartofacade/testhelpers.go index 366d906c..f9791ffd 100644 --- a/cartofacade/testhelpers.go +++ b/cartofacade/testhelpers.go @@ -12,7 +12,7 @@ func GetTestConfig(sensor string) (CartoConfig, string, error) { } return CartoConfig{ - Sensors: []string{sensor, "imu"}, + Camera: map[string]string{"name": "test_lidar", "data_freq_hz": "20"}, MapRateSecond: 5, DataDir: dir, ComponentReference: "component", @@ -23,7 +23,7 @@ func GetTestConfig(sensor string) (CartoConfig, string, error) { // GetBadTestConfig gets a sample config for testing purposes that will cause a failure. func GetBadTestConfig() CartoConfig { return CartoConfig{ - Sensors: []string{"rplidar", "imu"}, + Camera: map[string]string{"name": "rplidar", "data_freq_hz": "20"}, LidarConfig: TwoD, } } diff --git a/config/config.go b/config/config.go index 4cb1d64c..afd0abd8 100644 --- a/config/config.go +++ b/config/config.go @@ -61,17 +61,8 @@ func (config *Config) Validate(path string) (map[string]string, error) { // GetOptionalParameters sets any unset optional config parameters to the values passed to this function, // and returns them. -func GetOptionalParameters(config *Config, - defaultDataFreqHz, defaultMapRateSec int, logger golog.Logger, -) (int, int) { - dataFreqHz := defaultDataFreqHz - dataFreqHzIn, ok := config.Camera["data_freq_hz"] - if !ok { - logger.Debugf("no data_freq_hz given, setting to default value of %d", defaultDataFreqHz) - } else { - dataFreqHz, _ = strconv.Atoi(dataFreqHzIn) - } - +func GetOptionalParameters(config *Config, defaultMapRateSec int, logger golog.Logger, +) int { mapRateSec := 0 if config.MapRateSec == nil { logger.Debugf("no map_rate_sec given, setting to default value of %d", defaultMapRateSec) @@ -80,5 +71,5 @@ func GetOptionalParameters(config *Config, mapRateSec = *config.MapRateSec } - return dataFreqHz, mapRateSec + return mapRateSec } diff --git a/sensors/sensors_test.go b/sensors/sensors_test.go index f8899b8e..e74df005 100644 --- a/sensors/sensors_test.go +++ b/sensors/sensors_test.go @@ -17,8 +17,8 @@ func TestValidateGetData(t *testing.T) { logger := golog.NewTestLogger(t) ctx := context.Background() - sensors := []string{"good_lidar"} - goodLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + cam := map[string]string{"name": "good_lidar"} + goodLidar, err := s.NewLidar(ctx, s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) sensors = []string{"invalid_sensor"} diff --git a/viam_cartographer.go b/viam_cartographer.go index 078a121b..183e298b 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -37,7 +37,7 @@ var ( const ( // DefaultExecutableName is what this program expects to call to start the cartographer grpc server. DefaultExecutableName = "carto_grpc_server" - defaultDataRateMsec = 200 + defaultLidarDataFreqHz = 5 defaultMapRateSec = 60 defaultDialMaxTimeoutSec = 30 defaultSensorValidationMaxTimeoutSec = 30 @@ -120,7 +120,7 @@ func initSensorProcess(cancelCtx context.Context, cartoSvc *CartographerService) CartoFacade: cartoSvc.cartofacade, Lidar: cartoSvc.timedLidar, LidarName: cartoSvc.primarySensorName, - DataRateMs: cartoSvc.dataRateMs, + DataFreqHz: cartoSvc.dataFreqHz, Timeout: cartoSvc.cartoFacadeTimeout, Logger: cartoSvc.logger, } @@ -160,15 +160,14 @@ func New( c.Model.Name, svcConfig.ConfigParams["mode"]) } - dataRateMsec, mapRateSec := vcConfig.GetOptionalParameters( + mapRateSec := vcConfig.GetOptionalParameters( svcConfig, - defaultDataRateMsec, defaultMapRateSec, logger, ) // Get the lidar for the Dim2D cartographer sub algorithm - lidar, err := s.NewLidar(ctx, deps, svcConfig.Sensors, logger) + lidar, err := s.NewLidar(ctx, deps, svcConfig.Camera, logger) if err != nil { return nil, err } @@ -195,7 +194,6 @@ func New( configParams: svcConfig.ConfigParams, dataDirectory: svcConfig.DataDirectory, sensors: svcConfig.Sensors, - dataRateMs: dataRateMsec, mapRateSec: mapRateSec, cancelSensorProcessFunc: cancelSensorProcessFunc, cancelCartoFacadeFunc: cancelCartoFacadeFunc, @@ -334,7 +332,7 @@ func initCartoFacade(ctx context.Context, cartoSvc *CartographerService) error { } cartoCfg := cartofacade.CartoConfig{ - Sensors: cartoSvc.sensors, + Camera: cartoSvc.camera, MapRateSecond: cartoSvc.mapRateSec, DataDir: cartoSvc.dataDirectory, ComponentReference: cartoSvc.primarySensorName, @@ -394,13 +392,15 @@ type CartographerService struct { timedLidar s.TimedSensor subAlgo SubAlgo - configParams map[string]string - dataDirectory string - sensors []string + configParams map[string]string + dataDirectory string + camera map[string]string + movementsensor map[string]string cartofacade cartofacade.Interface cartoFacadeTimeout time.Duration + dataFreqHz int mapRateSec int cancelSensorProcessFunc func() From e4af834f2e6527954c2fcd63fdd01f0368c5575c Mon Sep 17 00:00:00 2001 From: PStrutz Date: Mon, 24 Jul 2023 10:35:08 -0400 Subject: [PATCH 07/41] more name changes --- cartofacade/capi.go | 4 +-- config/config.go | 4 +-- go.mod | 8 +++--- go.sum | 30 ------------------- sensors/sensors.go | 5 +++- sensors/sensors_test.go | 62 +++++++++++++++++----------------------- sensors/test_deps.go | 40 ++++++++++++-------------- testhelper/testhelper.go | 26 ++++++++--------- 8 files changed, 68 insertions(+), 111 deletions(-) diff --git a/cartofacade/capi.go b/cartofacade/capi.go index 209554bc..bad083a8 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -354,13 +354,13 @@ func getConfig(cfg CartoConfig) (C.viam_carto_config, error) { vcc := C.viam_carto_config{} // create pointer to bstring which can represent a list of sensors - sz := len(cfg.Sensors) + sz := 1 pSensor := C.alloc_bstring_array(C.size_t(sz)) if pSensor == nil { return C.viam_carto_config{}, errors.New("unable to allocate memory for sensor list") } sensorSlice := unsafe.Slice(pSensor, sz) - for i, sensor := range cfg.Sensors { + for i, sensor := range cfg.Camera { sensorSlice[i] = goStringToBstring(sensor) } lidarCfg, err := toLidarConfig(cfg.LidarConfig) diff --git a/config/config.go b/config/config.go index afd0abd8..27bde07c 100644 --- a/config/config.go +++ b/config/config.go @@ -25,7 +25,7 @@ type Config struct { var errCameraMustHaveName = errors.New("\"camera[name]\" is required") // Validate creates the list of implicit dependencies. -func (config *Config) Validate(path string) (map[string]string, error) { +func (config *Config) Validate(path string) ([]string, error) { _, ok := config.Camera["name"] if !ok { return nil, utils.NewConfigValidationError(path, errCameraMustHaveName) @@ -54,7 +54,7 @@ func (config *Config) Validate(path string) (map[string]string, error) { return nil, errors.New("cannot specify map_rate_sec less than zero") } - deps := config.Camera + deps := []string{config.Camera["name"]} return deps, nil } diff --git a/go.mod b/go.mod index f06672d1..c22d1bd1 100644 --- a/go.mod +++ b/go.mod @@ -11,12 +11,12 @@ require ( github.com/rhysd/actionlint v1.6.24 github.com/viamrobotics/gostream v0.0.0-20230609200515-c5d67c29ed25 go.opencensus.io v0.24.0 + go.uber.org/multierr v1.11.0 + go.uber.org/zap v1.24.0 go.viam.com/api v0.1.156 go.viam.com/rdk v0.5.1-0.20230719205427-c10eab2aa624 go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 go.viam.com/utils v0.1.38 - google.golang.org/grpc v1.56.0 - google.golang.org/protobuf v1.30.0 ) require ( @@ -278,8 +278,6 @@ require ( go.mongodb.org/mongo-driver v1.12.0-prerelease.0.20221109213319-d3466eeae7a7 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/goleak v1.2.1 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.24.0 // indirect goji.io v2.0.2+incompatible // indirect golang.org/x/crypto v0.10.0 // indirect golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect @@ -300,6 +298,8 @@ require ( google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/grpc v1.56.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/src-d/go-billy.v4 v4.3.2 // indirect diff --git a/go.sum b/go.sum index 862b2562..818a9339 100644 --- a/go.sum +++ b/go.sum @@ -124,7 +124,6 @@ github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= @@ -165,7 +164,6 @@ github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkAp github.com/bombsimon/wsl/v3 v3.2.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/breml/bidichk v0.2.3 h1:qe6ggxpTfA8E75hdjWPZ581sY3a2lnl0IRxLQFelECI= github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= github.com/breml/errchkjson v0.3.0 h1:YdDqhfqMT+I1vIxPSas44P+9Z9HzJwCeAzjB8PxP1xw= @@ -216,7 +214,6 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -226,7 +223,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.19-0.20220421211855-0d412c9fbeb1 h1:Tw0uuY+3UWYiSbR0+wsrJ30vY3zMFZ4JNPkSp9XdFyA= -github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= @@ -334,11 +330,9 @@ github.com/go-critic/go-critic v0.5.5/go.mod h1:eMs1Oc/oIP+CYNVN09M+XZYffIPuRHaw github.com/go-critic/go-critic v0.6.7 h1:1evPrElnLQ2LZtJfmNDzlieDhjnq36SLgNzisx06oPM= github.com/go-critic/go-critic v0.6.7/go.mod h1:fYZUijFdcnxgx6wPjQA2QEjIRaNCT0gO8bhexy6/QmE= github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.3.1 h1:/cT8A7uavYKvglYXvrdDw4oS5ZLkcOU22fa2HJ1/JVM= github.com/go-fonts/liberation v0.3.1 h1:9RPT2NhUpxQ7ukUvz3jeUckmN42T9D9TpjtQcqK/ceM= github.com/go-fonts/liberation v0.3.1/go.mod h1:jdJ+cqF+F4SUL2V+qxBth8fvBpBDS7yloUL5Fi8GTGY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -395,7 +389,6 @@ github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnp github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5 h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= @@ -451,7 +444,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -522,7 +514,6 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-github/v31 v31.0.0/go.mod h1:NQPZol8/1sMoWYGN2yaALIBytu17gAWfhbweiEed3pM= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -569,7 +560,6 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -614,15 +604,12 @@ github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -664,13 +651,10 @@ github.com/invopop/jsonschema v0.6.0 h1:8e+xY8ZEn8gDHUYylSlLHy22P+SLeIRIHv3nM3hC github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4 h1:G2ztCwXov8mRvP0ZfjE6nAlaCX2XbykaeHdbT6KwDz0= github.com/jedib0t/go-pretty/v6 v6.4.6 h1:v6aG9h6Uby3IusSSEjHaZNXpHFhzqMmjXcPq1Rjl9Jw= github.com/jedib0t/go-pretty/v6 v6.4.6/go.mod h1:Ndk3ase2CkQbXLLNf5QDHoYb6J9WtVfmHZu9n8rk2xs= -github.com/jeremija/gosubmit v0.2.7/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI= github.com/jezek/xgb v0.0.0-20210312150743-0e0f116e1240/go.mod h1:3P4UH/k22rXyHIJD2w4h2XMqPX4Of/eySEZq9L6wqc4= github.com/jgautheron/goconst v1.4.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= github.com/jhump/protoreflect v1.10.3/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= @@ -978,7 +962,6 @@ github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaF github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8= @@ -1026,7 +1009,6 @@ github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= github.com/pion/turn/v2 v2.1.0 h1:5wGHSgGhJhP/RpabkUb/T9PdsAjkGLS6toYz5HNzoSI= github.com/pion/turn/v2 v2.1.0/go.mod h1:yrT5XbXSGX1VFSF31A3c1kCNB5bBZgk/uu5LET162qs= -github.com/pion/udp v0.1.4/go.mod h1:G8LDo56HsFwC24LIcnT4YIDU5qcB6NepqqjP0keL2us= github.com/pion/udp/v2 v2.0.1/go.mod h1:B7uvTMP00lzWdyMr/1PVZXtV3wpPIxBRd4Wl6AksXn8= github.com/pion/webrtc/v3 v3.2.6/go.mod h1:+//AwYJLlhHRyoNyuRUBs7Pw1jyZHCxQCuu2ZUNSBaw= github.com/pion/webrtc/v3 v3.2.10 h1:CPsuYs14f1aBhywmES0idje5t5XhftXeKMHwfzrxcIc= @@ -1046,7 +1028,6 @@ github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:w github.com/polyfloyd/go-errorlint v1.1.0 h1:VKoEFg5yxSgJ2yFPVhxW7oGz+f8/OVcuMeNvcPIi6Eg= github.com/polyfloyd/go-errorlint v1.1.0/go.mod h1:Uss7Bc/izYG0leCMRx3WVlrpqWedSZk7V/FUQW6VJ6U= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -1101,7 +1082,6 @@ github.com/quasilyte/go-ruleguard/dsl v0.3.1/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQP github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= github.com/quasilyte/go-ruleguard/rules v0.0.0-20210203162857-b223e0831f88/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/quasilyte/go-ruleguard/rules v0.0.0-20210221215616-dfcc94e3dffd/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= @@ -1127,7 +1107,6 @@ github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6W5lnUepvuMMgQ= github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= @@ -1336,7 +1315,6 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zitadel/logging v0.3.4/go.mod h1:aPpLQhE+v6ocNK0TWrBrd363hZ95KcI17Q1ixAQwZF0= github.com/zitadel/oidc v1.13.4 h1:+k2GKqP9Ld9S2MSFlj+KaNsoZ3J9oy+Ezw51EzSFuC8= github.com/zitadel/oidc v1.13.4/go.mod h1:3h2DhUcP02YV6q/CA/BG4yla0o6rXjK+DkJGK/dwJfw= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= @@ -1388,18 +1366,12 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -go.viam.com/api v0.1.145 h1:HJ68mOEKwBjh+0ZzbB0y+rjBWE5fwr7nkj60udP4s5I= -go.viam.com/api v0.1.145/go.mod h1:CwLz82Ie4+Z2lSH2F0oQGViP4/TV9uxjJs+rqHvFWE8= go.viam.com/api v0.1.156 h1:lhk+xYuDai0845RrMgAR2rij0uv6+UwL4s00rPTdjXc= go.viam.com/api v0.1.156/go.mod h1:CwLz82Ie4+Z2lSH2F0oQGViP4/TV9uxjJs+rqHvFWE8= -go.viam.com/rdk v0.4.0-rc0 h1:VXwZh7Pd+P+sLaGEwRzT+zHrQEal0JcZGkWybYQS3B0= -go.viam.com/rdk v0.4.0-rc0/go.mod h1:a/jXQcQL0B9nMeJ9xVb2w8iUNLMH+Ocvi1UDyCjn8tA= go.viam.com/rdk v0.5.1-0.20230719205427-c10eab2aa624 h1:yEMKTzjdzP2KlZNQqJ0s8FWAysrhm3618ov4y95vk/8= go.viam.com/rdk v0.5.1-0.20230719205427-c10eab2aa624/go.mod h1:gylf5mz6frpBa5+9cGkS6YjV7GKA6/qqIHi7AYPEWug= go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 h1:oBiK580EnEIzgFLU4lHOXmGAE3MxnVbeR7s1wp/F3Ps= go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2/go.mod h1:XM0tej6riszsiNLT16uoyq1YjuYPWlRBweTPRDanIts= -go.viam.com/utils v0.1.37 h1:AQgpbiHahZbcDqMAxfB1HYeH2txyQ+lP/Ob02i+sFOM= -go.viam.com/utils v0.1.37/go.mod h1:tjPInze4C0UYFRqL/FU96yqhJpHR1zjiNZ7qChTN/b8= go.viam.com/utils v0.1.38 h1:Xc5UsEOYjX4WTcnku4vPD9JFKlu6NjdDmA3AY8qnySA= go.viam.com/utils v0.1.38/go.mod h1:tjPInze4C0UYFRqL/FU96yqhJpHR1zjiNZ7qChTN/b8= goji.io v2.0.2+incompatible h1:uIssv/elbKRLznFUy3Xj4+2Mz/qKhek/9aZQDUMae7c= @@ -1464,7 +1436,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -2029,7 +2000,6 @@ periph.io/x/conn/v3 v3.7.0 h1:f1EXLn4pkf7AEWwkol2gilCNZ0ElY+bxS4WE2PQXfrA= periph.io/x/host/v3 v3.8.1-0.20230331112814-9f0d9f7d76db h1:8+HL7DJFofYRhGoK/UdwhzvQj3I2HrKLQ6dkOC66CZY= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/sensors/sensors.go b/sensors/sensors.go index c725dc94..d57d9bf1 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -4,6 +4,7 @@ package sensors import ( "bytes" "context" + "fmt" "strconv" "time" @@ -60,7 +61,7 @@ func NewLidar( dataFreqHz := defaultDataFreqHz dataFreqHzIn, ok := cam["data_freq_hz"] if !ok { - logger.Debugf("no data_freq_hz given, setting to default value of %d", defaultDataFreqHz) + logger.Debugf("problem retrieving lidar data frequency, setting to default value of %d", defaultDataFreqHz) } else { var err error dataFreqHz, err = strconv.Atoi(dataFreqHzIn) @@ -78,6 +79,8 @@ func NewLidar( if err != nil { return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", name) } + fmt.Println("properties are: ", properties) + fmt.Println("and support PCD is: ", properties.SupportsPCD) if !properties.SupportsPCD { return Lidar{}, errors.Errorf("configuring lidar camera error: " + "'camera' must support PCD") diff --git a/sensors/sensors_test.go b/sensors/sensors_test.go index e74df005..131d67fb 100644 --- a/sensors/sensors_test.go +++ b/sensors/sensors_test.go @@ -17,12 +17,12 @@ func TestValidateGetData(t *testing.T) { logger := golog.NewTestLogger(t) ctx := context.Background() - cam := map[string]string{"name": "good_lidar"} - goodLidar, err := s.NewLidar(ctx, s.SetupDeps(cam), cam, logger) + lidar := map[string]string{"name": "good_lidar"} + goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - sensors = []string{"invalid_sensor"} - invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "invalid_sensor"} + invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) sensorValidationMaxTimeout := time.Duration(50) * time.Millisecond @@ -34,8 +34,8 @@ func TestValidateGetData(t *testing.T) { }) t.Run("returns nil if a lidar reading succeeds within the timeout", func(t *testing.T) { - sensors = []string{"warming_up_lidar"} - warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "warming_up_lidar"} + warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) err = s.ValidateGetData(ctx, warmingUpLidar, sensorValidationMaxTimeout, sensorValidationInterval, logger) @@ -51,8 +51,8 @@ func TestValidateGetData(t *testing.T) { cancelledCtx, cancelFunc := context.WithCancel(context.Background()) cancelFunc() - sensors = []string{"warming_up_lidar"} - warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "warming_up_lidar"} + warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) err = s.ValidateGetData(cancelledCtx, warmingUpLidar, sensorValidationMaxTimeout, sensorValidationInterval, logger) @@ -64,28 +64,18 @@ func TestNewLidar(t *testing.T) { logger := golog.NewTestLogger(t) t.Run("No sensor provided", func(t *testing.T) { - sensors := []string{} - deps := s.SetupDeps(sensors) - actualLidar, err := s.NewLidar(context.Background(), deps, sensors, logger) + lidar := map[string]string{} + deps := s.SetupDeps(lidar) + actualLidar, err := s.NewLidar(context.Background(), deps, lidar, logger) expectedLidar := s.Lidar{} test.That(t, actualLidar, test.ShouldResemble, expectedLidar) test.That(t, err, test.ShouldBeNil) }) - t.Run("Failed lidar creation due to more than one sensor provided", func(t *testing.T) { - sensors := []string{"lidar", "one-too-many"} - deps := s.SetupDeps(sensors) - actualLidar, err := s.NewLidar(context.Background(), deps, sensors, logger) - expectedLidar := s.Lidar{} - test.That(t, actualLidar, test.ShouldResemble, expectedLidar) - test.That(t, err, test.ShouldBeError, - errors.New("configuring lidar camera error: 'sensors' must contain only one lidar camera, but is 'sensors: [lidar, one-too-many]'")) - }) - t.Run("Failed lidar creation with non-existing sensor", func(t *testing.T) { - sensors := []string{"gibberish"} - deps := s.SetupDeps(sensors) - actualLidar, err := s.NewLidar(context.Background(), deps, sensors, logger) + lidar := map[string]string{"name": "gibberish"} + deps := s.SetupDeps(lidar) + actualLidar, err := s.NewLidar(context.Background(), deps, lidar, logger) expectedLidar := s.Lidar{} test.That(t, actualLidar, test.ShouldResemble, expectedLidar) test.That(t, err, test.ShouldBeError, @@ -94,11 +84,11 @@ func TestNewLidar(t *testing.T) { }) t.Run("Successful lidar creation", func(t *testing.T) { - sensors := []string{"good_lidar"} + lidar := map[string]string{"name": "good_lidar"} ctx := context.Background() - deps := s.SetupDeps(sensors) - actualLidar, err := s.NewLidar(ctx, deps, sensors, logger) - test.That(t, actualLidar.Name, test.ShouldEqual, sensors[0]) + deps := s.SetupDeps(lidar) + actualLidar, err := s.NewLidar(ctx, deps, lidar, logger) + test.That(t, actualLidar.Name, test.ShouldEqual, lidar["name"]) test.That(t, err, test.ShouldBeNil) tsr, err := actualLidar.TimedSensorReading(ctx) @@ -111,20 +101,20 @@ func TestTimedSensorReading(t *testing.T) { logger := golog.NewTestLogger(t) ctx := context.Background() - sensors := []string{"invalid_sensor"} - invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar := map[string]string{"name": "invalid_sensor"} + invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - sensors = []string{"invalid_replay_sensor"} - invalidReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "invalid_replay_sensor"} + invalidReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - sensors = []string{"good_lidar"} - goodLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "good_lidar"} + goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - sensors = []string{"replay_sensor"} - goodReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "replay_sensor"} + goodReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) t.Run("when the lidar returns an error, returns that error", func(t *testing.T) { diff --git a/sensors/test_deps.go b/sensors/test_deps.go index adc3d919..71c92b32 100644 --- a/sensors/test_deps.go +++ b/sensors/test_deps.go @@ -21,30 +21,26 @@ const ( BadTime = "NOT A TIME" ) -// SetupDeps returns the dependencies based on the sensors passed as arguments. -func SetupDeps(sensors []string) resource.Dependencies { +// SetupDeps returns the dependencies based on the lidar passed as argument. +func SetupDeps(lidar map[string]string) resource.Dependencies { deps := make(resource.Dependencies) - - for _, sensor := range sensors { - switch sensor { - case "good_lidar": - deps[camera.Named(sensor)] = getGoodLidar() - case "warming_up_lidar": - deps[camera.Named(sensor)] = getWarmingUpLidar() - case "replay_sensor": - deps[camera.Named(sensor)] = getReplaySensor(TestTime) - case "invalid_replay_sensor": - deps[camera.Named(sensor)] = getReplaySensor(BadTime) - case "invalid_sensor": - deps[camera.Named(sensor)] = getInvalidSensor() - case "gibberish": - return deps - case "finished_replay_sensor": - deps[camera.Named(sensor)] = getFinishedReplaySensor() - default: - continue - } + switch lidar["name"] { + case "good_lidar": + deps[camera.Named(lidar["name"])] = getGoodLidar() + case "warming_up_lidar": + deps[camera.Named(lidar["name"])] = getWarmingUpLidar() + case "lidar_replay_sensor": + deps[camera.Named(lidar["name"])] = getReplaySensor(TestTime) + case "invalid_lidar_replay_sensor": + deps[camera.Named(lidar["name"])] = getReplaySensor(BadTime) + case "invalid_lidar": + deps[camera.Named(lidar["name"])] = getInvalidSensor() + case "gibberish_lidar": + return deps + case "finished_lidar_replay_sensor": + deps[camera.Named(lidar["name"])] = getFinishedReplaySensor() } + return deps } diff --git a/testhelper/testhelper.go b/testhelper/testhelper.go index 6958323c..36bcc147 100644 --- a/testhelper/testhelper.go +++ b/testhelper/testhelper.go @@ -48,19 +48,17 @@ const ( var mockLidarPath = artifact.MustPath("viam-cartographer/mock_lidar") -// SetupStubDeps returns stubbed dependencies based on the sensors +// SetupStubDeps returns stubbed dependencies based on the camera // the stubs fail tests if called. -func SetupStubDeps(sensors []string, t *testing.T) resource.Dependencies { +func SetupStubDeps(camera_name string, t *testing.T) resource.Dependencies { deps := make(resource.Dependencies) - - for _, sensor := range sensors { - switch sensor { - case "stub_lidar": - deps[camera.Named(sensor)] = getStubLidar(t) - default: - t.Errorf("SetupStubDeps calld with unhandled sensor sensors: %s, %v", sensor, sensors) - } + switch camera_name { + case "stub_lidar": + deps[camera.Named(camera_name)] = getStubLidar(t) + default: + t.Errorf("SetupStubDeps called with unhandled camera: %s", camera_name) } + return deps } @@ -204,8 +202,8 @@ func CreateIntegrationSLAMService( if err != nil { return nil, err } - test.That(t, sensorDeps, test.ShouldResemble, cfg.Sensors) - deps := SetupStubDeps(cfg.Sensors, t) + test.That(t, sensorDeps, test.ShouldResemble, []string{cfg.Camera["name"]}) + deps := SetupStubDeps(cfg.Camera["name"], t) svc, err := viamcartographer.New( ctx, @@ -239,13 +237,13 @@ func CreateSLAMService( cfgService := resource.Config{Name: "test", API: slam.API, Model: viamcartographer.Model} cfgService.ConvertedAttributes = cfg - deps := s.SetupDeps(cfg.Sensors) + deps := s.SetupDeps(cfg.Camera) sensorDeps, err := cfg.Validate("path") if err != nil { return nil, err } - test.That(t, sensorDeps, test.ShouldResemble, cfg.Sensors) + test.That(t, sensorDeps, test.ShouldResemble, cfg.Camera) svc, err := viamcartographer.New( ctx, From a68ac8140a29c3f4d1199df82ecda3088e1d9135 Mon Sep 17 00:00:00 2001 From: nicksanford Date: Fri, 21 Jul 2023 16:10:52 -0400 Subject: [PATCH 08/41] hotfix-add-nlopt (#212) --- etc/packaging/appimages/cartographer-module-aarch64.yml | 1 + etc/packaging/appimages/cartographer-module-x86_64.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/etc/packaging/appimages/cartographer-module-aarch64.yml b/etc/packaging/appimages/cartographer-module-aarch64.yml index 53f67467..e66813cc 100644 --- a/etc/packaging/appimages/cartographer-module-aarch64.yml +++ b/etc/packaging/appimages/cartographer-module-aarch64.yml @@ -77,6 +77,7 @@ AppDir: - libglx0:arm64 - libgl1:arm64 - libglvnd0:arm64 + - libnlopt0:arm64 files: include: [] diff --git a/etc/packaging/appimages/cartographer-module-x86_64.yml b/etc/packaging/appimages/cartographer-module-x86_64.yml index caeb5693..cca34bbc 100644 --- a/etc/packaging/appimages/cartographer-module-x86_64.yml +++ b/etc/packaging/appimages/cartographer-module-x86_64.yml @@ -77,6 +77,7 @@ AppDir: - libglx0:amd64 - libgl1:amd64 - libglvnd0:amd64 + - libnlopt0:amd64 files: include: [] From 14f5c563903a299a5761a26d6192f4f76dafbdbf Mon Sep 17 00:00:00 2001 From: kim-mishra <121991867+kim-mishra@users.noreply.github.com> Date: Mon, 24 Jul 2023 09:22:00 -0400 Subject: [PATCH 09/41] RSDK-3718 - cartographer appends to infinitely growing vector fix (#209) --- .../src/carto_facade/carto_facade.cc | 12 ++---------- .../src/carto_facade/map_builder.cc | 18 +++++++++--------- .../src/carto_facade/map_builder.h | 11 +++++------ 3 files changed, 16 insertions(+), 25 deletions(-) diff --git a/viam-cartographer/src/carto_facade/carto_facade.cc b/viam-cartographer/src/carto_facade/carto_facade.cc index 0f30b18e..698ed8ca 100644 --- a/viam-cartographer/src/carto_facade/carto_facade.cc +++ b/viam-cartographer/src/carto_facade/carto_facade.cc @@ -777,17 +777,9 @@ void CartoFacade::AddSensorReading(const viam_carto_sensor_reading *sr) { VLOG(1) << "AddSensorData timestamp: " << measurement.time << " measurement.ranges.size(): " << measurement.ranges.size(); map_builder.AddSensorData(measurement); - auto local_poses = map_builder.GetLocalSlamResultPoses(); - VLOG(1) << "local_poses.size(): " << local_poses.size(); - // NOTE: The first time local_poses.size() goes positive will - // be the second time that map_builder.AddSensorData() succeeds. - // At that time the pose will still be zeroed out. - if (local_poses.size() > 0) { - update_latest_global_pose = true; - tmp_global_pose = map_builder.GetGlobalPose(local_poses.back()); - } + tmp_global_pose = map_builder.GetGlobalPose(); map_builder_mutex.unlock(); - if (update_latest_global_pose) { + { std::lock_guard lk(viam_response_mutex); latest_global_pose = tmp_global_pose; } diff --git a/viam-cartographer/src/carto_facade/map_builder.cc b/viam-cartographer/src/carto_facade/map_builder.cc index 54274ad6..59670caf 100644 --- a/viam-cartographer/src/carto_facade/map_builder.cc +++ b/viam-cartographer/src/carto_facade/map_builder.cc @@ -31,11 +31,6 @@ MapBuilder::~MapBuilder() { } } -std::vector<::cartographer::transform::Rigid3d> -MapBuilder::GetLocalSlamResultPoses() { - return local_slam_result_poses_; -} - void MapBuilder::SetUp(std::string configuration_directory, std::string configuration_basename) { VLOG(1) << "MapBuilder::SetUp configuration_directory: " @@ -129,7 +124,10 @@ MapBuilder::GetLocalSlamResultCallback() { const std::unique_ptr< const cartographer::mapping::TrajectoryBuilderInterface:: InsertionResult>) { - local_slam_result_poses_.push_back(local_pose); + { + std::lock_guard lk(local_slam_result_pose_mutex); + local_slam_result_pose = local_pose; + } }; } @@ -152,11 +150,13 @@ cartographer::sensor::TimedPointCloudData MapBuilder::GetDataFromFile( // TODO: There might still be a lot of room to improve accuracy & speed. // Might be worth investigating in the future. -cartographer::transform::Rigid3d MapBuilder::GetGlobalPose( - cartographer::transform::Rigid3d &local_pose) { +cartographer::transform::Rigid3d MapBuilder::GetGlobalPose() { auto local_transform = map_builder_->pose_graph()->GetLocalToGlobalTransform(trajectory_id); - return local_transform * local_pose; + { + std::lock_guard lk(local_slam_result_pose_mutex); + return local_transform * local_slam_result_pose; + } } void MapBuilder::OverwriteOptimizeEveryNNodes(int value) { diff --git a/viam-cartographer/src/carto_facade/map_builder.h b/viam-cartographer/src/carto_facade/map_builder.h index 47082bf9..e2e626c8 100644 --- a/viam-cartographer/src/carto_facade/map_builder.h +++ b/viam-cartographer/src/carto_facade/map_builder.h @@ -67,12 +67,8 @@ class MapBuilder { // a PCD file. cartographer::sensor::TimedPointCloudData GetDataFromFile(std::string file); - // GetLocalSlamResultPoses returns the local slam result poses. - std::vector<::cartographer::transform::Rigid3d> GetLocalSlamResultPoses(); - // GetGlobalPose returns the local pose based on the provided a local pose. - cartographer::transform::Rigid3d GetGlobalPose( - cartographer::transform::Rigid3d &local_pose); + cartographer::transform::Rigid3d GetGlobalPose(); // AddSensorData adds sensor data to cartographer's internal state // throws if adding sensor data fails. @@ -121,7 +117,10 @@ class MapBuilder { double data_start_time = 0; private: - std::vector<::cartographer::transform::Rigid3d> local_slam_result_poses_; + std::mutex local_slam_result_pose_mutex; + ::cartographer::transform::Rigid3d local_slam_result_pose = + cartographer::transform::Rigid3d(); + ; double start_time = -1; }; } // namespace carto_facade From 18c9d7b048d22fc0682f7aaf022fa49ba13ad7ae Mon Sep 17 00:00:00 2001 From: PStrutz Date: Mon, 24 Jul 2023 10:47:25 -0400 Subject: [PATCH 10/41] working on resolving issues --- sensors/sensors.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sensors/sensors.go b/sensors/sensors.go index d57d9bf1..f3281543 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -4,7 +4,6 @@ package sensors import ( "bytes" "context" - "fmt" "strconv" "time" @@ -79,11 +78,11 @@ func NewLidar( if err != nil { return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", name) } - fmt.Println("properties are: ", properties) - fmt.Println("and support PCD is: ", properties.SupportsPCD) + + logger.Debugf("properties are set") if !properties.SupportsPCD { - return Lidar{}, errors.Errorf("configuring lidar camera error: " + - "'camera' must support PCD") + return Lidar{}, errors.Errorf("configuring lidar camera error: "+ + "'camera' must support PCD but properties are %v", properties) } return Lidar{ From 6d688bc1eb84fcdc20d5410b54cb493b5c950721 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Mon, 24 Jul 2023 14:46:49 -0400 Subject: [PATCH 11/41] working sensor tests --- sensorprocess/sensorprocess_test.go | 2 +- sensors/sensors.go | 13 ++------ sensors/sensors_test.go | 15 ++++++--- sensors/test_deps.go | 48 +++++++++++++++++++++-------- viam_cartographer_test.go | 40 ++++++++++-------------- 5 files changed, 64 insertions(+), 54 deletions(-) diff --git a/sensorprocess/sensorprocess_test.go b/sensorprocess/sensorprocess_test.go index 3d321e02..5507bc96 100644 --- a/sensorprocess/sensorprocess_test.go +++ b/sensorprocess/sensorprocess_test.go @@ -359,7 +359,7 @@ func TestAddSensorReading(t *testing.T) { }) t.Run("live sensor adds sensor reading once and ignores errors", func(t *testing.T) { - sensors := []string{"good_lidar"} + sensors := map[string]string{"name": "good_lidar"} logger := golog.NewTestLogger(t) liveSensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) test.That(t, err, test.ShouldBeNil) diff --git a/sensors/sensors.go b/sensors/sensors.go index f3281543..ee3cb95d 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -79,10 +79,9 @@ func NewLidar( return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", name) } - logger.Debugf("properties are set") if !properties.SupportsPCD { - return Lidar{}, errors.Errorf("configuring lidar camera error: "+ - "'camera' must support PCD but properties are %v", properties) + return Lidar{}, errors.Errorf("configuring lidar camera error: " + + "'camera' must support PCD") } return Lidar{ @@ -155,11 +154,3 @@ func (lidar Lidar) TimedSensorReading(ctx context.Context) (TimedSensorReadingRe } return TimedSensorReadingResponse{Reading: buf.Bytes(), ReadingTime: readingTime, Replay: replay}, nil } - -// getName returns the name of the sensor based on its index in the sensor array. -func getName(sensors []string, index int) (string, error) { - if index < 0 || index >= len(sensors) { - return "", errors.New("index out of bounds") - } - return sensors[index], nil -} diff --git a/sensors/sensors_test.go b/sensors/sensors_test.go index 131d67fb..8fe88f54 100644 --- a/sensors/sensors_test.go +++ b/sensors/sensors_test.go @@ -4,6 +4,7 @@ package sensors_test import ( "context" "errors" + "fmt" "testing" "time" @@ -21,10 +22,14 @@ func TestValidateGetData(t *testing.T) { goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - lidar = map[string]string{"name": "invalid_sensor"} + lidar = map[string]string{"name": "invalid_lidar"} invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) + lidar = map[string]string{"name": "np_pcd_camera"} + _, err = s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + test.That(t, err, test.ShouldBeError, errors.New("configuring lidar camera error: 'camera' must support PCD")) + sensorValidationMaxTimeout := time.Duration(50) * time.Millisecond sensorValidationInterval := time.Duration(10) * time.Millisecond @@ -37,7 +42,7 @@ func TestValidateGetData(t *testing.T) { lidar = map[string]string{"name": "warming_up_lidar"} warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - + fmt.Println("got to here") err = s.ValidateGetData(ctx, warmingUpLidar, sensorValidationMaxTimeout, sensorValidationInterval, logger) test.That(t, err, test.ShouldBeNil) }) @@ -101,11 +106,11 @@ func TestTimedSensorReading(t *testing.T) { logger := golog.NewTestLogger(t) ctx := context.Background() - lidar := map[string]string{"name": "invalid_sensor"} + lidar := map[string]string{"name": "invalid_lidar"} invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - lidar = map[string]string{"name": "invalid_replay_sensor"} + lidar = map[string]string{"name": "invalid_replay_lidar"} invalidReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) @@ -113,7 +118,7 @@ func TestTimedSensorReading(t *testing.T) { goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - lidar = map[string]string{"name": "replay_sensor"} + lidar = map[string]string{"name": "replay_lidar"} goodReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) diff --git a/sensors/test_deps.go b/sensors/test_deps.go index 71c92b32..c4826bc9 100644 --- a/sensors/test_deps.go +++ b/sensors/test_deps.go @@ -29,16 +29,18 @@ func SetupDeps(lidar map[string]string) resource.Dependencies { deps[camera.Named(lidar["name"])] = getGoodLidar() case "warming_up_lidar": deps[camera.Named(lidar["name"])] = getWarmingUpLidar() - case "lidar_replay_sensor": - deps[camera.Named(lidar["name"])] = getReplaySensor(TestTime) - case "invalid_lidar_replay_sensor": - deps[camera.Named(lidar["name"])] = getReplaySensor(BadTime) + case "replay_lidar": + deps[camera.Named(lidar["name"])] = getReplayLidar(TestTime) + case "invalid_replay_lidar": + deps[camera.Named(lidar["name"])] = getReplayLidar(BadTime) case "invalid_lidar": - deps[camera.Named(lidar["name"])] = getInvalidSensor() + deps[camera.Named(lidar["name"])] = getInvalidLidar() + case "np_pcd_camera": + deps[camera.Named(lidar["name"])] = getNoPCDCamera() case "gibberish_lidar": return deps - case "finished_lidar_replay_sensor": - deps[camera.Named(lidar["name"])] = getFinishedReplaySensor() + case "finished_replay_lidar": + deps[camera.Named(lidar["name"])] = getFinishedReplayLidar() } return deps @@ -61,7 +63,7 @@ func getWarmingUpLidar() *inject.Camera { return nil, transform.NewNoIntrinsicsError("") } cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { - return camera.Properties{}, nil + return camera.Properties{SupportsPCD: true}, nil } return cam } @@ -78,12 +80,12 @@ func getGoodLidar() *inject.Camera { return nil, transform.NewNoIntrinsicsError("") } cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { - return camera.Properties{}, nil + return camera.Properties{SupportsPCD: true}, nil } return cam } -func getReplaySensor(testTime string) *inject.Camera { +func getReplayLidar(testTime string) *inject.Camera { cam := &inject.Camera{} cam.NextPointCloudFunc = func(ctx context.Context) (pointcloud.PointCloud, error) { md := ctx.Value(contextutils.MetadataContextKey) @@ -99,12 +101,12 @@ func getReplaySensor(testTime string) *inject.Camera { return nil, transform.NewNoIntrinsicsError("") } cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { - return camera.Properties{}, nil + return camera.Properties{SupportsPCD: true}, nil } return cam } -func getInvalidSensor() *inject.Camera { +func getInvalidLidar() *inject.Camera { cam := &inject.Camera{} cam.NextPointCloudFunc = func(ctx context.Context) (pointcloud.PointCloud, error) { return nil, errors.New("invalid sensor") @@ -115,10 +117,30 @@ func getInvalidSensor() *inject.Camera { cam.ProjectorFunc = func(ctx context.Context) (transform.Projector, error) { return nil, transform.NewNoIntrinsicsError("") } + cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { + return camera.Properties{SupportsPCD: true}, nil + } + return cam +} + +func getNoPCDCamera() *inject.Camera { + cam := &inject.Camera{} + cam.NextPointCloudFunc = func(ctx context.Context) (pointcloud.PointCloud, error) { + return nil, errors.New("invalid camera") + } + cam.StreamFunc = func(ctx context.Context, errHandlers ...gostream.ErrorHandler) (gostream.VideoStream, error) { + return nil, errors.New("invalid camera") + } + cam.ProjectorFunc = func(ctx context.Context) (transform.Projector, error) { + return nil, transform.NewNoIntrinsicsError("") + } + cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { + return camera.Properties{SupportsPCD: false}, nil + } return cam } -func getFinishedReplaySensor() *inject.Camera { +func getFinishedReplayLidar() *inject.Camera { cam := &inject.Camera{} cam.NextPointCloudFunc = func(ctx context.Context) (pointcloud.PointCloud, error) { return nil, replaypcd.ErrEndOfDataset diff --git a/viam_cartographer_test.go b/viam_cartographer_test.go index e8228b2b..d57fd903 100644 --- a/viam_cartographer_test.go +++ b/viam_cartographer_test.go @@ -25,7 +25,7 @@ import ( const ( testExecutableName = "true" // the program "true", not the boolean value - testDataRateMsec = 200 + testDataFreqHz = "5" ) var ( @@ -49,7 +49,7 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) }() attrCfg := &vcConfig.Config{ - Sensors: []string{"lidar", "one-too-many"}, + Camera: map[string]string{"name": "lidar", "name2": "one-too-many"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -68,10 +68,9 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Sensors: []string{"gibberish"}, + Camera: map[string]string{"name": "gibberish", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } _, err = testhelper.CreateSLAMService(t, attrCfg, logger) @@ -88,10 +87,9 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } svc, err := testhelper.CreateSLAMService(t, attrCfg, logger) @@ -109,10 +107,9 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Sensors: []string{"invalid_sensor"}, + Camera: map[string]string{"name": "invalid_sensor", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } _, err = testhelper.CreateSLAMService(t, attrCfg, logger) @@ -129,7 +126,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, MapRateSec: &_zeroInt, @@ -162,7 +159,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, MapRateSec: &testMapRateSec, @@ -196,7 +193,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{}, + Camera: map[string]string{}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -214,7 +211,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"lidar", "one-too-many"}, + Camera: map[string]string{"name": "lidar", "name2": "one-too-many"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -233,10 +230,9 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"gibberish"}, + Camera: map[string]string{"name": "gibberish"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } _, err := testhelper.CreateSLAMService(t, attrCfg, logger) @@ -253,10 +249,9 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } svc, err := testhelper.CreateSLAMService(t, attrCfg, logger) @@ -274,10 +269,9 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"invalid_sensor"}, + Camera: map[string]string{"name": "invalid_sensor", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } _, err := testhelper.CreateSLAMService(t, attrCfg, logger) @@ -293,7 +287,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"replay_sensor"}, + Camera: map[string]string{"name": "replay_sensor"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, MapRateSec: &_zeroInt, @@ -339,10 +333,9 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } svc, err := testhelper.CreateSLAMService(t, attrCfg, logger) @@ -395,7 +388,7 @@ func TestClose(t *testing.T) { }() attrCfg := &vcConfig.Config{ - Sensors: []string{"replay_sensor"}, + Camera: map[string]string{"name": "replay_sensor"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, MapRateSec: &testMapRateSec, @@ -447,11 +440,10 @@ func TestDoCommand(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d", "test_param": "viam"}, DataDirectory: dataDirectory, MapRateSec: &testMapRateSec, - DataRateMsec: testDataRateMsec, } svc, err := testhelper.CreateSLAMService(t, attrCfg, logger) test.That(t, err, test.ShouldBeNil) From bee9d7f92bfa84d4cc283641e61e669aeb216dcb Mon Sep 17 00:00:00 2001 From: PStrutz Date: Mon, 24 Jul 2023 15:25:28 -0400 Subject: [PATCH 12/41] passing sensorprocess tests --- cartofacade/capi.go | 8 ++--- sensorprocess/sensorprocess.go | 8 +++-- sensorprocess/sensorprocess_test.go | 56 ++++++++++++++--------------- sensors/test_deps.go | 2 +- 4 files changed, 39 insertions(+), 35 deletions(-) diff --git a/cartofacade/capi.go b/cartofacade/capi.go index bad083a8..144f3c8c 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -179,7 +179,7 @@ func NewCarto(cfg CartoConfig, acfg CartoAlgoConfig, vcl CartoLibInterface) (Car return Carto{}, err } - status = C.free_bstring_array(vcc.sensors, C.size_t(len(cfg.Sensors))) + status = C.free_bstring_array(vcc.sensors, C.size_t(1)) if status != C.BSTR_OK { return Carto{}, errors.New("unable to free memory for sensor list") } @@ -360,9 +360,9 @@ func getConfig(cfg CartoConfig) (C.viam_carto_config, error) { return C.viam_carto_config{}, errors.New("unable to allocate memory for sensor list") } sensorSlice := unsafe.Slice(pSensor, sz) - for i, sensor := range cfg.Camera { - sensorSlice[i] = goStringToBstring(sensor) - } + + sensorSlice[0] = goStringToBstring(cfg.Camera["name"]) + lidarCfg, err := toLidarConfig(cfg.LidarConfig) if err != nil { return C.viam_carto_config{}, err diff --git a/sensorprocess/sensorprocess.go b/sensorprocess/sensorprocess.go index 1677785e..bd6eef60 100644 --- a/sensorprocess/sensorprocess.go +++ b/sensorprocess/sensorprocess.go @@ -4,6 +4,7 @@ package sensorprocess import ( "context" "errors" + "fmt" "math" "strings" "time" @@ -20,7 +21,7 @@ type Config struct { CartoFacade cartofacade.Interface Lidar sensors.TimedSensor LidarName string - DataRateMs int + DataFreqHz int Timeout time.Duration Logger golog.Logger } @@ -98,5 +99,8 @@ func addSensorReadingFromLiveReadings(ctx context.Context, reading []byte, readi } } timeElapsedMs := int(time.Since(startTime).Milliseconds()) - return int(math.Max(0, float64(config.DataRateMs-timeElapsedMs))) + fmt.Println(config.DataFreqHz) + data_rate_ms := 100 / config.DataFreqHz + fmt.Println(data_rate_ms) + return int(math.Max(0, float64(data_rate_ms-timeElapsedMs))) } diff --git a/sensorprocess/sensorprocess_test.go b/sensorprocess/sensorprocess_test.go index 5507bc96..c81883c3 100644 --- a/sensorprocess/sensorprocess_test.go +++ b/sensorprocess/sensorprocess_test.go @@ -44,7 +44,7 @@ func TestAddSensorReadingReplaySensor(t *testing.T) { Logger: logger, CartoFacade: &cf, LidarName: "good_lidar", - DataRateMs: 200, + DataFreqHz: 5, Timeout: 10 * time.Second, } t.Run("When addSensorReading returns successfully, no infinite loop", func(t *testing.T) { @@ -141,11 +141,11 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { Logger: logger, CartoFacade: &cf, LidarName: "good_lidar", - DataRateMs: 200, + DataFreqHz: 5, Timeout: 10 * time.Second, } - t.Run("When AddSensorReading blocks for more than the DataRateMs and succeeds, time to sleep is 0", func(t *testing.T) { + t.Run("When AddSensorReading blocks for more than the DataFreqHz and succeeds, time to sleep is 0", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -161,7 +161,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { test.That(t, timeToSleep, test.ShouldEqual, 0) }) - t.Run("AddSensorReading slower than DataRateMs and returns lock error, time to sleep is 0", func(t *testing.T) { + t.Run("AddSensorReading slower than DataFreqHz and returns lock error, time to sleep is 0", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -177,7 +177,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { test.That(t, timeToSleep, test.ShouldEqual, 0) }) - t.Run("When AddSensorReading blocks for more than the DataRateMs and returns an unexpected error, time to sleep is 0", func(t *testing.T) { + t.Run("When AddSensorReading blocks for more than the DataFreqHz and returns an unexpected error, time to sleep is 0", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -193,7 +193,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { test.That(t, timeToSleep, test.ShouldEqual, 0) }) - t.Run("AddSensorReading faster than the DataRateMs and succeeds, time to sleep is <= DataRateMs", func(t *testing.T) { + t.Run("AddSensorReading faster than the DataFreqHz and succeeds, time to sleep is <= DataFreqHz", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -206,10 +206,10 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { timeToSleep := addSensorReadingFromLiveReadings(context.Background(), reading, readingTimestamp, config) test.That(t, timeToSleep, test.ShouldBeGreaterThan, 0) - test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, config.DataRateMs) + test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, 100/config.DataFreqHz) }) - t.Run("AddSensorReading faster than the DataRateMs and returns lock error, time to sleep is <= DataRateMs", func(t *testing.T) { + t.Run("AddSensorReading faster than the DataFreqHz and returns lock error, time to sleep is <= DataFreqHz", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -222,10 +222,10 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { timeToSleep := addSensorReadingFromLiveReadings(context.Background(), reading, readingTimestamp, config) test.That(t, timeToSleep, test.ShouldBeGreaterThan, 0) - test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, config.DataRateMs) + test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, 100/config.DataFreqHz) }) - t.Run("AddSensorReading faster than DataRateMs and returns unexpected error, time to sleep is <= DataRateMs", func(t *testing.T) { + t.Run("AddSensorReading faster than DataFreqHz and returns unexpected error, time to sleep is <= DataFreqHz", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -238,7 +238,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { timeToSleep := addSensorReadingFromLiveReadings(context.Background(), reading, readingTimestamp, config) test.That(t, timeToSleep, test.ShouldBeGreaterThan, 0) - test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, config.DataRateMs) + test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, 100/config.DataFreqHz) }) } @@ -247,10 +247,10 @@ func invalidSensorTestHelper( t *testing.T, cartoFacadeMock cartofacade.Mock, config Config, - sensors []string, + cam map[string]string, ) { logger := golog.NewTestLogger(t) - sensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + sensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) var calls []addSensorReadingArgs @@ -285,37 +285,37 @@ func TestAddSensorReading(t *testing.T) { config := Config{ Logger: logger, CartoFacade: &cf, - DataRateMs: 200, + DataFreqHz: 5, Timeout: 10 * time.Second, } ctx := context.Background() t.Run("returns error when lidar GetData returns error, doesn't try to add sensor data", func(t *testing.T) { - sensors := []string{"invalid_sensor"} + cam := map[string]string{"name": "invalid_lidar"} invalidSensorTestHelper( ctx, t, cf, config, - sensors, + cam, ) }) t.Run("returns error when replay sensor timestamp is invalid, doesn't try to add sensor data", func(t *testing.T) { - sensors := []string{"invalid_replay_sensor"} + cam := map[string]string{"name": "invalid_replay_lidar"} invalidSensorTestHelper( ctx, t, cf, config, - sensors, + cam, ) }) t.Run("replay sensor adds sensor data until success", func(t *testing.T) { - sensors := []string{"replay_sensor"} + cam := map[string]string{"name": "replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) var calls []addSensorReadingArgs @@ -351,7 +351,7 @@ func TestAddSensorReading(t *testing.T) { firstTimestamp := calls[0].readingTimestamp for i, call := range calls { t.Logf("call %d", i) - test.That(t, call.sensorName, test.ShouldResemble, "replay_sensor") + test.That(t, call.sensorName, test.ShouldResemble, "replay_lidar") test.That(t, call.currentReading, test.ShouldResemble, expectedPCD) test.That(t, call.timeout, test.ShouldEqual, config.Timeout) test.That(t, call.readingTimestamp, test.ShouldEqual, firstTimestamp) @@ -415,9 +415,9 @@ func TestAddSensorReading(t *testing.T) { }) t.Run("returns true when lidar returns an error that it reached end of dataset", func(t *testing.T) { - sensors := []string{"finished_replay_sensor"} + cam := map[string]string{"name": "finished_replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) config.Lidar = replaySensor @@ -434,15 +434,15 @@ func TestStart(t *testing.T) { config := Config{ Logger: logger, CartoFacade: &cf, - DataRateMs: 200, + DataFreqHz: 5, Timeout: 10 * time.Second, } cancelCtx, cancelFunc := context.WithCancel(context.Background()) t.Run("returns true when lidar returns an error that it reached end of dataset but the context is valid", func(t *testing.T) { - sensors := []string{"finished_replay_sensor"} + cam := map[string]string{"name": "finished_replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) config.Lidar = replaySensor @@ -452,9 +452,9 @@ func TestStart(t *testing.T) { }) t.Run("returns false when lidar returns an error that it reached end of dataset but the context was cancelled", func(t *testing.T) { - sensors := []string{"finished_replay_sensor"} + cam := map[string]string{"name": "finished_replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) config.Lidar = replaySensor diff --git a/sensors/test_deps.go b/sensors/test_deps.go index c4826bc9..60f1549c 100644 --- a/sensors/test_deps.go +++ b/sensors/test_deps.go @@ -152,7 +152,7 @@ func getFinishedReplayLidar() *inject.Camera { return nil, transform.NewNoIntrinsicsError("") } cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { - return camera.Properties{}, nil + return camera.Properties{SupportsPCD: true}, nil } return cam } From 7c7abfee742086e4b0c5b8cda80dccf340a117e2 Mon Sep 17 00:00:00 2001 From: nicksanford Date: Mon, 24 Jul 2023 12:58:49 -0400 Subject: [PATCH 13/41] [RSDK-4148] remove-makefile-and-gh-action-full-mod (#216) --- .github/workflows/test.yml | 4 ++-- Makefile | 15 ++++----------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dccb0f44..fbdf2b0c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -94,10 +94,10 @@ jobs: run: | sudo -u testbot bash -lc 'go test -v -race -run TestCartographerIntegration' - - name: make setup-cpp-full-mod test-cpp-full-mod-valgrind + - name: make setup-cpp-debug test-cpp-valgrind # Currently we only run valgrind on arm64 as x86 # doesn't valgrind clean due to what appears to be a bug in GLOG # https://github.com/viamrobotics/viam-cartographer/actions/runs/5156238014/jobs/9287413446 if: matrix.platform != 'linux/amd64' run: | - sudo -u testbot bash -lc 'make setup-cpp-full-mod test-cpp-full-mod-valgrind' + sudo -u testbot bash -lc 'make setup-cpp-debug test-cpp-valgrind' diff --git a/Makefile b/Makefile index f8d07cda..e6c1ac5d 100644 --- a/Makefile +++ b/Makefile @@ -117,28 +117,21 @@ build-asan: build-debug build-debug: EXTRA_CMAKE_FLAGS += -DCMAKE_BUILD_TYPE=Debug -DFORCE_DEBUG_BUILD=True build-debug: build -test-cpp: - viam-cartographer/build/unit_tests -p -l all - -# Linux only -setup-cpp-full-mod: - sudo apt install -y valgrind gdb - setup-cpp-debug: sudo apt install -y valgrind gdb # Linux only -test-cpp-full-mod-asan: build-asan +test-cpp-asan: build-asan viam-cartographer/build/unit_tests -p -l all -test-cpp-full-mod-valgrind: build-debug +test-cpp-valgrind: build-debug valgrind --error-exitcode=1 --leak-check=full -s viam-cartographer/build/unit_tests -p -l all # Linux only -test-cpp-full-mod-gdb: build-debug +test-cpp-gdb: build-debug gdb --batch --ex run --ex bt --ex q --args viam-cartographer/build/unit_tests -p -l all -test-cpp-full-mod: build-debug +test-cpp: build-debug viam-cartographer/build/unit_tests -p -l all test-go: From 8608484f097482899ed9df14027a4aba73929be7 Mon Sep 17 00:00:00 2001 From: nicksanford Date: Mon, 24 Jul 2023 17:31:23 -0400 Subject: [PATCH 14/41] Revert "[RSDK-4148] remove-makefile-and-gh-action-full-mod" (#220) --- .github/workflows/test.yml | 4 ++-- Makefile | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fbdf2b0c..dccb0f44 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -94,10 +94,10 @@ jobs: run: | sudo -u testbot bash -lc 'go test -v -race -run TestCartographerIntegration' - - name: make setup-cpp-debug test-cpp-valgrind + - name: make setup-cpp-full-mod test-cpp-full-mod-valgrind # Currently we only run valgrind on arm64 as x86 # doesn't valgrind clean due to what appears to be a bug in GLOG # https://github.com/viamrobotics/viam-cartographer/actions/runs/5156238014/jobs/9287413446 if: matrix.platform != 'linux/amd64' run: | - sudo -u testbot bash -lc 'make setup-cpp-debug test-cpp-valgrind' + sudo -u testbot bash -lc 'make setup-cpp-full-mod test-cpp-full-mod-valgrind' diff --git a/Makefile b/Makefile index e6c1ac5d..f8d07cda 100644 --- a/Makefile +++ b/Makefile @@ -117,21 +117,28 @@ build-asan: build-debug build-debug: EXTRA_CMAKE_FLAGS += -DCMAKE_BUILD_TYPE=Debug -DFORCE_DEBUG_BUILD=True build-debug: build +test-cpp: + viam-cartographer/build/unit_tests -p -l all + +# Linux only +setup-cpp-full-mod: + sudo apt install -y valgrind gdb + setup-cpp-debug: sudo apt install -y valgrind gdb # Linux only -test-cpp-asan: build-asan +test-cpp-full-mod-asan: build-asan viam-cartographer/build/unit_tests -p -l all -test-cpp-valgrind: build-debug +test-cpp-full-mod-valgrind: build-debug valgrind --error-exitcode=1 --leak-check=full -s viam-cartographer/build/unit_tests -p -l all # Linux only -test-cpp-gdb: build-debug +test-cpp-full-mod-gdb: build-debug gdb --batch --ex run --ex bt --ex q --args viam-cartographer/build/unit_tests -p -l all -test-cpp: build-debug +test-cpp-full-mod: build-debug viam-cartographer/build/unit_tests -p -l all test-go: From d7d8c5f8b2afe1de6221c027679ce0b6ebfa4d5a Mon Sep 17 00:00:00 2001 From: PStrutz Date: Mon, 24 Jul 2023 15:38:42 -0400 Subject: [PATCH 15/41] vc changes --- viam_cartographer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viam_cartographer.go b/viam_cartographer.go index 183e298b..0967d96f 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -193,7 +193,7 @@ func New( subAlgo: subAlgo, configParams: svcConfig.ConfigParams, dataDirectory: svcConfig.DataDirectory, - sensors: svcConfig.Sensors, + camera: svcConfig.Camera, mapRateSec: mapRateSec, cancelSensorProcessFunc: cancelSensorProcessFunc, cancelCartoFacadeFunc: cancelCartoFacadeFunc, From fc03df7d3ad3fc8fc3df024fec620754b5a727c9 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Tue, 25 Jul 2023 09:40:42 -0400 Subject: [PATCH 16/41] restore unnecessary change --- viam-cartographer/src/carto_facade/carto_facade.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/viam-cartographer/src/carto_facade/carto_facade.cc b/viam-cartographer/src/carto_facade/carto_facade.cc index 698ed8ca..0f30b18e 100644 --- a/viam-cartographer/src/carto_facade/carto_facade.cc +++ b/viam-cartographer/src/carto_facade/carto_facade.cc @@ -777,9 +777,17 @@ void CartoFacade::AddSensorReading(const viam_carto_sensor_reading *sr) { VLOG(1) << "AddSensorData timestamp: " << measurement.time << " measurement.ranges.size(): " << measurement.ranges.size(); map_builder.AddSensorData(measurement); - tmp_global_pose = map_builder.GetGlobalPose(); + auto local_poses = map_builder.GetLocalSlamResultPoses(); + VLOG(1) << "local_poses.size(): " << local_poses.size(); + // NOTE: The first time local_poses.size() goes positive will + // be the second time that map_builder.AddSensorData() succeeds. + // At that time the pose will still be zeroed out. + if (local_poses.size() > 0) { + update_latest_global_pose = true; + tmp_global_pose = map_builder.GetGlobalPose(local_poses.back()); + } map_builder_mutex.unlock(); - { + if (update_latest_global_pose) { std::lock_guard lk(viam_response_mutex); latest_global_pose = tmp_global_pose; } From dc7adb380bff2e97ff5aafe2fb53db77d794d11f Mon Sep 17 00:00:00 2001 From: PStrutz Date: Tue, 25 Jul 2023 09:55:27 -0400 Subject: [PATCH 17/41] lint fixes --- config/config.go | 7 +++---- config/config_test.go | 9 ++------- sensorprocess/sensorprocess.go | 7 ++----- sensors/sensors.go | 2 +- sensors/sensors_test.go | 2 -- testhelper/testhelper.go | 8 ++++---- viam_cartographer.go | 7 +++---- 7 files changed, 15 insertions(+), 27 deletions(-) diff --git a/config/config.go b/config/config.go index 27bde07c..8b6c8b56 100644 --- a/config/config.go +++ b/config/config.go @@ -30,16 +30,15 @@ func (config *Config) Validate(path string) ([]string, error) { if !ok { return nil, utils.NewConfigValidationError(path, errCameraMustHaveName) } - data_freq_hz, ok := config.Camera["data_freq_hz"] + dataFreqHz, ok := config.Camera["data_freq_hz"] if ok { - data_freq_hz, err := strconv.Atoi(data_freq_hz) + dataFreqHz, err := strconv.Atoi(dataFreqHz) if err != nil { return nil, errors.New("data_freq_hz must only contain digits") } - if data_freq_hz < 0 { + if dataFreqHz < 0 { return nil, errors.New("cannot specify data_freq_hz less than zero") } - } if config.ConfigParams["mode"] == "" { diff --git a/config/config_test.go b/config/config_test.go index ab977286..39df980c 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -50,7 +50,6 @@ func TestValidate(t *testing.T) { delete(cfgService.Attributes["config_params"].(map[string]string), "mode") _, err := newConfig(cfgService) test.That(t, err, test.ShouldBeError, newError(utils.NewConfigValidationFieldRequiredError(testCfgPath, "config_params[mode]").Error())) - }) t.Run("Config without camera name", func(t *testing.T) { @@ -146,12 +145,10 @@ func TestGetOptionalParameters(t *testing.T) { cfgService.Attributes["camera"] = map[string]string{"name": "a"} cfg, err := newConfig(cfgService) test.That(t, err, test.ShouldBeNil) - dataFreqHz, mapRateSec := GetOptionalParameters( + mapRateSec := GetOptionalParameters( cfg, 1001, - 1002, logger) - test.That(t, dataFreqHz, test.ShouldEqual, 1001) test.That(t, mapRateSec, test.ShouldEqual, 1002) }) @@ -165,12 +162,10 @@ func TestGetOptionalParameters(t *testing.T) { two := 2 cfg.MapRateSec = &two test.That(t, err, test.ShouldBeNil) - dataFreqHz, mapRateSec := GetOptionalParameters( + mapRateSec := GetOptionalParameters( cfg, 1001, - 1002, logger) - test.That(t, dataFreqHz, test.ShouldEqual, 1) test.That(t, mapRateSec, test.ShouldEqual, 2) }) } diff --git a/sensorprocess/sensorprocess.go b/sensorprocess/sensorprocess.go index bd6eef60..d4807e84 100644 --- a/sensorprocess/sensorprocess.go +++ b/sensorprocess/sensorprocess.go @@ -4,7 +4,6 @@ package sensorprocess import ( "context" "errors" - "fmt" "math" "strings" "time" @@ -99,8 +98,6 @@ func addSensorReadingFromLiveReadings(ctx context.Context, reading []byte, readi } } timeElapsedMs := int(time.Since(startTime).Milliseconds()) - fmt.Println(config.DataFreqHz) - data_rate_ms := 100 / config.DataFreqHz - fmt.Println(data_rate_ms) - return int(math.Max(0, float64(data_rate_ms-timeElapsedMs))) + dataRateMs := 100 / config.DataFreqHz + return int(math.Max(0, float64(dataRateMs-timeElapsedMs))) } diff --git a/sensors/sensors.go b/sensors/sensors.go index ee3cb95d..de115af0 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -80,7 +80,7 @@ func NewLidar( } if !properties.SupportsPCD { - return Lidar{}, errors.Errorf("configuring lidar camera error: " + + return Lidar{}, errors.New("configuring lidar camera error: " + "'camera' must support PCD") } diff --git a/sensors/sensors_test.go b/sensors/sensors_test.go index 8fe88f54..45b1835b 100644 --- a/sensors/sensors_test.go +++ b/sensors/sensors_test.go @@ -4,7 +4,6 @@ package sensors_test import ( "context" "errors" - "fmt" "testing" "time" @@ -42,7 +41,6 @@ func TestValidateGetData(t *testing.T) { lidar = map[string]string{"name": "warming_up_lidar"} warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - fmt.Println("got to here") err = s.ValidateGetData(ctx, warmingUpLidar, sensorValidationMaxTimeout, sensorValidationInterval, logger) test.That(t, err, test.ShouldBeNil) }) diff --git a/testhelper/testhelper.go b/testhelper/testhelper.go index 36bcc147..0c3645ff 100644 --- a/testhelper/testhelper.go +++ b/testhelper/testhelper.go @@ -50,13 +50,13 @@ var mockLidarPath = artifact.MustPath("viam-cartographer/mock_lidar") // SetupStubDeps returns stubbed dependencies based on the camera // the stubs fail tests if called. -func SetupStubDeps(camera_name string, t *testing.T) resource.Dependencies { +func SetupStubDeps(cameraName string, t *testing.T) resource.Dependencies { deps := make(resource.Dependencies) - switch camera_name { + switch cameraName { case "stub_lidar": - deps[camera.Named(camera_name)] = getStubLidar(t) + deps[camera.Named(cameraName)] = getStubLidar(t) default: - t.Errorf("SetupStubDeps called with unhandled camera: %s", camera_name) + t.Errorf("SetupStubDeps called with unhandled camera: %s", cameraName) } return deps diff --git a/viam_cartographer.go b/viam_cartographer.go index 0967d96f..e38b4f0c 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -392,10 +392,9 @@ type CartographerService struct { timedLidar s.TimedSensor subAlgo SubAlgo - configParams map[string]string - dataDirectory string - camera map[string]string - movementsensor map[string]string + configParams map[string]string + dataDirectory string + camera map[string]string cartofacade cartofacade.Interface cartoFacadeTimeout time.Duration From 09c0bdaa432a3e78c05d28575a68d14a8bf19b21 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 12:03:45 -0400 Subject: [PATCH 18/41] go config lidar rename --- config/config.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/config/config.go b/config/config.go index 21097c20..879f4a10 100644 --- a/config/config.go +++ b/config/config.go @@ -14,19 +14,19 @@ func newError(configError string) error { // Config describes how to configure the SLAM service. type Config struct { - Sensors []string `json:"sensors"` + Camera map[string]string `json:"camera"` ConfigParams map[string]string `json:"config_params"` DataDirectory string `json:"data_dir"` - DataRateMsec int `json:"data_rate_msec"` + DataFreqHz int `json:"data_freq_hz"` MapRateSec *int `json:"map_rate_sec"` } -var errSensorsMustNotBeEmpty = errors.New("\"sensors\" must not be empty") +var errCameraMustNotBeEmpty = errors.New("\"camera\" must not be empty") // Validate creates the list of implicit dependencies. -func (config *Config) Validate(path string) ([]string, error) { - if config.Sensors == nil || len(config.Sensors) < 1 { - return nil, utils.NewConfigValidationError(path, errSensorsMustNotBeEmpty) +func (config *Config) Validate(path string) (map[string]string, error) { + if config.Camera == nil || len(config.Camera) < 1 { + return nil, utils.NewConfigValidationError(path, errCameraMustNotBeEmpty) } if config.ConfigParams["mode"] == "" { @@ -37,15 +37,15 @@ func (config *Config) Validate(path string) ([]string, error) { return nil, utils.NewConfigValidationFieldRequiredError(path, "data_dir") } - if config.DataRateMsec < 0 { - return nil, errors.New("cannot specify data_rate_msec less than zero") + if config.DataFreqHz < 0 { + return nil, errors.New("cannot specify data_freq_hz less than zero") } if config.MapRateSec != nil && *config.MapRateSec < 0 { return nil, errors.New("cannot specify map_rate_sec less than zero") } - deps := config.Sensors + deps := config.Camera return deps, nil } @@ -53,12 +53,12 @@ func (config *Config) Validate(path string) ([]string, error) { // GetOptionalParameters sets any unset optional config parameters to the values passed to this function, // and returns them. func GetOptionalParameters(config *Config, - defaultDataRateMsec, defaultMapRateSec int, logger golog.Logger, + defaultDataFreqHz, defaultMapRateSec int, logger golog.Logger, ) (int, int) { - dataRateMsec := config.DataRateMsec - if config.DataRateMsec == 0 { - dataRateMsec = defaultDataRateMsec - logger.Debugf("no data_rate_msec given, setting to default value of %d", defaultDataRateMsec) + dataFreqHz := config.DataFreqHz + if config.DataFreqHz == 0 { + dataFreqHz = defaultDataFreqHz + logger.Debugf("no data_freq_hz given, setting to default value of %d", defaultDataFreqHz) } mapRateSec := 0 @@ -69,5 +69,5 @@ func GetOptionalParameters(config *Config, mapRateSec = *config.MapRateSec } - return dataRateMsec, mapRateSec + return dataFreqHz, mapRateSec } From 339ae7342fa27f2b4b050f1befaf516abd3624e8 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 12:44:57 -0400 Subject: [PATCH 19/41] more go config changes --- config/config.go | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/config/config.go b/config/config.go index 879f4a10..d9250c27 100644 --- a/config/config.go +++ b/config/config.go @@ -2,6 +2,8 @@ package config import ( + "strconv" + "github.com/edaniels/golog" "github.com/pkg/errors" "go.viam.com/utils" @@ -17,16 +19,27 @@ type Config struct { Camera map[string]string `json:"camera"` ConfigParams map[string]string `json:"config_params"` DataDirectory string `json:"data_dir"` - DataFreqHz int `json:"data_freq_hz"` MapRateSec *int `json:"map_rate_sec"` } -var errCameraMustNotBeEmpty = errors.New("\"camera\" must not be empty") +var errCameraMustHaveName = errors.New("\"camera\" must have name") // Validate creates the list of implicit dependencies. func (config *Config) Validate(path string) (map[string]string, error) { - if config.Camera == nil || len(config.Camera) < 1 { - return nil, utils.NewConfigValidationError(path, errCameraMustNotBeEmpty) + _, ok := config.Camera["name"] + if !ok { + return nil, utils.NewConfigValidationError(path, errCameraMustHaveName) + } + data_freq_hz, ok := config.Camera["data_freq_hz"] + if ok { + data_freq_hz, err := strconv.Atoi(data_freq_hz) + if err != nil { + return nil, errors.New("data_freq_hz must be a number") + } + if data_freq_hz < 0 { + return nil, errors.New("cannot specify data_freq_hz less than zero") + } + } if config.ConfigParams["mode"] == "" { @@ -37,10 +50,6 @@ func (config *Config) Validate(path string) (map[string]string, error) { return nil, utils.NewConfigValidationFieldRequiredError(path, "data_dir") } - if config.DataFreqHz < 0 { - return nil, errors.New("cannot specify data_freq_hz less than zero") - } - if config.MapRateSec != nil && *config.MapRateSec < 0 { return nil, errors.New("cannot specify map_rate_sec less than zero") } @@ -55,10 +64,12 @@ func (config *Config) Validate(path string) (map[string]string, error) { func GetOptionalParameters(config *Config, defaultDataFreqHz, defaultMapRateSec int, logger golog.Logger, ) (int, int) { - dataFreqHz := config.DataFreqHz - if config.DataFreqHz == 0 { - dataFreqHz = defaultDataFreqHz + dataFreqHz := defaultDataFreqHz + dataFreqHzIn, ok := config.Camera["data_freq_hz"] + if !ok { logger.Debugf("no data_freq_hz given, setting to default value of %d", defaultDataFreqHz) + } else { + dataFreqHz, _ = strconv.Atoi(dataFreqHzIn) } mapRateSec := 0 From 8679e018c6b953b5a1463aef92f479d135691067 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 14:03:39 -0400 Subject: [PATCH 20/41] go config passing tests with new sensors naming --- config/config.go | 4 +-- config/config_test.go | 70 +++++++++++++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/config/config.go b/config/config.go index d9250c27..4cb1d64c 100644 --- a/config/config.go +++ b/config/config.go @@ -22,7 +22,7 @@ type Config struct { MapRateSec *int `json:"map_rate_sec"` } -var errCameraMustHaveName = errors.New("\"camera\" must have name") +var errCameraMustHaveName = errors.New("\"camera[name]\" is required") // Validate creates the list of implicit dependencies. func (config *Config) Validate(path string) (map[string]string, error) { @@ -34,7 +34,7 @@ func (config *Config) Validate(path string) (map[string]string, error) { if ok { data_freq_hz, err := strconv.Atoi(data_freq_hz) if err != nil { - return nil, errors.New("data_freq_hz must be a number") + return nil, errors.New("data_freq_hz must only contain digits") } if data_freq_hz < 0 { return nil, errors.New("cannot specify data_freq_hz less than zero") diff --git a/config/config_test.go b/config/config_test.go index e056d95b..ab977286 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -18,7 +18,7 @@ func TestValidate(t *testing.T) { model := resource.DefaultModelFamily.WithModel("test") cfgService := resource.Config{Name: "test", API: slam.API, Model: model} _, err := newConfig(cfgService) - test.That(t, err, test.ShouldBeError, newError("error validating \"services.slam.attributes.fake\": \"sensors\" must not be empty")) + test.That(t, err, test.ShouldBeError, newError("error validating \"services.slam.attributes.fake\": \"camera[name]\" is required")) }) t.Run("Simplest valid config", func(t *testing.T) { @@ -28,13 +28,13 @@ func TestValidate(t *testing.T) { }) t.Run("Config without required fields", func(t *testing.T) { - requiredFields := []string{"data_dir", "sensors"} + requiredFields := []string{"data_dir", "camera"} dataDirErr := utils.NewConfigValidationFieldRequiredError(testCfgPath, requiredFields[0]) - sensorsErr := utils.NewConfigValidationError(testCfgPath, errSensorsMustNotBeEmpty) + cameraErr := utils.NewConfigValidationError(testCfgPath, errCameraMustHaveName) expectedErrors := []error{ newError(dataDirErr.Error()), - newError(sensorsErr.Error()), + newError(cameraErr.Error()), } for i, requiredField := range requiredFields { logger.Debugf("Testing SLAM config without %s\n", requiredField) @@ -50,6 +50,16 @@ func TestValidate(t *testing.T) { delete(cfgService.Attributes["config_params"].(map[string]string), "mode") _, err := newConfig(cfgService) test.That(t, err, test.ShouldBeError, newError(utils.NewConfigValidationFieldRequiredError(testCfgPath, "config_params[mode]").Error())) + + }) + + t.Run("Config without camera name", func(t *testing.T) { + // Test for missing camera name attribute + logger.Debug("Testing SLAM config without camera[name]") + cfgService := makeCfgService() + delete(cfgService.Attributes["camera"].(map[string]string), "name") + _, err := newConfig(cfgService) + test.That(t, err, test.ShouldBeError, newError(utils.NewConfigValidationFieldRequiredError(testCfgPath, "camera[name]").Error())) }) t.Run("Config with invalid parameter type", func(t *testing.T) { @@ -63,12 +73,28 @@ func TestValidate(t *testing.T) { test.That(t, err, test.ShouldBeNil) }) + t.Run("Config with invalid camera data_freq_hz", func(t *testing.T) { + cfgService := makeCfgService() + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "twenty", + } + _, err := newConfig(cfgService) + test.That(t, err, test.ShouldBeError, newError("data_freq_hz must only contain digits")) + }) + t.Run("Config with out of range values", func(t *testing.T) { cfgService := makeCfgService() - cfgService.Attributes["data_rate_msec"] = -1 + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "-1", + } _, err := newConfig(cfgService) - test.That(t, err, test.ShouldBeError, newError("cannot specify data_rate_msec less than zero")) - cfgService.Attributes["data_rate_msec"] = 1 + test.That(t, err, test.ShouldBeError, newError("cannot specify data_freq_hz less than zero")) + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "1", + } cfgService.Attributes["map_rate_sec"] = -1 _, err = newConfig(cfgService) test.That(t, err, test.ShouldBeError, newError("cannot specify map_rate_sec less than zero")) @@ -76,8 +102,10 @@ func TestValidate(t *testing.T) { t.Run("All parameters e2e", func(t *testing.T) { cfgService := makeCfgService() - cfgService.Attributes["sensors"] = []string{"a", "b"} - cfgService.Attributes["data_rate_msec"] = 1001 + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "20", + } cfgService.Attributes["map_rate_sec"] = 1002 cfgService.Attributes["config_params"] = map[string]string{ @@ -88,8 +116,7 @@ func TestValidate(t *testing.T) { cfg, err := newConfig(cfgService) test.That(t, err, test.ShouldBeNil) test.That(t, cfg.DataDirectory, test.ShouldEqual, cfgService.Attributes["data_dir"]) - test.That(t, cfg.Sensors, test.ShouldResemble, cfgService.Attributes["sensors"]) - test.That(t, cfg.DataRateMsec, test.ShouldEqual, cfgService.Attributes["data_rate_msec"]) + test.That(t, cfg.Camera, test.ShouldResemble, cfgService.Attributes["camera"]) test.That(t, *cfg.MapRateSec, test.ShouldEqual, cfgService.Attributes["map_rate_sec"]) test.That(t, cfg.ConfigParams, test.ShouldResemble, cfgService.Attributes["config_params"]) }) @@ -104,7 +131,10 @@ func makeCfgService() resource.Config { "mode": "test mode", } cfgService.Attributes["data_dir"] = "path" - cfgService.Attributes["sensors"] = []string{"a"} + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "20", + } return cfgService } @@ -113,32 +143,34 @@ func TestGetOptionalParameters(t *testing.T) { t.Run("Pass default parameters", func(t *testing.T) { cfgService := makeCfgService() - cfgService.Attributes["sensors"] = []string{"a"} + cfgService.Attributes["camera"] = map[string]string{"name": "a"} cfg, err := newConfig(cfgService) test.That(t, err, test.ShouldBeNil) - dataRateMsec, mapRateSec := GetOptionalParameters( + dataFreqHz, mapRateSec := GetOptionalParameters( cfg, 1001, 1002, logger) - test.That(t, dataRateMsec, test.ShouldEqual, 1001) + test.That(t, dataFreqHz, test.ShouldEqual, 1001) test.That(t, mapRateSec, test.ShouldEqual, 1002) }) t.Run("Return overrides", func(t *testing.T) { cfgService := makeCfgService() - cfgService.Attributes["sensors"] = []string{"a"} + cfgService.Attributes["camera"] = map[string]string{ + "name": "a", + "data_freq_hz": "1", + } cfg, err := newConfig(cfgService) two := 2 - cfg.DataRateMsec = 1 cfg.MapRateSec = &two test.That(t, err, test.ShouldBeNil) - dataRateMsec, mapRateSec := GetOptionalParameters( + dataFreqHz, mapRateSec := GetOptionalParameters( cfg, 1001, 1002, logger) - test.That(t, dataRateMsec, test.ShouldEqual, 1) + test.That(t, dataFreqHz, test.ShouldEqual, 1) test.That(t, mapRateSec, test.ShouldEqual, 2) }) } From ac1eccf719c06fe93220e619442a7f3a34db71a8 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 14:14:56 -0400 Subject: [PATCH 21/41] fixed naming in integration tests --- integration_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integration_test.go b/integration_test.go index c0d0f09a..a34b3482 100644 --- a/integration_test.go +++ b/integration_test.go @@ -110,7 +110,7 @@ func testHelperCartographer( defer termFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"stub_lidar"}, + Camera: map[string]string{"name": "stub_lidar"}, ConfigParams: map[string]string{ "mode": reflect.ValueOf(subAlgo).String(), }, @@ -120,7 +120,7 @@ func testHelperCartographer( done := make(chan struct{}) sensorReadingInterval := time.Millisecond * 200 - timedSensor, err := testhelper.IntegrationLidarTimedSensor(t, attrCfg.Sensors[0], replaySensor, sensorReadingInterval, done) + timedSensor, err := testhelper.IntegrationLidarTimedSensor(t, attrCfg.Camera["name"], replaySensor, sensorReadingInterval, done) test.That(t, err, test.ShouldBeNil) svc, err := testhelper.CreateIntegrationSLAMService(t, attrCfg, timedSensor, logger) @@ -140,7 +140,7 @@ func testHelperCartographer( test.That(t, errors.New("test timeout"), test.ShouldBeNil) } - testCartographerPosition(t, svc, attrCfg.Sensors[0]) + testCartographerPosition(t, svc, attrCfg.Camera["name"]) testCartographerMap(t, svc, cSvc.SlamMode == cartofacade.LocalizingMode) internalState, err := slam.GetInternalStateFull(context.Background(), svc) From 260e94aef47572ac8e34b4135b78a62e72894fcf Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 15:23:06 -0400 Subject: [PATCH 22/41] structural changes to lidar --- sensors/sensors.go | 57 +++++++++++++++++++++++++------------------- viam_cartographer.go | 1 - 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/sensors/sensors.go b/sensors/sensors.go index 5cf7b6d9..c725dc94 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -4,7 +4,7 @@ package sensors import ( "bytes" "context" - "strings" + "strconv" "time" "github.com/edaniels/golog" @@ -18,16 +18,14 @@ import ( ) const ( - // The Lidar is expected to be located at the first - // index in the provided `sensors` array in the slam - // service configuration. - lidarIndex = 0 + defaultDataFreqHz = 20 ) // Lidar represents a LIDAR sensor. type Lidar struct { - Name string - lidar camera.Camera + Name string + lidar camera.Camera + dataFreqHz int } // TimedSensorReadingResponse represents a sensor reading with a time & allows the caller to know if the reading is from a replay sensor. @@ -46,38 +44,49 @@ type TimedSensor interface { func NewLidar( ctx context.Context, deps resource.Dependencies, - sensors []string, + cam map[string]string, logger golog.Logger, ) (Lidar, error) { _, span := trace.StartSpan(ctx, "viamcartographer::sensors::NewLidar") defer span.End() - // An empty `sensors: []` array is allowed in offline mode. - if len(sensors) == 0 { - logger.Debug("no sensor provided in 'sensors' config parameter") + // An empty camera field is allowed in offline mode. + _, ok := cam["name"] + if !ok { + logger.Debug("no camera provided in 'camera' config parameter") return Lidar{}, nil } - // If there is a sensor provided in the 'sensors' array, we enforce that only one - // sensor has to be provided. - if len(sensors) != 1 { - return Lidar{}, errors.Errorf("configuring lidar camera error: "+ - "'sensors' must contain only one lidar camera, but is 'sensors: [%v]'", - strings.Join(sensors, ", ")) - } - - name, err := getName(sensors, lidarIndex) - if err != nil { - return Lidar{}, err + name := cam["name"] + dataFreqHz := defaultDataFreqHz + dataFreqHzIn, ok := cam["data_freq_hz"] + if !ok { + logger.Debugf("no data_freq_hz given, setting to default value of %d", defaultDataFreqHz) + } else { + var err error + dataFreqHz, err = strconv.Atoi(dataFreqHzIn) + if err != nil { + logger.Debug("data_freq_hz must only contain digits, setting to default value of %d", defaultDataFreqHz) + } } newLidar, err := camera.FromDependencies(deps, name) if err != nil { return Lidar{}, errors.Wrapf(err, "error getting lidar camera %v for slam service", name) } + // If there is a camera provided in the 'camera' field, we enforce that it supports PCD. + properties, err := newLidar.Properties(ctx) + if err != nil { + return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", name) + } + if !properties.SupportsPCD { + return Lidar{}, errors.Errorf("configuring lidar camera error: " + + "'camera' must support PCD") + } return Lidar{ - Name: name, - lidar: newLidar, + Name: name, + lidar: newLidar, + dataFreqHz: dataFreqHz, }, nil } diff --git a/viam_cartographer.go b/viam_cartographer.go index 8309e0c5..078a121b 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -401,7 +401,6 @@ type CartographerService struct { cartofacade cartofacade.Interface cartoFacadeTimeout time.Duration - dataRateMs int mapRateSec int cancelSensorProcessFunc func() From c456d37519abcf2829177a5720749b76e5b9f932 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Fri, 21 Jul 2023 15:30:58 -0400 Subject: [PATCH 23/41] initial changes --- cartofacade/capi.go | 2 +- cartofacade/testhelpers.go | 4 ++-- config/config.go | 15 +++------------ sensors/sensors_test.go | 4 ++-- viam_cartographer.go | 20 ++++++++++---------- 5 files changed, 18 insertions(+), 27 deletions(-) diff --git a/cartofacade/capi.go b/cartofacade/capi.go index 52770afd..209554bc 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -99,7 +99,7 @@ const ( // CartoConfig contains config values from app type CartoConfig struct { - Sensors []string + Camera map[string]string MapRateSecond int DataDir string ComponentReference string diff --git a/cartofacade/testhelpers.go b/cartofacade/testhelpers.go index 366d906c..f9791ffd 100644 --- a/cartofacade/testhelpers.go +++ b/cartofacade/testhelpers.go @@ -12,7 +12,7 @@ func GetTestConfig(sensor string) (CartoConfig, string, error) { } return CartoConfig{ - Sensors: []string{sensor, "imu"}, + Camera: map[string]string{"name": "test_lidar", "data_freq_hz": "20"}, MapRateSecond: 5, DataDir: dir, ComponentReference: "component", @@ -23,7 +23,7 @@ func GetTestConfig(sensor string) (CartoConfig, string, error) { // GetBadTestConfig gets a sample config for testing purposes that will cause a failure. func GetBadTestConfig() CartoConfig { return CartoConfig{ - Sensors: []string{"rplidar", "imu"}, + Camera: map[string]string{"name": "rplidar", "data_freq_hz": "20"}, LidarConfig: TwoD, } } diff --git a/config/config.go b/config/config.go index 4cb1d64c..afd0abd8 100644 --- a/config/config.go +++ b/config/config.go @@ -61,17 +61,8 @@ func (config *Config) Validate(path string) (map[string]string, error) { // GetOptionalParameters sets any unset optional config parameters to the values passed to this function, // and returns them. -func GetOptionalParameters(config *Config, - defaultDataFreqHz, defaultMapRateSec int, logger golog.Logger, -) (int, int) { - dataFreqHz := defaultDataFreqHz - dataFreqHzIn, ok := config.Camera["data_freq_hz"] - if !ok { - logger.Debugf("no data_freq_hz given, setting to default value of %d", defaultDataFreqHz) - } else { - dataFreqHz, _ = strconv.Atoi(dataFreqHzIn) - } - +func GetOptionalParameters(config *Config, defaultMapRateSec int, logger golog.Logger, +) int { mapRateSec := 0 if config.MapRateSec == nil { logger.Debugf("no map_rate_sec given, setting to default value of %d", defaultMapRateSec) @@ -80,5 +71,5 @@ func GetOptionalParameters(config *Config, mapRateSec = *config.MapRateSec } - return dataFreqHz, mapRateSec + return mapRateSec } diff --git a/sensors/sensors_test.go b/sensors/sensors_test.go index f8899b8e..e74df005 100644 --- a/sensors/sensors_test.go +++ b/sensors/sensors_test.go @@ -17,8 +17,8 @@ func TestValidateGetData(t *testing.T) { logger := golog.NewTestLogger(t) ctx := context.Background() - sensors := []string{"good_lidar"} - goodLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + cam := map[string]string{"name": "good_lidar"} + goodLidar, err := s.NewLidar(ctx, s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) sensors = []string{"invalid_sensor"} diff --git a/viam_cartographer.go b/viam_cartographer.go index 078a121b..183e298b 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -37,7 +37,7 @@ var ( const ( // DefaultExecutableName is what this program expects to call to start the cartographer grpc server. DefaultExecutableName = "carto_grpc_server" - defaultDataRateMsec = 200 + defaultLidarDataFreqHz = 5 defaultMapRateSec = 60 defaultDialMaxTimeoutSec = 30 defaultSensorValidationMaxTimeoutSec = 30 @@ -120,7 +120,7 @@ func initSensorProcess(cancelCtx context.Context, cartoSvc *CartographerService) CartoFacade: cartoSvc.cartofacade, Lidar: cartoSvc.timedLidar, LidarName: cartoSvc.primarySensorName, - DataRateMs: cartoSvc.dataRateMs, + DataFreqHz: cartoSvc.dataFreqHz, Timeout: cartoSvc.cartoFacadeTimeout, Logger: cartoSvc.logger, } @@ -160,15 +160,14 @@ func New( c.Model.Name, svcConfig.ConfigParams["mode"]) } - dataRateMsec, mapRateSec := vcConfig.GetOptionalParameters( + mapRateSec := vcConfig.GetOptionalParameters( svcConfig, - defaultDataRateMsec, defaultMapRateSec, logger, ) // Get the lidar for the Dim2D cartographer sub algorithm - lidar, err := s.NewLidar(ctx, deps, svcConfig.Sensors, logger) + lidar, err := s.NewLidar(ctx, deps, svcConfig.Camera, logger) if err != nil { return nil, err } @@ -195,7 +194,6 @@ func New( configParams: svcConfig.ConfigParams, dataDirectory: svcConfig.DataDirectory, sensors: svcConfig.Sensors, - dataRateMs: dataRateMsec, mapRateSec: mapRateSec, cancelSensorProcessFunc: cancelSensorProcessFunc, cancelCartoFacadeFunc: cancelCartoFacadeFunc, @@ -334,7 +332,7 @@ func initCartoFacade(ctx context.Context, cartoSvc *CartographerService) error { } cartoCfg := cartofacade.CartoConfig{ - Sensors: cartoSvc.sensors, + Camera: cartoSvc.camera, MapRateSecond: cartoSvc.mapRateSec, DataDir: cartoSvc.dataDirectory, ComponentReference: cartoSvc.primarySensorName, @@ -394,13 +392,15 @@ type CartographerService struct { timedLidar s.TimedSensor subAlgo SubAlgo - configParams map[string]string - dataDirectory string - sensors []string + configParams map[string]string + dataDirectory string + camera map[string]string + movementsensor map[string]string cartofacade cartofacade.Interface cartoFacadeTimeout time.Duration + dataFreqHz int mapRateSec int cancelSensorProcessFunc func() From 2304abcd9bc07a2b5654f1a0907a5ef0092f51dd Mon Sep 17 00:00:00 2001 From: PStrutz Date: Mon, 24 Jul 2023 10:35:08 -0400 Subject: [PATCH 24/41] more name changes --- cartofacade/capi.go | 4 +-- config/config.go | 4 +-- go.mod | 8 +++--- go.sum | 30 ------------------- sensors/sensors.go | 5 +++- sensors/sensors_test.go | 62 +++++++++++++++++----------------------- sensors/test_deps.go | 40 ++++++++++++-------------- testhelper/testhelper.go | 26 ++++++++--------- 8 files changed, 68 insertions(+), 111 deletions(-) diff --git a/cartofacade/capi.go b/cartofacade/capi.go index 209554bc..bad083a8 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -354,13 +354,13 @@ func getConfig(cfg CartoConfig) (C.viam_carto_config, error) { vcc := C.viam_carto_config{} // create pointer to bstring which can represent a list of sensors - sz := len(cfg.Sensors) + sz := 1 pSensor := C.alloc_bstring_array(C.size_t(sz)) if pSensor == nil { return C.viam_carto_config{}, errors.New("unable to allocate memory for sensor list") } sensorSlice := unsafe.Slice(pSensor, sz) - for i, sensor := range cfg.Sensors { + for i, sensor := range cfg.Camera { sensorSlice[i] = goStringToBstring(sensor) } lidarCfg, err := toLidarConfig(cfg.LidarConfig) diff --git a/config/config.go b/config/config.go index afd0abd8..27bde07c 100644 --- a/config/config.go +++ b/config/config.go @@ -25,7 +25,7 @@ type Config struct { var errCameraMustHaveName = errors.New("\"camera[name]\" is required") // Validate creates the list of implicit dependencies. -func (config *Config) Validate(path string) (map[string]string, error) { +func (config *Config) Validate(path string) ([]string, error) { _, ok := config.Camera["name"] if !ok { return nil, utils.NewConfigValidationError(path, errCameraMustHaveName) @@ -54,7 +54,7 @@ func (config *Config) Validate(path string) (map[string]string, error) { return nil, errors.New("cannot specify map_rate_sec less than zero") } - deps := config.Camera + deps := []string{config.Camera["name"]} return deps, nil } diff --git a/go.mod b/go.mod index f06672d1..c22d1bd1 100644 --- a/go.mod +++ b/go.mod @@ -11,12 +11,12 @@ require ( github.com/rhysd/actionlint v1.6.24 github.com/viamrobotics/gostream v0.0.0-20230609200515-c5d67c29ed25 go.opencensus.io v0.24.0 + go.uber.org/multierr v1.11.0 + go.uber.org/zap v1.24.0 go.viam.com/api v0.1.156 go.viam.com/rdk v0.5.1-0.20230719205427-c10eab2aa624 go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 go.viam.com/utils v0.1.38 - google.golang.org/grpc v1.56.0 - google.golang.org/protobuf v1.30.0 ) require ( @@ -278,8 +278,6 @@ require ( go.mongodb.org/mongo-driver v1.12.0-prerelease.0.20221109213319-d3466eeae7a7 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/goleak v1.2.1 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.24.0 // indirect goji.io v2.0.2+incompatible // indirect golang.org/x/crypto v0.10.0 // indirect golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect @@ -300,6 +298,8 @@ require ( google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/grpc v1.56.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/src-d/go-billy.v4 v4.3.2 // indirect diff --git a/go.sum b/go.sum index 862b2562..818a9339 100644 --- a/go.sum +++ b/go.sum @@ -124,7 +124,6 @@ github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= @@ -165,7 +164,6 @@ github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkAp github.com/bombsimon/wsl/v3 v3.2.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/breml/bidichk v0.2.3 h1:qe6ggxpTfA8E75hdjWPZ581sY3a2lnl0IRxLQFelECI= github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= github.com/breml/errchkjson v0.3.0 h1:YdDqhfqMT+I1vIxPSas44P+9Z9HzJwCeAzjB8PxP1xw= @@ -216,7 +214,6 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -226,7 +223,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.19-0.20220421211855-0d412c9fbeb1 h1:Tw0uuY+3UWYiSbR0+wsrJ30vY3zMFZ4JNPkSp9XdFyA= -github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= @@ -334,11 +330,9 @@ github.com/go-critic/go-critic v0.5.5/go.mod h1:eMs1Oc/oIP+CYNVN09M+XZYffIPuRHaw github.com/go-critic/go-critic v0.6.7 h1:1evPrElnLQ2LZtJfmNDzlieDhjnq36SLgNzisx06oPM= github.com/go-critic/go-critic v0.6.7/go.mod h1:fYZUijFdcnxgx6wPjQA2QEjIRaNCT0gO8bhexy6/QmE= github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.3.1 h1:/cT8A7uavYKvglYXvrdDw4oS5ZLkcOU22fa2HJ1/JVM= github.com/go-fonts/liberation v0.3.1 h1:9RPT2NhUpxQ7ukUvz3jeUckmN42T9D9TpjtQcqK/ceM= github.com/go-fonts/liberation v0.3.1/go.mod h1:jdJ+cqF+F4SUL2V+qxBth8fvBpBDS7yloUL5Fi8GTGY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -395,7 +389,6 @@ github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnp github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5 h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= @@ -451,7 +444,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -522,7 +514,6 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-github/v31 v31.0.0/go.mod h1:NQPZol8/1sMoWYGN2yaALIBytu17gAWfhbweiEed3pM= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -569,7 +560,6 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -614,15 +604,12 @@ github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -664,13 +651,10 @@ github.com/invopop/jsonschema v0.6.0 h1:8e+xY8ZEn8gDHUYylSlLHy22P+SLeIRIHv3nM3hC github.com/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4 h1:G2ztCwXov8mRvP0ZfjE6nAlaCX2XbykaeHdbT6KwDz0= github.com/jedib0t/go-pretty/v6 v6.4.6 h1:v6aG9h6Uby3IusSSEjHaZNXpHFhzqMmjXcPq1Rjl9Jw= github.com/jedib0t/go-pretty/v6 v6.4.6/go.mod h1:Ndk3ase2CkQbXLLNf5QDHoYb6J9WtVfmHZu9n8rk2xs= -github.com/jeremija/gosubmit v0.2.7/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI= github.com/jezek/xgb v0.0.0-20210312150743-0e0f116e1240/go.mod h1:3P4UH/k22rXyHIJD2w4h2XMqPX4Of/eySEZq9L6wqc4= github.com/jgautheron/goconst v1.4.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= github.com/jhump/protoreflect v1.10.3/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= @@ -978,7 +962,6 @@ github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaF github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8= @@ -1026,7 +1009,6 @@ github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= github.com/pion/turn/v2 v2.1.0 h1:5wGHSgGhJhP/RpabkUb/T9PdsAjkGLS6toYz5HNzoSI= github.com/pion/turn/v2 v2.1.0/go.mod h1:yrT5XbXSGX1VFSF31A3c1kCNB5bBZgk/uu5LET162qs= -github.com/pion/udp v0.1.4/go.mod h1:G8LDo56HsFwC24LIcnT4YIDU5qcB6NepqqjP0keL2us= github.com/pion/udp/v2 v2.0.1/go.mod h1:B7uvTMP00lzWdyMr/1PVZXtV3wpPIxBRd4Wl6AksXn8= github.com/pion/webrtc/v3 v3.2.6/go.mod h1:+//AwYJLlhHRyoNyuRUBs7Pw1jyZHCxQCuu2ZUNSBaw= github.com/pion/webrtc/v3 v3.2.10 h1:CPsuYs14f1aBhywmES0idje5t5XhftXeKMHwfzrxcIc= @@ -1046,7 +1028,6 @@ github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:w github.com/polyfloyd/go-errorlint v1.1.0 h1:VKoEFg5yxSgJ2yFPVhxW7oGz+f8/OVcuMeNvcPIi6Eg= github.com/polyfloyd/go-errorlint v1.1.0/go.mod h1:Uss7Bc/izYG0leCMRx3WVlrpqWedSZk7V/FUQW6VJ6U= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -1101,7 +1082,6 @@ github.com/quasilyte/go-ruleguard/dsl v0.3.1/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQP github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= github.com/quasilyte/go-ruleguard/rules v0.0.0-20210203162857-b223e0831f88/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/quasilyte/go-ruleguard/rules v0.0.0-20210221215616-dfcc94e3dffd/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= @@ -1127,7 +1107,6 @@ github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6W5lnUepvuMMgQ= github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= @@ -1336,7 +1315,6 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zitadel/logging v0.3.4/go.mod h1:aPpLQhE+v6ocNK0TWrBrd363hZ95KcI17Q1ixAQwZF0= github.com/zitadel/oidc v1.13.4 h1:+k2GKqP9Ld9S2MSFlj+KaNsoZ3J9oy+Ezw51EzSFuC8= github.com/zitadel/oidc v1.13.4/go.mod h1:3h2DhUcP02YV6q/CA/BG4yla0o6rXjK+DkJGK/dwJfw= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= @@ -1388,18 +1366,12 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -go.viam.com/api v0.1.145 h1:HJ68mOEKwBjh+0ZzbB0y+rjBWE5fwr7nkj60udP4s5I= -go.viam.com/api v0.1.145/go.mod h1:CwLz82Ie4+Z2lSH2F0oQGViP4/TV9uxjJs+rqHvFWE8= go.viam.com/api v0.1.156 h1:lhk+xYuDai0845RrMgAR2rij0uv6+UwL4s00rPTdjXc= go.viam.com/api v0.1.156/go.mod h1:CwLz82Ie4+Z2lSH2F0oQGViP4/TV9uxjJs+rqHvFWE8= -go.viam.com/rdk v0.4.0-rc0 h1:VXwZh7Pd+P+sLaGEwRzT+zHrQEal0JcZGkWybYQS3B0= -go.viam.com/rdk v0.4.0-rc0/go.mod h1:a/jXQcQL0B9nMeJ9xVb2w8iUNLMH+Ocvi1UDyCjn8tA= go.viam.com/rdk v0.5.1-0.20230719205427-c10eab2aa624 h1:yEMKTzjdzP2KlZNQqJ0s8FWAysrhm3618ov4y95vk/8= go.viam.com/rdk v0.5.1-0.20230719205427-c10eab2aa624/go.mod h1:gylf5mz6frpBa5+9cGkS6YjV7GKA6/qqIHi7AYPEWug= go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 h1:oBiK580EnEIzgFLU4lHOXmGAE3MxnVbeR7s1wp/F3Ps= go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2/go.mod h1:XM0tej6riszsiNLT16uoyq1YjuYPWlRBweTPRDanIts= -go.viam.com/utils v0.1.37 h1:AQgpbiHahZbcDqMAxfB1HYeH2txyQ+lP/Ob02i+sFOM= -go.viam.com/utils v0.1.37/go.mod h1:tjPInze4C0UYFRqL/FU96yqhJpHR1zjiNZ7qChTN/b8= go.viam.com/utils v0.1.38 h1:Xc5UsEOYjX4WTcnku4vPD9JFKlu6NjdDmA3AY8qnySA= go.viam.com/utils v0.1.38/go.mod h1:tjPInze4C0UYFRqL/FU96yqhJpHR1zjiNZ7qChTN/b8= goji.io v2.0.2+incompatible h1:uIssv/elbKRLznFUy3Xj4+2Mz/qKhek/9aZQDUMae7c= @@ -1464,7 +1436,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -2029,7 +2000,6 @@ periph.io/x/conn/v3 v3.7.0 h1:f1EXLn4pkf7AEWwkol2gilCNZ0ElY+bxS4WE2PQXfrA= periph.io/x/host/v3 v3.8.1-0.20230331112814-9f0d9f7d76db h1:8+HL7DJFofYRhGoK/UdwhzvQj3I2HrKLQ6dkOC66CZY= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/sensors/sensors.go b/sensors/sensors.go index c725dc94..d57d9bf1 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -4,6 +4,7 @@ package sensors import ( "bytes" "context" + "fmt" "strconv" "time" @@ -60,7 +61,7 @@ func NewLidar( dataFreqHz := defaultDataFreqHz dataFreqHzIn, ok := cam["data_freq_hz"] if !ok { - logger.Debugf("no data_freq_hz given, setting to default value of %d", defaultDataFreqHz) + logger.Debugf("problem retrieving lidar data frequency, setting to default value of %d", defaultDataFreqHz) } else { var err error dataFreqHz, err = strconv.Atoi(dataFreqHzIn) @@ -78,6 +79,8 @@ func NewLidar( if err != nil { return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", name) } + fmt.Println("properties are: ", properties) + fmt.Println("and support PCD is: ", properties.SupportsPCD) if !properties.SupportsPCD { return Lidar{}, errors.Errorf("configuring lidar camera error: " + "'camera' must support PCD") diff --git a/sensors/sensors_test.go b/sensors/sensors_test.go index e74df005..131d67fb 100644 --- a/sensors/sensors_test.go +++ b/sensors/sensors_test.go @@ -17,12 +17,12 @@ func TestValidateGetData(t *testing.T) { logger := golog.NewTestLogger(t) ctx := context.Background() - cam := map[string]string{"name": "good_lidar"} - goodLidar, err := s.NewLidar(ctx, s.SetupDeps(cam), cam, logger) + lidar := map[string]string{"name": "good_lidar"} + goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - sensors = []string{"invalid_sensor"} - invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "invalid_sensor"} + invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) sensorValidationMaxTimeout := time.Duration(50) * time.Millisecond @@ -34,8 +34,8 @@ func TestValidateGetData(t *testing.T) { }) t.Run("returns nil if a lidar reading succeeds within the timeout", func(t *testing.T) { - sensors = []string{"warming_up_lidar"} - warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "warming_up_lidar"} + warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) err = s.ValidateGetData(ctx, warmingUpLidar, sensorValidationMaxTimeout, sensorValidationInterval, logger) @@ -51,8 +51,8 @@ func TestValidateGetData(t *testing.T) { cancelledCtx, cancelFunc := context.WithCancel(context.Background()) cancelFunc() - sensors = []string{"warming_up_lidar"} - warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "warming_up_lidar"} + warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) err = s.ValidateGetData(cancelledCtx, warmingUpLidar, sensorValidationMaxTimeout, sensorValidationInterval, logger) @@ -64,28 +64,18 @@ func TestNewLidar(t *testing.T) { logger := golog.NewTestLogger(t) t.Run("No sensor provided", func(t *testing.T) { - sensors := []string{} - deps := s.SetupDeps(sensors) - actualLidar, err := s.NewLidar(context.Background(), deps, sensors, logger) + lidar := map[string]string{} + deps := s.SetupDeps(lidar) + actualLidar, err := s.NewLidar(context.Background(), deps, lidar, logger) expectedLidar := s.Lidar{} test.That(t, actualLidar, test.ShouldResemble, expectedLidar) test.That(t, err, test.ShouldBeNil) }) - t.Run("Failed lidar creation due to more than one sensor provided", func(t *testing.T) { - sensors := []string{"lidar", "one-too-many"} - deps := s.SetupDeps(sensors) - actualLidar, err := s.NewLidar(context.Background(), deps, sensors, logger) - expectedLidar := s.Lidar{} - test.That(t, actualLidar, test.ShouldResemble, expectedLidar) - test.That(t, err, test.ShouldBeError, - errors.New("configuring lidar camera error: 'sensors' must contain only one lidar camera, but is 'sensors: [lidar, one-too-many]'")) - }) - t.Run("Failed lidar creation with non-existing sensor", func(t *testing.T) { - sensors := []string{"gibberish"} - deps := s.SetupDeps(sensors) - actualLidar, err := s.NewLidar(context.Background(), deps, sensors, logger) + lidar := map[string]string{"name": "gibberish"} + deps := s.SetupDeps(lidar) + actualLidar, err := s.NewLidar(context.Background(), deps, lidar, logger) expectedLidar := s.Lidar{} test.That(t, actualLidar, test.ShouldResemble, expectedLidar) test.That(t, err, test.ShouldBeError, @@ -94,11 +84,11 @@ func TestNewLidar(t *testing.T) { }) t.Run("Successful lidar creation", func(t *testing.T) { - sensors := []string{"good_lidar"} + lidar := map[string]string{"name": "good_lidar"} ctx := context.Background() - deps := s.SetupDeps(sensors) - actualLidar, err := s.NewLidar(ctx, deps, sensors, logger) - test.That(t, actualLidar.Name, test.ShouldEqual, sensors[0]) + deps := s.SetupDeps(lidar) + actualLidar, err := s.NewLidar(ctx, deps, lidar, logger) + test.That(t, actualLidar.Name, test.ShouldEqual, lidar["name"]) test.That(t, err, test.ShouldBeNil) tsr, err := actualLidar.TimedSensorReading(ctx) @@ -111,20 +101,20 @@ func TestTimedSensorReading(t *testing.T) { logger := golog.NewTestLogger(t) ctx := context.Background() - sensors := []string{"invalid_sensor"} - invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar := map[string]string{"name": "invalid_sensor"} + invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - sensors = []string{"invalid_replay_sensor"} - invalidReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "invalid_replay_sensor"} + invalidReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - sensors = []string{"good_lidar"} - goodLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "good_lidar"} + goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - sensors = []string{"replay_sensor"} - goodReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(sensors), sensors, logger) + lidar = map[string]string{"name": "replay_sensor"} + goodReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) t.Run("when the lidar returns an error, returns that error", func(t *testing.T) { diff --git a/sensors/test_deps.go b/sensors/test_deps.go index adc3d919..71c92b32 100644 --- a/sensors/test_deps.go +++ b/sensors/test_deps.go @@ -21,30 +21,26 @@ const ( BadTime = "NOT A TIME" ) -// SetupDeps returns the dependencies based on the sensors passed as arguments. -func SetupDeps(sensors []string) resource.Dependencies { +// SetupDeps returns the dependencies based on the lidar passed as argument. +func SetupDeps(lidar map[string]string) resource.Dependencies { deps := make(resource.Dependencies) - - for _, sensor := range sensors { - switch sensor { - case "good_lidar": - deps[camera.Named(sensor)] = getGoodLidar() - case "warming_up_lidar": - deps[camera.Named(sensor)] = getWarmingUpLidar() - case "replay_sensor": - deps[camera.Named(sensor)] = getReplaySensor(TestTime) - case "invalid_replay_sensor": - deps[camera.Named(sensor)] = getReplaySensor(BadTime) - case "invalid_sensor": - deps[camera.Named(sensor)] = getInvalidSensor() - case "gibberish": - return deps - case "finished_replay_sensor": - deps[camera.Named(sensor)] = getFinishedReplaySensor() - default: - continue - } + switch lidar["name"] { + case "good_lidar": + deps[camera.Named(lidar["name"])] = getGoodLidar() + case "warming_up_lidar": + deps[camera.Named(lidar["name"])] = getWarmingUpLidar() + case "lidar_replay_sensor": + deps[camera.Named(lidar["name"])] = getReplaySensor(TestTime) + case "invalid_lidar_replay_sensor": + deps[camera.Named(lidar["name"])] = getReplaySensor(BadTime) + case "invalid_lidar": + deps[camera.Named(lidar["name"])] = getInvalidSensor() + case "gibberish_lidar": + return deps + case "finished_lidar_replay_sensor": + deps[camera.Named(lidar["name"])] = getFinishedReplaySensor() } + return deps } diff --git a/testhelper/testhelper.go b/testhelper/testhelper.go index 6958323c..36bcc147 100644 --- a/testhelper/testhelper.go +++ b/testhelper/testhelper.go @@ -48,19 +48,17 @@ const ( var mockLidarPath = artifact.MustPath("viam-cartographer/mock_lidar") -// SetupStubDeps returns stubbed dependencies based on the sensors +// SetupStubDeps returns stubbed dependencies based on the camera // the stubs fail tests if called. -func SetupStubDeps(sensors []string, t *testing.T) resource.Dependencies { +func SetupStubDeps(camera_name string, t *testing.T) resource.Dependencies { deps := make(resource.Dependencies) - - for _, sensor := range sensors { - switch sensor { - case "stub_lidar": - deps[camera.Named(sensor)] = getStubLidar(t) - default: - t.Errorf("SetupStubDeps calld with unhandled sensor sensors: %s, %v", sensor, sensors) - } + switch camera_name { + case "stub_lidar": + deps[camera.Named(camera_name)] = getStubLidar(t) + default: + t.Errorf("SetupStubDeps called with unhandled camera: %s", camera_name) } + return deps } @@ -204,8 +202,8 @@ func CreateIntegrationSLAMService( if err != nil { return nil, err } - test.That(t, sensorDeps, test.ShouldResemble, cfg.Sensors) - deps := SetupStubDeps(cfg.Sensors, t) + test.That(t, sensorDeps, test.ShouldResemble, []string{cfg.Camera["name"]}) + deps := SetupStubDeps(cfg.Camera["name"], t) svc, err := viamcartographer.New( ctx, @@ -239,13 +237,13 @@ func CreateSLAMService( cfgService := resource.Config{Name: "test", API: slam.API, Model: viamcartographer.Model} cfgService.ConvertedAttributes = cfg - deps := s.SetupDeps(cfg.Sensors) + deps := s.SetupDeps(cfg.Camera) sensorDeps, err := cfg.Validate("path") if err != nil { return nil, err } - test.That(t, sensorDeps, test.ShouldResemble, cfg.Sensors) + test.That(t, sensorDeps, test.ShouldResemble, cfg.Camera) svc, err := viamcartographer.New( ctx, From 128c20b99d79f09476e2b1a17d9f1e9d2a6ae2cf Mon Sep 17 00:00:00 2001 From: PStrutz Date: Mon, 24 Jul 2023 10:47:25 -0400 Subject: [PATCH 25/41] working on resolving issues --- sensors/sensors.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sensors/sensors.go b/sensors/sensors.go index d57d9bf1..f3281543 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -4,7 +4,6 @@ package sensors import ( "bytes" "context" - "fmt" "strconv" "time" @@ -79,11 +78,11 @@ func NewLidar( if err != nil { return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", name) } - fmt.Println("properties are: ", properties) - fmt.Println("and support PCD is: ", properties.SupportsPCD) + + logger.Debugf("properties are set") if !properties.SupportsPCD { - return Lidar{}, errors.Errorf("configuring lidar camera error: " + - "'camera' must support PCD") + return Lidar{}, errors.Errorf("configuring lidar camera error: "+ + "'camera' must support PCD but properties are %v", properties) } return Lidar{ From 281d4a09b7bc1174a1d565e5cfaa17c64406b3db Mon Sep 17 00:00:00 2001 From: PStrutz Date: Mon, 24 Jul 2023 14:46:49 -0400 Subject: [PATCH 26/41] working sensor tests --- sensorprocess/sensorprocess_test.go | 2 +- sensors/sensors.go | 13 ++------ sensors/sensors_test.go | 15 ++++++--- sensors/test_deps.go | 48 +++++++++++++++++++++-------- viam_cartographer_test.go | 40 ++++++++++-------------- 5 files changed, 64 insertions(+), 54 deletions(-) diff --git a/sensorprocess/sensorprocess_test.go b/sensorprocess/sensorprocess_test.go index 3d321e02..5507bc96 100644 --- a/sensorprocess/sensorprocess_test.go +++ b/sensorprocess/sensorprocess_test.go @@ -359,7 +359,7 @@ func TestAddSensorReading(t *testing.T) { }) t.Run("live sensor adds sensor reading once and ignores errors", func(t *testing.T) { - sensors := []string{"good_lidar"} + sensors := map[string]string{"name": "good_lidar"} logger := golog.NewTestLogger(t) liveSensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) test.That(t, err, test.ShouldBeNil) diff --git a/sensors/sensors.go b/sensors/sensors.go index f3281543..ee3cb95d 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -79,10 +79,9 @@ func NewLidar( return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", name) } - logger.Debugf("properties are set") if !properties.SupportsPCD { - return Lidar{}, errors.Errorf("configuring lidar camera error: "+ - "'camera' must support PCD but properties are %v", properties) + return Lidar{}, errors.Errorf("configuring lidar camera error: " + + "'camera' must support PCD") } return Lidar{ @@ -155,11 +154,3 @@ func (lidar Lidar) TimedSensorReading(ctx context.Context) (TimedSensorReadingRe } return TimedSensorReadingResponse{Reading: buf.Bytes(), ReadingTime: readingTime, Replay: replay}, nil } - -// getName returns the name of the sensor based on its index in the sensor array. -func getName(sensors []string, index int) (string, error) { - if index < 0 || index >= len(sensors) { - return "", errors.New("index out of bounds") - } - return sensors[index], nil -} diff --git a/sensors/sensors_test.go b/sensors/sensors_test.go index 131d67fb..8fe88f54 100644 --- a/sensors/sensors_test.go +++ b/sensors/sensors_test.go @@ -4,6 +4,7 @@ package sensors_test import ( "context" "errors" + "fmt" "testing" "time" @@ -21,10 +22,14 @@ func TestValidateGetData(t *testing.T) { goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - lidar = map[string]string{"name": "invalid_sensor"} + lidar = map[string]string{"name": "invalid_lidar"} invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) + lidar = map[string]string{"name": "np_pcd_camera"} + _, err = s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + test.That(t, err, test.ShouldBeError, errors.New("configuring lidar camera error: 'camera' must support PCD")) + sensorValidationMaxTimeout := time.Duration(50) * time.Millisecond sensorValidationInterval := time.Duration(10) * time.Millisecond @@ -37,7 +42,7 @@ func TestValidateGetData(t *testing.T) { lidar = map[string]string{"name": "warming_up_lidar"} warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - + fmt.Println("got to here") err = s.ValidateGetData(ctx, warmingUpLidar, sensorValidationMaxTimeout, sensorValidationInterval, logger) test.That(t, err, test.ShouldBeNil) }) @@ -101,11 +106,11 @@ func TestTimedSensorReading(t *testing.T) { logger := golog.NewTestLogger(t) ctx := context.Background() - lidar := map[string]string{"name": "invalid_sensor"} + lidar := map[string]string{"name": "invalid_lidar"} invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - lidar = map[string]string{"name": "invalid_replay_sensor"} + lidar = map[string]string{"name": "invalid_replay_lidar"} invalidReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) @@ -113,7 +118,7 @@ func TestTimedSensorReading(t *testing.T) { goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - lidar = map[string]string{"name": "replay_sensor"} + lidar = map[string]string{"name": "replay_lidar"} goodReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) diff --git a/sensors/test_deps.go b/sensors/test_deps.go index 71c92b32..c4826bc9 100644 --- a/sensors/test_deps.go +++ b/sensors/test_deps.go @@ -29,16 +29,18 @@ func SetupDeps(lidar map[string]string) resource.Dependencies { deps[camera.Named(lidar["name"])] = getGoodLidar() case "warming_up_lidar": deps[camera.Named(lidar["name"])] = getWarmingUpLidar() - case "lidar_replay_sensor": - deps[camera.Named(lidar["name"])] = getReplaySensor(TestTime) - case "invalid_lidar_replay_sensor": - deps[camera.Named(lidar["name"])] = getReplaySensor(BadTime) + case "replay_lidar": + deps[camera.Named(lidar["name"])] = getReplayLidar(TestTime) + case "invalid_replay_lidar": + deps[camera.Named(lidar["name"])] = getReplayLidar(BadTime) case "invalid_lidar": - deps[camera.Named(lidar["name"])] = getInvalidSensor() + deps[camera.Named(lidar["name"])] = getInvalidLidar() + case "np_pcd_camera": + deps[camera.Named(lidar["name"])] = getNoPCDCamera() case "gibberish_lidar": return deps - case "finished_lidar_replay_sensor": - deps[camera.Named(lidar["name"])] = getFinishedReplaySensor() + case "finished_replay_lidar": + deps[camera.Named(lidar["name"])] = getFinishedReplayLidar() } return deps @@ -61,7 +63,7 @@ func getWarmingUpLidar() *inject.Camera { return nil, transform.NewNoIntrinsicsError("") } cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { - return camera.Properties{}, nil + return camera.Properties{SupportsPCD: true}, nil } return cam } @@ -78,12 +80,12 @@ func getGoodLidar() *inject.Camera { return nil, transform.NewNoIntrinsicsError("") } cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { - return camera.Properties{}, nil + return camera.Properties{SupportsPCD: true}, nil } return cam } -func getReplaySensor(testTime string) *inject.Camera { +func getReplayLidar(testTime string) *inject.Camera { cam := &inject.Camera{} cam.NextPointCloudFunc = func(ctx context.Context) (pointcloud.PointCloud, error) { md := ctx.Value(contextutils.MetadataContextKey) @@ -99,12 +101,12 @@ func getReplaySensor(testTime string) *inject.Camera { return nil, transform.NewNoIntrinsicsError("") } cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { - return camera.Properties{}, nil + return camera.Properties{SupportsPCD: true}, nil } return cam } -func getInvalidSensor() *inject.Camera { +func getInvalidLidar() *inject.Camera { cam := &inject.Camera{} cam.NextPointCloudFunc = func(ctx context.Context) (pointcloud.PointCloud, error) { return nil, errors.New("invalid sensor") @@ -115,10 +117,30 @@ func getInvalidSensor() *inject.Camera { cam.ProjectorFunc = func(ctx context.Context) (transform.Projector, error) { return nil, transform.NewNoIntrinsicsError("") } + cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { + return camera.Properties{SupportsPCD: true}, nil + } + return cam +} + +func getNoPCDCamera() *inject.Camera { + cam := &inject.Camera{} + cam.NextPointCloudFunc = func(ctx context.Context) (pointcloud.PointCloud, error) { + return nil, errors.New("invalid camera") + } + cam.StreamFunc = func(ctx context.Context, errHandlers ...gostream.ErrorHandler) (gostream.VideoStream, error) { + return nil, errors.New("invalid camera") + } + cam.ProjectorFunc = func(ctx context.Context) (transform.Projector, error) { + return nil, transform.NewNoIntrinsicsError("") + } + cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { + return camera.Properties{SupportsPCD: false}, nil + } return cam } -func getFinishedReplaySensor() *inject.Camera { +func getFinishedReplayLidar() *inject.Camera { cam := &inject.Camera{} cam.NextPointCloudFunc = func(ctx context.Context) (pointcloud.PointCloud, error) { return nil, replaypcd.ErrEndOfDataset diff --git a/viam_cartographer_test.go b/viam_cartographer_test.go index e8228b2b..d57fd903 100644 --- a/viam_cartographer_test.go +++ b/viam_cartographer_test.go @@ -25,7 +25,7 @@ import ( const ( testExecutableName = "true" // the program "true", not the boolean value - testDataRateMsec = 200 + testDataFreqHz = "5" ) var ( @@ -49,7 +49,7 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) }() attrCfg := &vcConfig.Config{ - Sensors: []string{"lidar", "one-too-many"}, + Camera: map[string]string{"name": "lidar", "name2": "one-too-many"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -68,10 +68,9 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Sensors: []string{"gibberish"}, + Camera: map[string]string{"name": "gibberish", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } _, err = testhelper.CreateSLAMService(t, attrCfg, logger) @@ -88,10 +87,9 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } svc, err := testhelper.CreateSLAMService(t, attrCfg, logger) @@ -109,10 +107,9 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Sensors: []string{"invalid_sensor"}, + Camera: map[string]string{"name": "invalid_sensor", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } _, err = testhelper.CreateSLAMService(t, attrCfg, logger) @@ -129,7 +126,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, MapRateSec: &_zeroInt, @@ -162,7 +159,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, MapRateSec: &testMapRateSec, @@ -196,7 +193,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{}, + Camera: map[string]string{}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -214,7 +211,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"lidar", "one-too-many"}, + Camera: map[string]string{"name": "lidar", "name2": "one-too-many"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -233,10 +230,9 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"gibberish"}, + Camera: map[string]string{"name": "gibberish"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } _, err := testhelper.CreateSLAMService(t, attrCfg, logger) @@ -253,10 +249,9 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } svc, err := testhelper.CreateSLAMService(t, attrCfg, logger) @@ -274,10 +269,9 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"invalid_sensor"}, + Camera: map[string]string{"name": "invalid_sensor", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } _, err := testhelper.CreateSLAMService(t, attrCfg, logger) @@ -293,7 +287,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"replay_sensor"}, + Camera: map[string]string{"name": "replay_sensor"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, MapRateSec: &_zeroInt, @@ -339,10 +333,9 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, - DataRateMsec: testDataRateMsec, } svc, err := testhelper.CreateSLAMService(t, attrCfg, logger) @@ -395,7 +388,7 @@ func TestClose(t *testing.T) { }() attrCfg := &vcConfig.Config{ - Sensors: []string{"replay_sensor"}, + Camera: map[string]string{"name": "replay_sensor"}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, MapRateSec: &testMapRateSec, @@ -447,11 +440,10 @@ func TestDoCommand(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Sensors: []string{"good_lidar"}, + Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d", "test_param": "viam"}, DataDirectory: dataDirectory, MapRateSec: &testMapRateSec, - DataRateMsec: testDataRateMsec, } svc, err := testhelper.CreateSLAMService(t, attrCfg, logger) test.That(t, err, test.ShouldBeNil) From 7e3386acabcaf9f63ece16aabd355d536234fd61 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Mon, 24 Jul 2023 15:25:28 -0400 Subject: [PATCH 27/41] passing sensorprocess tests --- cartofacade/capi.go | 8 ++--- sensorprocess/sensorprocess.go | 8 +++-- sensorprocess/sensorprocess_test.go | 56 ++++++++++++++--------------- sensors/test_deps.go | 2 +- 4 files changed, 39 insertions(+), 35 deletions(-) diff --git a/cartofacade/capi.go b/cartofacade/capi.go index bad083a8..144f3c8c 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -179,7 +179,7 @@ func NewCarto(cfg CartoConfig, acfg CartoAlgoConfig, vcl CartoLibInterface) (Car return Carto{}, err } - status = C.free_bstring_array(vcc.sensors, C.size_t(len(cfg.Sensors))) + status = C.free_bstring_array(vcc.sensors, C.size_t(1)) if status != C.BSTR_OK { return Carto{}, errors.New("unable to free memory for sensor list") } @@ -360,9 +360,9 @@ func getConfig(cfg CartoConfig) (C.viam_carto_config, error) { return C.viam_carto_config{}, errors.New("unable to allocate memory for sensor list") } sensorSlice := unsafe.Slice(pSensor, sz) - for i, sensor := range cfg.Camera { - sensorSlice[i] = goStringToBstring(sensor) - } + + sensorSlice[0] = goStringToBstring(cfg.Camera["name"]) + lidarCfg, err := toLidarConfig(cfg.LidarConfig) if err != nil { return C.viam_carto_config{}, err diff --git a/sensorprocess/sensorprocess.go b/sensorprocess/sensorprocess.go index 1677785e..bd6eef60 100644 --- a/sensorprocess/sensorprocess.go +++ b/sensorprocess/sensorprocess.go @@ -4,6 +4,7 @@ package sensorprocess import ( "context" "errors" + "fmt" "math" "strings" "time" @@ -20,7 +21,7 @@ type Config struct { CartoFacade cartofacade.Interface Lidar sensors.TimedSensor LidarName string - DataRateMs int + DataFreqHz int Timeout time.Duration Logger golog.Logger } @@ -98,5 +99,8 @@ func addSensorReadingFromLiveReadings(ctx context.Context, reading []byte, readi } } timeElapsedMs := int(time.Since(startTime).Milliseconds()) - return int(math.Max(0, float64(config.DataRateMs-timeElapsedMs))) + fmt.Println(config.DataFreqHz) + data_rate_ms := 100 / config.DataFreqHz + fmt.Println(data_rate_ms) + return int(math.Max(0, float64(data_rate_ms-timeElapsedMs))) } diff --git a/sensorprocess/sensorprocess_test.go b/sensorprocess/sensorprocess_test.go index 5507bc96..c81883c3 100644 --- a/sensorprocess/sensorprocess_test.go +++ b/sensorprocess/sensorprocess_test.go @@ -44,7 +44,7 @@ func TestAddSensorReadingReplaySensor(t *testing.T) { Logger: logger, CartoFacade: &cf, LidarName: "good_lidar", - DataRateMs: 200, + DataFreqHz: 5, Timeout: 10 * time.Second, } t.Run("When addSensorReading returns successfully, no infinite loop", func(t *testing.T) { @@ -141,11 +141,11 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { Logger: logger, CartoFacade: &cf, LidarName: "good_lidar", - DataRateMs: 200, + DataFreqHz: 5, Timeout: 10 * time.Second, } - t.Run("When AddSensorReading blocks for more than the DataRateMs and succeeds, time to sleep is 0", func(t *testing.T) { + t.Run("When AddSensorReading blocks for more than the DataFreqHz and succeeds, time to sleep is 0", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -161,7 +161,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { test.That(t, timeToSleep, test.ShouldEqual, 0) }) - t.Run("AddSensorReading slower than DataRateMs and returns lock error, time to sleep is 0", func(t *testing.T) { + t.Run("AddSensorReading slower than DataFreqHz and returns lock error, time to sleep is 0", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -177,7 +177,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { test.That(t, timeToSleep, test.ShouldEqual, 0) }) - t.Run("When AddSensorReading blocks for more than the DataRateMs and returns an unexpected error, time to sleep is 0", func(t *testing.T) { + t.Run("When AddSensorReading blocks for more than the DataFreqHz and returns an unexpected error, time to sleep is 0", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -193,7 +193,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { test.That(t, timeToSleep, test.ShouldEqual, 0) }) - t.Run("AddSensorReading faster than the DataRateMs and succeeds, time to sleep is <= DataRateMs", func(t *testing.T) { + t.Run("AddSensorReading faster than the DataFreqHz and succeeds, time to sleep is <= DataFreqHz", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -206,10 +206,10 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { timeToSleep := addSensorReadingFromLiveReadings(context.Background(), reading, readingTimestamp, config) test.That(t, timeToSleep, test.ShouldBeGreaterThan, 0) - test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, config.DataRateMs) + test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, 100/config.DataFreqHz) }) - t.Run("AddSensorReading faster than the DataRateMs and returns lock error, time to sleep is <= DataRateMs", func(t *testing.T) { + t.Run("AddSensorReading faster than the DataFreqHz and returns lock error, time to sleep is <= DataFreqHz", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -222,10 +222,10 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { timeToSleep := addSensorReadingFromLiveReadings(context.Background(), reading, readingTimestamp, config) test.That(t, timeToSleep, test.ShouldBeGreaterThan, 0) - test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, config.DataRateMs) + test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, 100/config.DataFreqHz) }) - t.Run("AddSensorReading faster than DataRateMs and returns unexpected error, time to sleep is <= DataRateMs", func(t *testing.T) { + t.Run("AddSensorReading faster than DataFreqHz and returns unexpected error, time to sleep is <= DataFreqHz", func(t *testing.T) { cf.AddSensorReadingFunc = func( ctx context.Context, timeout time.Duration, @@ -238,7 +238,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { timeToSleep := addSensorReadingFromLiveReadings(context.Background(), reading, readingTimestamp, config) test.That(t, timeToSleep, test.ShouldBeGreaterThan, 0) - test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, config.DataRateMs) + test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, 100/config.DataFreqHz) }) } @@ -247,10 +247,10 @@ func invalidSensorTestHelper( t *testing.T, cartoFacadeMock cartofacade.Mock, config Config, - sensors []string, + cam map[string]string, ) { logger := golog.NewTestLogger(t) - sensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + sensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) var calls []addSensorReadingArgs @@ -285,37 +285,37 @@ func TestAddSensorReading(t *testing.T) { config := Config{ Logger: logger, CartoFacade: &cf, - DataRateMs: 200, + DataFreqHz: 5, Timeout: 10 * time.Second, } ctx := context.Background() t.Run("returns error when lidar GetData returns error, doesn't try to add sensor data", func(t *testing.T) { - sensors := []string{"invalid_sensor"} + cam := map[string]string{"name": "invalid_lidar"} invalidSensorTestHelper( ctx, t, cf, config, - sensors, + cam, ) }) t.Run("returns error when replay sensor timestamp is invalid, doesn't try to add sensor data", func(t *testing.T) { - sensors := []string{"invalid_replay_sensor"} + cam := map[string]string{"name": "invalid_replay_lidar"} invalidSensorTestHelper( ctx, t, cf, config, - sensors, + cam, ) }) t.Run("replay sensor adds sensor data until success", func(t *testing.T) { - sensors := []string{"replay_sensor"} + cam := map[string]string{"name": "replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) var calls []addSensorReadingArgs @@ -351,7 +351,7 @@ func TestAddSensorReading(t *testing.T) { firstTimestamp := calls[0].readingTimestamp for i, call := range calls { t.Logf("call %d", i) - test.That(t, call.sensorName, test.ShouldResemble, "replay_sensor") + test.That(t, call.sensorName, test.ShouldResemble, "replay_lidar") test.That(t, call.currentReading, test.ShouldResemble, expectedPCD) test.That(t, call.timeout, test.ShouldEqual, config.Timeout) test.That(t, call.readingTimestamp, test.ShouldEqual, firstTimestamp) @@ -415,9 +415,9 @@ func TestAddSensorReading(t *testing.T) { }) t.Run("returns true when lidar returns an error that it reached end of dataset", func(t *testing.T) { - sensors := []string{"finished_replay_sensor"} + cam := map[string]string{"name": "finished_replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) config.Lidar = replaySensor @@ -434,15 +434,15 @@ func TestStart(t *testing.T) { config := Config{ Logger: logger, CartoFacade: &cf, - DataRateMs: 200, + DataFreqHz: 5, Timeout: 10 * time.Second, } cancelCtx, cancelFunc := context.WithCancel(context.Background()) t.Run("returns true when lidar returns an error that it reached end of dataset but the context is valid", func(t *testing.T) { - sensors := []string{"finished_replay_sensor"} + cam := map[string]string{"name": "finished_replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) config.Lidar = replaySensor @@ -452,9 +452,9 @@ func TestStart(t *testing.T) { }) t.Run("returns false when lidar returns an error that it reached end of dataset but the context was cancelled", func(t *testing.T) { - sensors := []string{"finished_replay_sensor"} + cam := map[string]string{"name": "finished_replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) test.That(t, err, test.ShouldBeNil) config.Lidar = replaySensor diff --git a/sensors/test_deps.go b/sensors/test_deps.go index c4826bc9..60f1549c 100644 --- a/sensors/test_deps.go +++ b/sensors/test_deps.go @@ -152,7 +152,7 @@ func getFinishedReplayLidar() *inject.Camera { return nil, transform.NewNoIntrinsicsError("") } cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { - return camera.Properties{}, nil + return camera.Properties{SupportsPCD: true}, nil } return cam } From a4e6284fb60128ecefc3066c5859c8ba72cacab1 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Mon, 24 Jul 2023 15:38:42 -0400 Subject: [PATCH 28/41] vc changes --- viam_cartographer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viam_cartographer.go b/viam_cartographer.go index 183e298b..0967d96f 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -193,7 +193,7 @@ func New( subAlgo: subAlgo, configParams: svcConfig.ConfigParams, dataDirectory: svcConfig.DataDirectory, - sensors: svcConfig.Sensors, + camera: svcConfig.Camera, mapRateSec: mapRateSec, cancelSensorProcessFunc: cancelSensorProcessFunc, cancelCartoFacadeFunc: cancelCartoFacadeFunc, From 01751f800156241865bcb916de69c79ddd22d995 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Tue, 25 Jul 2023 09:40:42 -0400 Subject: [PATCH 29/41] restore unnecessary change --- viam-cartographer/src/carto_facade/carto_facade.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/viam-cartographer/src/carto_facade/carto_facade.cc b/viam-cartographer/src/carto_facade/carto_facade.cc index 698ed8ca..0f30b18e 100644 --- a/viam-cartographer/src/carto_facade/carto_facade.cc +++ b/viam-cartographer/src/carto_facade/carto_facade.cc @@ -777,9 +777,17 @@ void CartoFacade::AddSensorReading(const viam_carto_sensor_reading *sr) { VLOG(1) << "AddSensorData timestamp: " << measurement.time << " measurement.ranges.size(): " << measurement.ranges.size(); map_builder.AddSensorData(measurement); - tmp_global_pose = map_builder.GetGlobalPose(); + auto local_poses = map_builder.GetLocalSlamResultPoses(); + VLOG(1) << "local_poses.size(): " << local_poses.size(); + // NOTE: The first time local_poses.size() goes positive will + // be the second time that map_builder.AddSensorData() succeeds. + // At that time the pose will still be zeroed out. + if (local_poses.size() > 0) { + update_latest_global_pose = true; + tmp_global_pose = map_builder.GetGlobalPose(local_poses.back()); + } map_builder_mutex.unlock(); - { + if (update_latest_global_pose) { std::lock_guard lk(viam_response_mutex); latest_global_pose = tmp_global_pose; } From 0241490e070aec5608c7e7d4664d3dd1dca84b9a Mon Sep 17 00:00:00 2001 From: PStrutz Date: Tue, 25 Jul 2023 09:55:27 -0400 Subject: [PATCH 30/41] lint fixes --- config/config.go | 7 +++---- config/config_test.go | 9 ++------- sensorprocess/sensorprocess.go | 7 ++----- sensors/sensors.go | 2 +- sensors/sensors_test.go | 2 -- testhelper/testhelper.go | 8 ++++---- viam_cartographer.go | 7 +++---- 7 files changed, 15 insertions(+), 27 deletions(-) diff --git a/config/config.go b/config/config.go index 27bde07c..8b6c8b56 100644 --- a/config/config.go +++ b/config/config.go @@ -30,16 +30,15 @@ func (config *Config) Validate(path string) ([]string, error) { if !ok { return nil, utils.NewConfigValidationError(path, errCameraMustHaveName) } - data_freq_hz, ok := config.Camera["data_freq_hz"] + dataFreqHz, ok := config.Camera["data_freq_hz"] if ok { - data_freq_hz, err := strconv.Atoi(data_freq_hz) + dataFreqHz, err := strconv.Atoi(dataFreqHz) if err != nil { return nil, errors.New("data_freq_hz must only contain digits") } - if data_freq_hz < 0 { + if dataFreqHz < 0 { return nil, errors.New("cannot specify data_freq_hz less than zero") } - } if config.ConfigParams["mode"] == "" { diff --git a/config/config_test.go b/config/config_test.go index ab977286..39df980c 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -50,7 +50,6 @@ func TestValidate(t *testing.T) { delete(cfgService.Attributes["config_params"].(map[string]string), "mode") _, err := newConfig(cfgService) test.That(t, err, test.ShouldBeError, newError(utils.NewConfigValidationFieldRequiredError(testCfgPath, "config_params[mode]").Error())) - }) t.Run("Config without camera name", func(t *testing.T) { @@ -146,12 +145,10 @@ func TestGetOptionalParameters(t *testing.T) { cfgService.Attributes["camera"] = map[string]string{"name": "a"} cfg, err := newConfig(cfgService) test.That(t, err, test.ShouldBeNil) - dataFreqHz, mapRateSec := GetOptionalParameters( + mapRateSec := GetOptionalParameters( cfg, 1001, - 1002, logger) - test.That(t, dataFreqHz, test.ShouldEqual, 1001) test.That(t, mapRateSec, test.ShouldEqual, 1002) }) @@ -165,12 +162,10 @@ func TestGetOptionalParameters(t *testing.T) { two := 2 cfg.MapRateSec = &two test.That(t, err, test.ShouldBeNil) - dataFreqHz, mapRateSec := GetOptionalParameters( + mapRateSec := GetOptionalParameters( cfg, 1001, - 1002, logger) - test.That(t, dataFreqHz, test.ShouldEqual, 1) test.That(t, mapRateSec, test.ShouldEqual, 2) }) } diff --git a/sensorprocess/sensorprocess.go b/sensorprocess/sensorprocess.go index bd6eef60..d4807e84 100644 --- a/sensorprocess/sensorprocess.go +++ b/sensorprocess/sensorprocess.go @@ -4,7 +4,6 @@ package sensorprocess import ( "context" "errors" - "fmt" "math" "strings" "time" @@ -99,8 +98,6 @@ func addSensorReadingFromLiveReadings(ctx context.Context, reading []byte, readi } } timeElapsedMs := int(time.Since(startTime).Milliseconds()) - fmt.Println(config.DataFreqHz) - data_rate_ms := 100 / config.DataFreqHz - fmt.Println(data_rate_ms) - return int(math.Max(0, float64(data_rate_ms-timeElapsedMs))) + dataRateMs := 100 / config.DataFreqHz + return int(math.Max(0, float64(dataRateMs-timeElapsedMs))) } diff --git a/sensors/sensors.go b/sensors/sensors.go index ee3cb95d..de115af0 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -80,7 +80,7 @@ func NewLidar( } if !properties.SupportsPCD { - return Lidar{}, errors.Errorf("configuring lidar camera error: " + + return Lidar{}, errors.New("configuring lidar camera error: " + "'camera' must support PCD") } diff --git a/sensors/sensors_test.go b/sensors/sensors_test.go index 8fe88f54..45b1835b 100644 --- a/sensors/sensors_test.go +++ b/sensors/sensors_test.go @@ -4,7 +4,6 @@ package sensors_test import ( "context" "errors" - "fmt" "testing" "time" @@ -42,7 +41,6 @@ func TestValidateGetData(t *testing.T) { lidar = map[string]string{"name": "warming_up_lidar"} warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) test.That(t, err, test.ShouldBeNil) - fmt.Println("got to here") err = s.ValidateGetData(ctx, warmingUpLidar, sensorValidationMaxTimeout, sensorValidationInterval, logger) test.That(t, err, test.ShouldBeNil) }) diff --git a/testhelper/testhelper.go b/testhelper/testhelper.go index 36bcc147..0c3645ff 100644 --- a/testhelper/testhelper.go +++ b/testhelper/testhelper.go @@ -50,13 +50,13 @@ var mockLidarPath = artifact.MustPath("viam-cartographer/mock_lidar") // SetupStubDeps returns stubbed dependencies based on the camera // the stubs fail tests if called. -func SetupStubDeps(camera_name string, t *testing.T) resource.Dependencies { +func SetupStubDeps(cameraName string, t *testing.T) resource.Dependencies { deps := make(resource.Dependencies) - switch camera_name { + switch cameraName { case "stub_lidar": - deps[camera.Named(camera_name)] = getStubLidar(t) + deps[camera.Named(cameraName)] = getStubLidar(t) default: - t.Errorf("SetupStubDeps called with unhandled camera: %s", camera_name) + t.Errorf("SetupStubDeps called with unhandled camera: %s", cameraName) } return deps diff --git a/viam_cartographer.go b/viam_cartographer.go index 0967d96f..e38b4f0c 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -392,10 +392,9 @@ type CartographerService struct { timedLidar s.TimedSensor subAlgo SubAlgo - configParams map[string]string - dataDirectory string - camera map[string]string - movementsensor map[string]string + configParams map[string]string + dataDirectory string + camera map[string]string cartofacade cartofacade.Interface cartoFacadeTimeout time.Duration From def1699b125c73ccbad23e3d95dd3251d37df25c Mon Sep 17 00:00:00 2001 From: PStrutz Date: Tue, 25 Jul 2023 11:01:01 -0400 Subject: [PATCH 31/41] resolve issues --- viam-cartographer/src/carto_facade/carto_facade.cc | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/viam-cartographer/src/carto_facade/carto_facade.cc b/viam-cartographer/src/carto_facade/carto_facade.cc index 0f30b18e..698ed8ca 100644 --- a/viam-cartographer/src/carto_facade/carto_facade.cc +++ b/viam-cartographer/src/carto_facade/carto_facade.cc @@ -777,17 +777,9 @@ void CartoFacade::AddSensorReading(const viam_carto_sensor_reading *sr) { VLOG(1) << "AddSensorData timestamp: " << measurement.time << " measurement.ranges.size(): " << measurement.ranges.size(); map_builder.AddSensorData(measurement); - auto local_poses = map_builder.GetLocalSlamResultPoses(); - VLOG(1) << "local_poses.size(): " << local_poses.size(); - // NOTE: The first time local_poses.size() goes positive will - // be the second time that map_builder.AddSensorData() succeeds. - // At that time the pose will still be zeroed out. - if (local_poses.size() > 0) { - update_latest_global_pose = true; - tmp_global_pose = map_builder.GetGlobalPose(local_poses.back()); - } + tmp_global_pose = map_builder.GetGlobalPose(); map_builder_mutex.unlock(); - if (update_latest_global_pose) { + { std::lock_guard lk(viam_response_mutex); latest_global_pose = tmp_global_pose; } From 1c2fc0d9ed109081babd41d34d1faed6d3daaabe Mon Sep 17 00:00:00 2001 From: PStrutz Date: Tue, 25 Jul 2023 11:22:56 -0400 Subject: [PATCH 32/41] small fix --- config/config_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config_test.go b/config/config_test.go index 39df980c..76010f32 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -164,7 +164,7 @@ func TestGetOptionalParameters(t *testing.T) { test.That(t, err, test.ShouldBeNil) mapRateSec := GetOptionalParameters( cfg, - 1001, + 1002, logger) test.That(t, mapRateSec, test.ShouldEqual, 2) }) From f1f8b9f1a1da8f4c24ba640bfcf6e9564d01ec24 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Tue, 25 Jul 2023 15:38:32 -0400 Subject: [PATCH 33/41] respond to comments --- cartofacade/capi.go | 4 ++-- cartofacade/testhelpers.go | 4 ++-- config/config.go | 6 +++--- config/config_test.go | 30 +++++++++++++++--------------- sensors/sensors.go | 4 ++-- viam_cartographer_test.go | 14 +++++++------- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/cartofacade/capi.go b/cartofacade/capi.go index 144f3c8c..61628d6f 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -99,7 +99,7 @@ const ( // CartoConfig contains config values from app type CartoConfig struct { - Camera map[string]string + Camera string MapRateSecond int DataDir string ComponentReference string @@ -361,7 +361,7 @@ func getConfig(cfg CartoConfig) (C.viam_carto_config, error) { } sensorSlice := unsafe.Slice(pSensor, sz) - sensorSlice[0] = goStringToBstring(cfg.Camera["name"]) + sensorSlice[0] = goStringToBstring(cfg.Camera) lidarCfg, err := toLidarConfig(cfg.LidarConfig) if err != nil { diff --git a/cartofacade/testhelpers.go b/cartofacade/testhelpers.go index f9791ffd..62de4816 100644 --- a/cartofacade/testhelpers.go +++ b/cartofacade/testhelpers.go @@ -12,7 +12,7 @@ func GetTestConfig(sensor string) (CartoConfig, string, error) { } return CartoConfig{ - Camera: map[string]string{"name": "test_lidar", "data_freq_hz": "20"}, + Camera: "test_lidar", MapRateSecond: 5, DataDir: dir, ComponentReference: "component", @@ -23,7 +23,7 @@ func GetTestConfig(sensor string) (CartoConfig, string, error) { // GetBadTestConfig gets a sample config for testing purposes that will cause a failure. func GetBadTestConfig() CartoConfig { return CartoConfig{ - Camera: map[string]string{"name": "rplidar", "data_freq_hz": "20"}, + Camera: "rplidar", LidarConfig: TwoD, } } diff --git a/config/config.go b/config/config.go index 8b6c8b56..2a0cd2b4 100644 --- a/config/config.go +++ b/config/config.go @@ -30,14 +30,14 @@ func (config *Config) Validate(path string) ([]string, error) { if !ok { return nil, utils.NewConfigValidationError(path, errCameraMustHaveName) } - dataFreqHz, ok := config.Camera["data_freq_hz"] + dataFreqHz, ok := config.Camera["data_frequency_hz"] if ok { dataFreqHz, err := strconv.Atoi(dataFreqHz) if err != nil { - return nil, errors.New("data_freq_hz must only contain digits") + return nil, errors.New("camera[data_frequency_hz] must only contain digits") } if dataFreqHz < 0 { - return nil, errors.New("cannot specify data_freq_hz less than zero") + return nil, errors.New("cannot specify camera[data_frequency_hz] less than zero") } } diff --git a/config/config_test.go b/config/config_test.go index 76010f32..bdbc21c1 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -72,27 +72,27 @@ func TestValidate(t *testing.T) { test.That(t, err, test.ShouldBeNil) }) - t.Run("Config with invalid camera data_freq_hz", func(t *testing.T) { + t.Run("Config with invalid camera data_frequency_hz", func(t *testing.T) { cfgService := makeCfgService() cfgService.Attributes["camera"] = map[string]string{ - "name": "a", - "data_freq_hz": "twenty", + "name": "a", + "data_frequency_hz": "twenty", } _, err := newConfig(cfgService) - test.That(t, err, test.ShouldBeError, newError("data_freq_hz must only contain digits")) + test.That(t, err, test.ShouldBeError, newError("data_frequency_hz must only contain digits")) }) t.Run("Config with out of range values", func(t *testing.T) { cfgService := makeCfgService() cfgService.Attributes["camera"] = map[string]string{ - "name": "a", - "data_freq_hz": "-1", + "name": "a", + "data_frequency_hz": "-1", } _, err := newConfig(cfgService) - test.That(t, err, test.ShouldBeError, newError("cannot specify data_freq_hz less than zero")) + test.That(t, err, test.ShouldBeError, newError("cannot specify data_frequency_hz less than zero")) cfgService.Attributes["camera"] = map[string]string{ - "name": "a", - "data_freq_hz": "1", + "name": "a", + "data_frequency_hz": "1", } cfgService.Attributes["map_rate_sec"] = -1 _, err = newConfig(cfgService) @@ -102,8 +102,8 @@ func TestValidate(t *testing.T) { t.Run("All parameters e2e", func(t *testing.T) { cfgService := makeCfgService() cfgService.Attributes["camera"] = map[string]string{ - "name": "a", - "data_freq_hz": "20", + "name": "a", + "data_frequency_hz": "20", } cfgService.Attributes["map_rate_sec"] = 1002 @@ -131,8 +131,8 @@ func makeCfgService() resource.Config { } cfgService.Attributes["data_dir"] = "path" cfgService.Attributes["camera"] = map[string]string{ - "name": "a", - "data_freq_hz": "20", + "name": "a", + "data_frequency_hz": "20", } return cfgService } @@ -155,8 +155,8 @@ func TestGetOptionalParameters(t *testing.T) { t.Run("Return overrides", func(t *testing.T) { cfgService := makeCfgService() cfgService.Attributes["camera"] = map[string]string{ - "name": "a", - "data_freq_hz": "1", + "name": "a", + "data_frequency_hz": "1", } cfg, err := newConfig(cfgService) two := 2 diff --git a/sensors/sensors.go b/sensors/sensors.go index de115af0..dc7670de 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -58,14 +58,14 @@ func NewLidar( } name := cam["name"] dataFreqHz := defaultDataFreqHz - dataFreqHzIn, ok := cam["data_freq_hz"] + dataFreqHzIn, ok := cam["data_frequency_hz"] if !ok { logger.Debugf("problem retrieving lidar data frequency, setting to default value of %d", defaultDataFreqHz) } else { var err error dataFreqHz, err = strconv.Atoi(dataFreqHzIn) if err != nil { - logger.Debug("data_freq_hz must only contain digits, setting to default value of %d", defaultDataFreqHz) + return Lidar{}, errors.New("camera[data_frequency_hz] must only contain digits") } } diff --git a/viam_cartographer_test.go b/viam_cartographer_test.go index d57fd903..2147ed1e 100644 --- a/viam_cartographer_test.go +++ b/viam_cartographer_test.go @@ -68,7 +68,7 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Camera: map[string]string{"name": "gibberish", "data_freq_hz": testDataFreqHz}, + Camera: map[string]string{"name": "gibberish", "data_frequency_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -87,7 +87,7 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, + Camera: map[string]string{"name": "good_lidar", "data_frequency_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -107,7 +107,7 @@ func TestNew(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Camera: map[string]string{"name": "invalid_sensor", "data_freq_hz": testDataFreqHz}, + Camera: map[string]string{"name": "invalid_sensor", "data_frequency_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -249,7 +249,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, + Camera: map[string]string{"name": "good_lidar", "data_frequency_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -269,7 +269,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Camera: map[string]string{"name": "invalid_sensor", "data_freq_hz": testDataFreqHz}, + Camera: map[string]string{"name": "invalid_sensor", "data_frequency_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -333,7 +333,7 @@ func TestNew(t *testing.T) { defer fsCleanupFunc() attrCfg := &vcConfig.Config{ - Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, + Camera: map[string]string{"name": "good_lidar", "data_frequency_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d"}, DataDirectory: dataDirectory, } @@ -440,7 +440,7 @@ func TestDoCommand(t *testing.T) { test.That(t, err, test.ShouldBeNil) attrCfg := &vcConfig.Config{ - Camera: map[string]string{"name": "good_lidar", "data_freq_hz": testDataFreqHz}, + Camera: map[string]string{"name": "good_lidar", "data_frequency_hz": testDataFreqHz}, ConfigParams: map[string]string{"mode": "2d", "test_param": "viam"}, DataDirectory: dataDirectory, MapRateSec: &testMapRateSec, From bbf95a7cd5d06974bd7c50adc719aba3e1a89eae Mon Sep 17 00:00:00 2001 From: PStrutz Date: Tue, 25 Jul 2023 15:54:46 -0400 Subject: [PATCH 34/41] fixes --- config/config.go | 4 ++-- viam-cartographer/src/carto_facade/carto_facade.cc | 11 +++-------- viam-cartographer/src/carto_facade/carto_facade.h | 6 ++---- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/config/config.go b/config/config.go index 2a0cd2b4..422fd2cb 100644 --- a/config/config.go +++ b/config/config.go @@ -26,7 +26,7 @@ var errCameraMustHaveName = errors.New("\"camera[name]\" is required") // Validate creates the list of implicit dependencies. func (config *Config) Validate(path string) ([]string, error) { - _, ok := config.Camera["name"] + cameraName, ok := config.Camera["name"] if !ok { return nil, utils.NewConfigValidationError(path, errCameraMustHaveName) } @@ -53,7 +53,7 @@ func (config *Config) Validate(path string) ([]string, error) { return nil, errors.New("cannot specify map_rate_sec less than zero") } - deps := []string{config.Camera["name"]} + deps := []string{cameraName} return deps, nil } diff --git a/viam-cartographer/src/carto_facade/carto_facade.cc b/viam-cartographer/src/carto_facade/carto_facade.cc index 698ed8ca..1a5a1b1c 100644 --- a/viam-cartographer/src/carto_facade/carto_facade.cc +++ b/viam-cartographer/src/carto_facade/carto_facade.cc @@ -111,26 +111,21 @@ void validate_lidar_config(viam_carto_LIDAR_CONFIG lidar_config) { config from_viam_carto_config(viam_carto_config vcc) { struct config c; - for (int i = 0; i < vcc.sensors_len; i++) { - c.sensors.push_back(to_std_string(vcc.sensors[i])); - } + c.camera = to_std_string(vcc.camera); c.data_dir = to_std_string(vcc.data_dir); c.map_rate_sec = std::chrono::seconds(vcc.map_rate_sec); c.lidar_config = vcc.lidar_config; - if (c.sensors.size() == 0) { - throw VIAM_CARTO_SENSORS_LIST_EMPTY; - } if (c.data_dir.size() == 0) { throw VIAM_CARTO_DATA_DIR_NOT_PROVIDED; } if (vcc.map_rate_sec < 0) { throw VIAM_CARTO_MAP_RATE_SEC_INVALID; } - if (c.sensors[0].empty()) { + if (c.camera.empty()) { throw VIAM_CARTO_COMPONENT_REFERENCE_INVALID; } validate_lidar_config(c.lidar_config); - c.component_reference = bstrcpy(vcc.sensors[0]); + c.component_reference = bstrcpy(vcc.camera); return c; }; diff --git a/viam-cartographer/src/carto_facade/carto_facade.h b/viam-cartographer/src/carto_facade/carto_facade.h index fb4fff39..e40ed16a 100644 --- a/viam-cartographer/src/carto_facade/carto_facade.h +++ b/viam-cartographer/src/carto_facade/carto_facade.h @@ -87,7 +87,6 @@ typedef enum viam_carto_LIDAR_CONFIG { #define VIAM_CARTO_LIB_PLATFORM_INVALID 5 #define VIAM_CARTO_LIB_INVALID 6 #define VIAM_CARTO_LIB_NOT_INITIALIZED 7 -#define VIAM_CARTO_SENSORS_LIST_EMPTY 8 #define VIAM_CARTO_UNKNOWN_ERROR 9 #define VIAM_CARTO_DATA_DIR_NOT_PROVIDED 10 #define VIAM_CARTO_SLAM_MODE_INVALID 11 @@ -130,8 +129,7 @@ typedef struct viam_carto_algo_config { } viam_carto_algo_config; typedef struct viam_carto_config { - bstring *sensors; - int sensors_len; + bstring camera; int map_rate_sec; bstring data_dir; viam_carto_LIDAR_CONFIG lidar_config; @@ -292,7 +290,7 @@ static const int checkForShutdownIntervalMicroseconds = 1e5; static const double resolutionMeters = 0.05; typedef struct config { - std::vector sensors; + std::string camera; std::chrono::seconds map_rate_sec; std::string data_dir; bstring component_reference; From 2fa3e284fb68cf48d1ebe1952f3f84f760373d61 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Wed, 26 Jul 2023 11:12:24 -0400 Subject: [PATCH 35/41] config fixes --- config/config.go | 18 ++- config/config_test.go | 10 +- sensorprocess/sensorprocess.go | 15 ++- sensors/sensors.go | 33 +---- testhelper/testhelper.go | 4 +- .../src/carto_facade/carto_facade_test.cc | 117 +++++------------- viam_cartographer.go | 24 ++-- viam_cartographer_internal_test.go | 8 +- 8 files changed, 83 insertions(+), 146 deletions(-) diff --git a/config/config.go b/config/config.go index 422fd2cb..b8e23c6c 100644 --- a/config/config.go +++ b/config/config.go @@ -60,8 +60,20 @@ func (config *Config) Validate(path string) ([]string, error) { // GetOptionalParameters sets any unset optional config parameters to the values passed to this function, // and returns them. -func GetOptionalParameters(config *Config, defaultMapRateSec int, logger golog.Logger, -) int { +func GetOptionalParameters(config *Config, defaultLidarDataRateMSec, defaultMapRateSec int, logger golog.Logger, +) (int, int, error) { + lidarDataRateMSec := defaultLidarDataRateMSec + strDataFreq, ok := config.Camera["data_frequency_hz"] + if !ok { + logger.Debugf("problem retrieving lidar data frequency, setting to default value of %d", 1000/defaultLidarDataRateMSec) + } else { + lidarDataFreqHz, err := strconv.Atoi(strDataFreq) + if err != nil { + return 0, 0, errors.New("camera[data_frequency_hz] must only contain digits") + } + lidarDataRateMSec = 1000 / lidarDataFreqHz + } + mapRateSec := 0 if config.MapRateSec == nil { logger.Debugf("no map_rate_sec given, setting to default value of %d", defaultMapRateSec) @@ -70,5 +82,5 @@ func GetOptionalParameters(config *Config, defaultMapRateSec int, logger golog.L mapRateSec = *config.MapRateSec } - return mapRateSec + return lidarDataRateMSec, mapRateSec, nil } diff --git a/config/config_test.go b/config/config_test.go index bdbc21c1..91cd7c5f 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -145,11 +145,13 @@ func TestGetOptionalParameters(t *testing.T) { cfgService.Attributes["camera"] = map[string]string{"name": "a"} cfg, err := newConfig(cfgService) test.That(t, err, test.ShouldBeNil) - mapRateSec := GetOptionalParameters( + lidarDataRateMSec, mapRateSec, err := GetOptionalParameters( cfg, - 1001, + 1000, + 1002, logger) test.That(t, mapRateSec, test.ShouldEqual, 1002) + test.That(t, mapRateSec, test.ShouldEqual, 1) }) t.Run("Return overrides", func(t *testing.T) { @@ -161,9 +163,11 @@ func TestGetOptionalParameters(t *testing.T) { cfg, err := newConfig(cfgService) two := 2 cfg.MapRateSec = &two + cfg.lidarDataRateMSec = &two test.That(t, err, test.ShouldBeNil) - mapRateSec := GetOptionalParameters( + lidarDataRateMSec, mapRateSec, err := GetOptionalParameters( cfg, + 1000, 1002, logger) test.That(t, mapRateSec, test.ShouldEqual, 2) diff --git a/sensorprocess/sensorprocess.go b/sensorprocess/sensorprocess.go index d4807e84..e3c8f160 100644 --- a/sensorprocess/sensorprocess.go +++ b/sensorprocess/sensorprocess.go @@ -17,12 +17,12 @@ import ( // Config holds config needed throughout the process of adding a sensor reading to the cartofacade. type Config struct { - CartoFacade cartofacade.Interface - Lidar sensors.TimedSensor - LidarName string - DataFreqHz int - Timeout time.Duration - Logger golog.Logger + CartoFacade cartofacade.Interface + Lidar sensors.TimedSensor + LidarName string + LidarDataRateMSec int + Timeout time.Duration + Logger golog.Logger } // Start polls the lidar to get the next sensor reading and adds it to the cartofacade. @@ -98,6 +98,5 @@ func addSensorReadingFromLiveReadings(ctx context.Context, reading []byte, readi } } timeElapsedMs := int(time.Since(startTime).Milliseconds()) - dataRateMs := 100 / config.DataFreqHz - return int(math.Max(0, float64(dataRateMs-timeElapsedMs))) + return int(math.Max(0, float64(config.LidarDataRateMSec-timeElapsedMs))) } diff --git a/sensors/sensors.go b/sensors/sensors.go index dc7670de..309896f5 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -4,7 +4,6 @@ package sensors import ( "bytes" "context" - "strconv" "time" "github.com/edaniels/golog" @@ -44,39 +43,20 @@ type TimedSensor interface { func NewLidar( ctx context.Context, deps resource.Dependencies, - cam map[string]string, + cameraName string, logger golog.Logger, ) (Lidar, error) { _, span := trace.StartSpan(ctx, "viamcartographer::sensors::NewLidar") defer span.End() - // An empty camera field is allowed in offline mode. - _, ok := cam["name"] - if !ok { - logger.Debug("no camera provided in 'camera' config parameter") - return Lidar{}, nil - } - name := cam["name"] - dataFreqHz := defaultDataFreqHz - dataFreqHzIn, ok := cam["data_frequency_hz"] - if !ok { - logger.Debugf("problem retrieving lidar data frequency, setting to default value of %d", defaultDataFreqHz) - } else { - var err error - dataFreqHz, err = strconv.Atoi(dataFreqHzIn) - if err != nil { - return Lidar{}, errors.New("camera[data_frequency_hz] must only contain digits") - } - } - - newLidar, err := camera.FromDependencies(deps, name) + newLidar, err := camera.FromDependencies(deps, cameraName) if err != nil { - return Lidar{}, errors.Wrapf(err, "error getting lidar camera %v for slam service", name) + return Lidar{}, errors.Wrapf(err, "error getting lidar camera %v for slam service", cameraName) } // If there is a camera provided in the 'camera' field, we enforce that it supports PCD. properties, err := newLidar.Properties(ctx) if err != nil { - return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", name) + return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", cameraName) } if !properties.SupportsPCD { @@ -85,9 +65,8 @@ func NewLidar( } return Lidar{ - Name: name, - lidar: newLidar, - dataFreqHz: dataFreqHz, + Name: cameraName, + lidar: newLidar, }, nil } diff --git a/testhelper/testhelper.go b/testhelper/testhelper.go index 0c3645ff..b6c7a089 100644 --- a/testhelper/testhelper.go +++ b/testhelper/testhelper.go @@ -320,6 +320,6 @@ func InitInternalState(t *testing.T) (string, func()) { // CreateTimestampFilename creates an absolute filename with a primary sensor name and timestamp written // into the filename. -func CreateTimestampFilename(dataDirectory, primarySensorName, fileType string, timeStamp time.Time) string { - return filepath.Join(dataDirectory, primarySensorName+"_data_"+timeStamp.UTC().Format(SlamTimeFormat)+fileType) +func CreateTimestampFilename(dataDirectory, lidarName, fileType string, timeStamp time.Time) string { + return filepath.Join(dataDirectory, lidarName+"_data_"+timeStamp.UTC().Format(SlamTimeFormat)+fileType) } diff --git a/viam-cartographer/src/carto_facade/carto_facade_test.cc b/viam-cartographer/src/carto_facade/carto_facade_test.cc index 04eea2bd..9680f09a 100644 --- a/viam-cartographer/src/carto_facade/carto_facade_test.cc +++ b/viam-cartographer/src/carto_facade/carto_facade_test.cc @@ -30,30 +30,18 @@ namespace viam { namespace carto_facade { viam_carto_config viam_carto_config_setup( int map_rate_sec, viam_carto_LIDAR_CONFIG lidar_config, - std::string data_dir, std::vector sensors_vec) { + std::string data_dir, std::string camera) { struct viam_carto_config vcc; vcc.map_rate_sec = map_rate_sec; vcc.lidar_config = lidar_config; vcc.data_dir = bfromcstr(data_dir.c_str()); - bstring *sensors = - (bstring *)malloc(sizeof(bstring *) * sensors_vec.size()); - BOOST_TEST(sensors != nullptr); - int i = 0; - for (auto &&s : sensors_vec) { - sensors[i] = bfromcstr(s.c_str()); - i++; - } - vcc.sensors_len = sensors_vec.size(); - vcc.sensors = sensors; + vcc.camera = bfromcstr(camera.c_str()); return vcc; } void viam_carto_config_teardown(viam_carto_config vcc) { BOOST_TEST(bdestroy(vcc.data_dir) == BSTR_OK); - for (int i = 0; i < vcc.sensors_len; i++) { - BOOST_TEST(bdestroy(vcc.sensors[i]) == BSTR_OK); - } - free(vcc.sensors); + BOOST_TEST(bdestroy(vcc.camera) == BSTR_OK); } viam_carto_sensor_reading new_test_sensor_reading( std::string sensor, std::string pcd_path, @@ -119,47 +107,35 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); viam_carto *vc; - std::vector empty_sensors_vec; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); - struct viam_carto_config vcc_no_sensors = viam_carto_config_setup( - 1, VIAM_CARTO_THREE_D, tmp_dir.string(), empty_sensors_vec); struct viam_carto_algo_config ac = viam_carto_algo_config_setup(); - BOOST_TEST(viam_carto_init(&vc, lib, vcc_no_sensors, ac) == - VIAM_CARTO_SENSORS_LIST_EMPTY); - - std::vector sensors_vec; - sensors_vec.push_back("sensor_1"); - sensors_vec.push_back("sensor_2"); - sensors_vec.push_back("sensor_3"); - sensors_vec.push_back("sensor_4"); - sensors_vec.push_back("sensor_5"); + std::string camera = "lidar"; struct viam_carto_config vcc_empty_data_dir = - viam_carto_config_setup(1, VIAM_CARTO_THREE_D, "", sensors_vec); + viam_carto_config_setup(1, VIAM_CARTO_THREE_D, "", camera); BOOST_TEST(viam_carto_init(&vc, lib, vcc_empty_data_dir, ac) == VIAM_CARTO_DATA_DIR_NOT_PROVIDED); - std::vector sensors_vec2; - sensors_vec2.push_back(""); - sensors_vec2.push_back("sensor_2"); + std::string camera2 = ""; + struct viam_carto_config vcc_empty_component_ref = viam_carto_config_setup( - 1, VIAM_CARTO_THREE_D, tmp_dir.string(), sensors_vec2); + 1, VIAM_CARTO_THREE_D, tmp_dir.string(), camera2); BOOST_TEST(viam_carto_init(&vc, lib, vcc_empty_component_ref, ac) == VIAM_CARTO_COMPONENT_REFERENCE_INVALID); struct viam_carto_config vcc_invalid_map_rate_sec = viam_carto_config_setup( - -1, VIAM_CARTO_THREE_D, tmp_dir.string(), sensors_vec); + -1, VIAM_CARTO_THREE_D, tmp_dir.string(), camera); BOOST_TEST(viam_carto_init(&vc, lib, vcc_invalid_map_rate_sec, ac) == VIAM_CARTO_MAP_RATE_SEC_INVALID); struct viam_carto_config vcc_invalid_lidar_config = viam_carto_config_setup(1, static_cast(-1), - tmp_dir.string(), sensors_vec); + tmp_dir.string(), camera); BOOST_TEST(viam_carto_init(&vc, lib, vcc_invalid_lidar_config, ac) == VIAM_CARTO_LIDAR_CONFIG_INVALID); @@ -168,7 +144,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { fs::create_directories(deprecated_path.string() + "/data"); struct viam_carto_config vcc_deprecated_path = viam_carto_config_setup( - 1, VIAM_CARTO_THREE_D, deprecated_path.string(), sensors_vec); + 1, VIAM_CARTO_THREE_D, deprecated_path.string(), camera); BOOST_TEST(viam_carto_init(&vc, lib, vcc_deprecated_path, ac) == VIAM_CARTO_DATA_DIR_INVALID_DEPRECATED_STRUCTURE); @@ -177,13 +153,12 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { struct viam_carto_config vcc_invalid_path = viam_carto_config_setup(1, VIAM_CARTO_THREE_D, invalid_path.string(), - - sensors_vec); + camera); BOOST_TEST(viam_carto_init(&vc, lib, vcc_invalid_path, ac) == VIAM_CARTO_DATA_DIR_FILE_SYSTEM_ERROR); struct viam_carto_config vcc = viam_carto_config_setup( - 1, VIAM_CARTO_THREE_D, tmp_dir.string(), sensors_vec); + 1, VIAM_CARTO_THREE_D, tmp_dir.string(), camera); BOOST_TEST(viam_carto_init(nullptr, lib, vcc, ac) == VIAM_CARTO_VC_INVALID); BOOST_TEST(viam_carto_init(nullptr, nullptr, vcc, ac) == @@ -203,7 +178,6 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { // can't terminate a carto instance that has already been terminated BOOST_TEST(viam_carto_terminate(&vc) == VIAM_CARTO_VC_INVALID); - viam_carto_config_teardown(vcc_no_sensors); viam_carto_config_teardown(vcc_empty_data_dir); viam_carto_config_teardown(vcc_empty_component_ref); viam_carto_config_teardown(vcc_invalid_map_rate_sec); @@ -223,15 +197,9 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_derive_slam_mode) { viam_carto_lib *lib; BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); - std::vector empty_sensors_vec; + std::string camera = "lidar"; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); - std::vector sensors_vec; - sensors_vec.push_back("sensor_1"); - sensors_vec.push_back("sensor_2"); - sensors_vec.push_back("sensor_3"); - sensors_vec.push_back("sensor_4"); - sensors_vec.push_back("sensor_5"); struct viam_carto_algo_config ac = viam_carto_algo_config_setup(); fs::create_directory(tmp_dir); @@ -240,7 +208,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_derive_slam_mode) { viam_carto *vc1; auto mapping_dir = tmp_dir / fs::path("mapping_dir"); struct viam_carto_config vcc_mapping = viam_carto_config_setup( - 1, VIAM_CARTO_THREE_D, mapping_dir.string(), sensors_vec); + 1, VIAM_CARTO_THREE_D, mapping_dir.string(), camera); BOOST_TEST(viam_carto_init(&vc1, lib, vcc_mapping, ac) == VIAM_CARTO_SUCCESS); BOOST_TEST(vc1->slam_mode == VIAM_CARTO_SLAM_MODE_MAPPING); @@ -300,7 +268,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_derive_slam_mode) { viam_carto *vc2; struct viam_carto_config vcc_updating = viam_carto_config_setup( - 1, VIAM_CARTO_THREE_D, updating_dir.string(), sensors_vec); + 1, VIAM_CARTO_THREE_D, updating_dir.string(), camera); BOOST_TEST(viam_carto_init(&vc2, lib, vcc_updating, ac) == VIAM_CARTO_SUCCESS); BOOST_TEST(vc2->slam_mode == VIAM_CARTO_SLAM_MODE_UPDATING); @@ -340,7 +308,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_derive_slam_mode) { // updating optimize_on_start viam_carto *vc3; struct viam_carto_config vcc_updating = viam_carto_config_setup( - 1, VIAM_CARTO_THREE_D, updating_dir.string(), sensors_vec); + 1, VIAM_CARTO_THREE_D, updating_dir.string(), camera); BOOST_TEST(viam_carto_init(&vc3, lib, vcc_updating, ac_optimize_on_start) == VIAM_CARTO_SUCCESS); @@ -356,7 +324,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_derive_slam_mode) { // localizing viam_carto *vc4; struct viam_carto_config vcc_localizing = viam_carto_config_setup( - 0, VIAM_CARTO_THREE_D, updating_dir.string(), sensors_vec); + 0, VIAM_CARTO_THREE_D, updating_dir.string(), camera); BOOST_TEST(viam_carto_init(&vc4, lib, vcc_localizing, ac) == VIAM_CARTO_SUCCESS); BOOST_TEST(vc4->slam_mode == VIAM_CARTO_SLAM_MODE_LOCALIZING); @@ -389,7 +357,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_derive_slam_mode) { // localizing optimize_on_start viam_carto *vc5; struct viam_carto_config vcc_localizing = viam_carto_config_setup( - 0, VIAM_CARTO_THREE_D, updating_dir.string(), sensors_vec); + 0, VIAM_CARTO_THREE_D, updating_dir.string(), camera); BOOST_TEST(viam_carto_init(&vc5, lib, vcc_localizing, ac_optimize_on_start) == VIAM_CARTO_SUCCESS); BOOST_TEST(vc5->slam_mode == VIAM_CARTO_SLAM_MODE_LOCALIZING); @@ -406,7 +374,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_derive_slam_mode) { ; viam_carto *vc6; struct viam_carto_config vcc_invalid = viam_carto_config_setup( - 0, VIAM_CARTO_THREE_D, empty_dir.string(), sensors_vec); + 0, VIAM_CARTO_THREE_D, empty_dir.string(), camera); BOOST_TEST(viam_carto_init(&vc6, lib, vcc_invalid, ac) == VIAM_CARTO_SLAM_MODE_INVALID); viam_carto_config_teardown(vcc_invalid); @@ -424,16 +392,11 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_terminate) { BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); viam_carto *vc; - std::vector sensors_vec; - sensors_vec.push_back("sensor_1"); - sensors_vec.push_back("sensor_2"); - sensors_vec.push_back("sensor_3"); - sensors_vec.push_back("sensor_4"); - sensors_vec.push_back("sensor_5"); + std::string camera = "lidar"; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); struct viam_carto_config vcc = viam_carto_config_setup( - 1, VIAM_CARTO_THREE_D, tmp_dir.string(), sensors_vec); + 1, VIAM_CARTO_THREE_D, tmp_dir.string(), camera); struct viam_carto_algo_config ac = viam_carto_algo_config_setup(); BOOST_TEST(viam_carto_init(&vc, lib, vcc, ac) == VIAM_CARTO_SUCCESS); BOOST_TEST(vc->slam_mode == VIAM_CARTO_SLAM_MODE_MAPPING); @@ -457,7 +420,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_terminate) { BOOST_TEST((cf->path_to_internal_state) == path_to_internal_state.string()); BOOST_TEST(((cf->state) == CartoFacadeState::IO_INITIALIZED)); - BOOST_TEST((cf->config.sensors) == sensors_vec); + BOOST_TEST((cf->config.camera) == camera); BOOST_TEST((cf->config.map_rate_sec).count() == 1); BOOST_TEST((cf->config.data_dir) == tmp_dir.string()); BOOST_TEST(to_std_string(cf->config.component_reference) == "sensor_1"); @@ -478,18 +441,13 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { // Setup viam_carto *vc; - std::vector sensors_vec; - sensors_vec.push_back("sensor_1"); - sensors_vec.push_back("sensor_2"); - sensors_vec.push_back("sensor_3"); - sensors_vec.push_back("sensor_4"); - sensors_vec.push_back("sensor_5"); + std::string camera = "lidar"; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); struct viam_carto_config vcc = viam_carto_config_setup(60, VIAM_CARTO_THREE_D, tmp_dir.string(), - sensors_vec); + camera); struct viam_carto_algo_config ac = viam_carto_algo_config_setup(); BOOST_TEST(viam_carto_init(&vc, lib, vcc, ac) == VIAM_CARTO_SUCCESS); @@ -920,18 +878,13 @@ BOOST_AUTO_TEST_CASE(CartoFacade_config) { viam_carto_lib *lib; BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); - std::vector sensors_vec; - sensors_vec.push_back("sensor_1"); - sensors_vec.push_back("sensor_2"); - sensors_vec.push_back("sensor_3"); - sensors_vec.push_back("sensor_4"); - sensors_vec.push_back("sensor_5"); + std::string camera = "lidar"; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); struct viam_carto_config vcc = viam_carto_config_setup(1, VIAM_CARTO_THREE_D, tmp_dir.string(), - sensors_vec); + camera); struct config c = viam::carto_facade::from_viam_carto_config(vcc); @@ -939,12 +892,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_config) { BOOST_TEST(c.data_dir == tmp_dir.string()); BOOST_TEST(c.lidar_config == VIAM_CARTO_THREE_D); BOOST_TEST(c.map_rate_sec.count() == 1); - BOOST_TEST(c.sensors.size() == 5); - BOOST_TEST(c.sensors[0] == "sensor_1"); - BOOST_TEST(c.sensors[1] == "sensor_2"); - BOOST_TEST(c.sensors[2] == "sensor_3"); - BOOST_TEST(c.sensors[3] == "sensor_4"); - BOOST_TEST(c.sensors[4] == "sensor_5"); + BOOST_TEST(c.camera == "lidar"); viam_carto_config_teardown(vcc); BOOST_TEST(bdestroy(c.component_reference) == BSTR_OK); @@ -965,18 +913,13 @@ BOOST_AUTO_TEST_CASE(CartoFacade_start_stop) { // Setup viam_carto *vc; - std::vector sensors_vec; - sensors_vec.push_back("sensor_1"); - sensors_vec.push_back("sensor_2"); - sensors_vec.push_back("sensor_3"); - sensors_vec.push_back("sensor_4"); - sensors_vec.push_back("sensor_5"); + std::string camera = "lidar"; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); struct viam_carto_config vcc = viam_carto_config_setup(1, VIAM_CARTO_THREE_D, tmp_dir.string(), - sensors_vec); + camera); struct viam_carto_algo_config ac = viam_carto_algo_config_setup(); BOOST_TEST(viam_carto_init(&vc, lib, vcc, ac) == VIAM_CARTO_SUCCESS); diff --git a/viam_cartographer.go b/viam_cartographer.go index e38b4f0c..57be1f86 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -117,12 +117,12 @@ func TerminateCartoLib() error { func initSensorProcess(cancelCtx context.Context, cartoSvc *CartographerService) { spConfig := sensorprocess.Config{ - CartoFacade: cartoSvc.cartofacade, - Lidar: cartoSvc.timedLidar, - LidarName: cartoSvc.primarySensorName, - DataFreqHz: cartoSvc.dataFreqHz, - Timeout: cartoSvc.cartoFacadeTimeout, - Logger: cartoSvc.logger, + CartoFacade: cartoSvc.cartofacade, + Lidar: cartoSvc.timedLidar, + LidarName: cartoSvc.lidarName, + LidarDataRateMSec: cartoSvc.lidarDataRateMSec, + Timeout: cartoSvc.cartoFacadeTimeout, + Logger: cartoSvc.logger, } cartoSvc.sensorProcessWorkers.Add(1) @@ -187,7 +187,7 @@ func New( // Cartographer SLAM Service Object cartoSvc := &CartographerService{ Named: c.ResourceName().AsNamed(), - primarySensorName: lidar.Name, + lidarName: lidar.Name, lidar: lidar, timedLidar: timedSensor, subAlgo: subAlgo, @@ -332,10 +332,10 @@ func initCartoFacade(ctx context.Context, cartoSvc *CartographerService) error { } cartoCfg := cartofacade.CartoConfig{ - Camera: cartoSvc.camera, + Camera: cartoSvc.camera["name"], MapRateSecond: cartoSvc.mapRateSec, DataDir: cartoSvc.dataDirectory, - ComponentReference: cartoSvc.primarySensorName, + ComponentReference: cartoSvc.lidarName, LidarConfig: cartofacade.TwoD, } @@ -387,7 +387,8 @@ type CartographerService struct { mu sync.Mutex SlamMode cartofacade.SlamMode closed bool - primarySensorName string + lidarName string + lidarDataRateMSec int lidar s.Lidar timedLidar s.TimedSensor subAlgo SubAlgo @@ -399,7 +400,6 @@ type CartographerService struct { cartofacade cartofacade.Interface cartoFacadeTimeout time.Duration - dataFreqHz int mapRateSec int cancelSensorProcessFunc func() @@ -438,7 +438,7 @@ func (cartoSvc *CartographerService) GetPosition(ctx context.Context) (spatialma "kmag": pos.Kmag, }, } - return CheckQuaternionFromClientAlgo(pose, cartoSvc.primarySensorName, returnedExt) + return CheckQuaternionFromClientAlgo(pose, cartoSvc.lidarName, returnedExt) } // GetPointCloudMap creates a request, recording the time, calls the slam algorithms GetPointCloudMap endpoint and returns a callback diff --git a/viam_cartographer_internal_test.go b/viam_cartographer_internal_test.go index 448a591f..38b74d6d 100644 --- a/viam_cartographer_internal_test.go +++ b/viam_cartographer_internal_test.go @@ -92,7 +92,7 @@ func TestGetPositionEndpoint(t *testing.T) { var inputQuat map[string]interface{} t.Run("empty component reference success", func(t *testing.T) { - svc.primarySensorName = "" + svc.lidarName = "" inputPose = commonv1.Pose{X: 0, Y: 0, Z: 0, OX: 0, OY: 0, OZ: 1, Theta: 0} inputQuat = map[string]interface{}{"real": 1.0, "imag": 0.0, "jmag": 0.0, "kmag": 0.0} @@ -100,7 +100,7 @@ func TestGetPositionEndpoint(t *testing.T) { }) t.Run("origin pose success", func(t *testing.T) { - svc.primarySensorName = "primarySensor1" + svc.lidarName = "primarySensor1" inputPose = commonv1.Pose{X: 0, Y: 0, Z: 0, OX: 0, OY: 0, OZ: 1, Theta: 0} inputQuat = map[string]interface{}{"real": 1.0, "imag": 0.0, "jmag": 0.0, "kmag": 0.0} @@ -108,7 +108,7 @@ func TestGetPositionEndpoint(t *testing.T) { }) t.Run("non origin pose success", func(t *testing.T) { - svc.primarySensorName = "primarySensor2" + svc.lidarName = "primarySensor2" inputPose = commonv1.Pose{X: 5, Y: 5, Z: 5, OX: 0, OY: 0, OZ: 1, Theta: 0} inputQuat = map[string]interface{}{"real": 1.0, "imag": 1.0, "jmag": 0.0, "kmag": 0.0} @@ -116,7 +116,7 @@ func TestGetPositionEndpoint(t *testing.T) { }) t.Run("error case", func(t *testing.T) { - svc.primarySensorName = "primarySensor3" + svc.lidarName = "primarySensor3" mockCartoFacade.GetPositionFunc = func( ctx context.Context, timeout time.Duration, From de90d371f8dae38411243fd7c0b09c8b28c11a88 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Wed, 26 Jul 2023 13:07:57 -0400 Subject: [PATCH 36/41] clean up config test --- config/config_test.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/config/config_test.go b/config/config_test.go index 91cd7c5f..78b158d6 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -150,8 +150,9 @@ func TestGetOptionalParameters(t *testing.T) { 1000, 1002, logger) + test.That(t, err, test.ShouldBeNil) test.That(t, mapRateSec, test.ShouldEqual, 1002) - test.That(t, mapRateSec, test.ShouldEqual, 1) + test.That(t, lidarDataRateMSec, test.ShouldEqual, 1) }) t.Run("Return overrides", func(t *testing.T) { @@ -163,14 +164,16 @@ func TestGetOptionalParameters(t *testing.T) { cfg, err := newConfig(cfgService) two := 2 cfg.MapRateSec = &two - cfg.lidarDataRateMSec = &two + cfg.Camera["data_frequency_hz"] = "2000" test.That(t, err, test.ShouldBeNil) lidarDataRateMSec, mapRateSec, err := GetOptionalParameters( cfg, 1000, 1002, logger) + test.That(t, err, test.ShouldBeNil) test.That(t, mapRateSec, test.ShouldEqual, 2) + test.That(t, lidarDataRateMSec, test.ShouldEqual, 2) }) } From 36cc0a3ec4f158281f0feb15c2d5cd5404d3048d Mon Sep 17 00:00:00 2001 From: PStrutz Date: Wed, 26 Jul 2023 13:55:51 -0400 Subject: [PATCH 37/41] should work now --- config/config.go | 4 +- sensorprocess/sensorprocess_test.go | 62 +++++++++---------- sensors/sensors.go | 9 +-- sensors/sensors_test.go | 30 ++++----- sensors/test_deps.go | 18 +++--- testhelper/testhelper.go | 2 +- .../src/carto_facade/carto_facade_test.cc | 19 +++--- viam_cartographer.go | 12 ++-- 8 files changed, 77 insertions(+), 79 deletions(-) diff --git a/config/config.go b/config/config.go index b8e23c6c..dbdc9a9f 100644 --- a/config/config.go +++ b/config/config.go @@ -63,11 +63,11 @@ func (config *Config) Validate(path string) ([]string, error) { func GetOptionalParameters(config *Config, defaultLidarDataRateMSec, defaultMapRateSec int, logger golog.Logger, ) (int, int, error) { lidarDataRateMSec := defaultLidarDataRateMSec - strDataFreq, ok := config.Camera["data_frequency_hz"] + strCameraDataFreqHz, ok := config.Camera["data_frequency_hz"] if !ok { logger.Debugf("problem retrieving lidar data frequency, setting to default value of %d", 1000/defaultLidarDataRateMSec) } else { - lidarDataFreqHz, err := strconv.Atoi(strDataFreq) + lidarDataFreqHz, err := strconv.Atoi(strCameraDataFreqHz) if err != nil { return 0, 0, errors.New("camera[data_frequency_hz] must only contain digits") } diff --git a/sensorprocess/sensorprocess_test.go b/sensorprocess/sensorprocess_test.go index c81883c3..9fbbb715 100644 --- a/sensorprocess/sensorprocess_test.go +++ b/sensorprocess/sensorprocess_test.go @@ -41,11 +41,11 @@ func TestAddSensorReadingReplaySensor(t *testing.T) { readingTimestamp := time.Now().UTC() cf := cartofacade.Mock{} config := Config{ - Logger: logger, - CartoFacade: &cf, - LidarName: "good_lidar", - DataFreqHz: 5, - Timeout: 10 * time.Second, + Logger: logger, + CartoFacade: &cf, + LidarName: "good_lidar", + LidarDataRateMSec: 200, + Timeout: 10 * time.Second, } t.Run("When addSensorReading returns successfully, no infinite loop", func(t *testing.T) { cf.AddSensorReadingFunc = func( @@ -138,11 +138,11 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { reading := []byte("12345") readingTimestamp := time.Now().UTC() config := Config{ - Logger: logger, - CartoFacade: &cf, - LidarName: "good_lidar", - DataFreqHz: 5, - Timeout: 10 * time.Second, + Logger: logger, + CartoFacade: &cf, + LidarName: "good_lidar", + LidarDataRateMSec: 200, + Timeout: 10 * time.Second, } t.Run("When AddSensorReading blocks for more than the DataFreqHz and succeeds, time to sleep is 0", func(t *testing.T) { @@ -206,7 +206,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { timeToSleep := addSensorReadingFromLiveReadings(context.Background(), reading, readingTimestamp, config) test.That(t, timeToSleep, test.ShouldBeGreaterThan, 0) - test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, 100/config.DataFreqHz) + test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, config.LidarDataRateMSec) }) t.Run("AddSensorReading faster than the DataFreqHz and returns lock error, time to sleep is <= DataFreqHz", func(t *testing.T) { @@ -222,7 +222,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { timeToSleep := addSensorReadingFromLiveReadings(context.Background(), reading, readingTimestamp, config) test.That(t, timeToSleep, test.ShouldBeGreaterThan, 0) - test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, 100/config.DataFreqHz) + test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, config.LidarDataRateMSec) }) t.Run("AddSensorReading faster than DataFreqHz and returns unexpected error, time to sleep is <= DataFreqHz", func(t *testing.T) { @@ -238,7 +238,7 @@ func TestAddSensorReadingLiveReadings(t *testing.T) { timeToSleep := addSensorReadingFromLiveReadings(context.Background(), reading, readingTimestamp, config) test.That(t, timeToSleep, test.ShouldBeGreaterThan, 0) - test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, 100/config.DataFreqHz) + test.That(t, timeToSleep, test.ShouldBeLessThanOrEqualTo, config.LidarDataRateMSec) }) } @@ -247,10 +247,10 @@ func invalidSensorTestHelper( t *testing.T, cartoFacadeMock cartofacade.Mock, config Config, - cam map[string]string, + cameraName string, ) { logger := golog.NewTestLogger(t) - sensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) + sensor, err := s.NewLidar(context.Background(), s.SetupDeps(cameraName), cameraName, logger) test.That(t, err, test.ShouldBeNil) var calls []addSensorReadingArgs @@ -283,10 +283,10 @@ func TestAddSensorReading(t *testing.T) { cf := cartofacade.Mock{} config := Config{ - Logger: logger, - CartoFacade: &cf, - DataFreqHz: 5, - Timeout: 10 * time.Second, + Logger: logger, + CartoFacade: &cf, + LidarDataRateMSec: 200, + Timeout: 10 * time.Second, } ctx := context.Background() @@ -297,7 +297,7 @@ func TestAddSensorReading(t *testing.T) { t, cf, config, - cam, + cam["name"], ) }) @@ -308,14 +308,14 @@ func TestAddSensorReading(t *testing.T) { t, cf, config, - cam, + cam["name"], ) }) t.Run("replay sensor adds sensor data until success", func(t *testing.T) { cam := map[string]string{"name": "replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam["name"]), cam["name"], logger) test.That(t, err, test.ShouldBeNil) var calls []addSensorReadingArgs @@ -359,9 +359,9 @@ func TestAddSensorReading(t *testing.T) { }) t.Run("live sensor adds sensor reading once and ignores errors", func(t *testing.T) { - sensors := map[string]string{"name": "good_lidar"} + cam := map[string]string{"name": "good_lidar"} logger := golog.NewTestLogger(t) - liveSensor, err := s.NewLidar(context.Background(), s.SetupDeps(sensors), sensors, logger) + liveSensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam["name"]), cam["name"], logger) test.That(t, err, test.ShouldBeNil) var calls []addSensorReadingArgs @@ -417,7 +417,7 @@ func TestAddSensorReading(t *testing.T) { t.Run("returns true when lidar returns an error that it reached end of dataset", func(t *testing.T) { cam := map[string]string{"name": "finished_replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam["name"]), cam["name"], logger) test.That(t, err, test.ShouldBeNil) config.Lidar = replaySensor @@ -432,17 +432,17 @@ func TestStart(t *testing.T) { cf := cartofacade.Mock{} config := Config{ - Logger: logger, - CartoFacade: &cf, - DataFreqHz: 5, - Timeout: 10 * time.Second, + Logger: logger, + CartoFacade: &cf, + LidarDataRateMSec: 200, + Timeout: 10 * time.Second, } cancelCtx, cancelFunc := context.WithCancel(context.Background()) t.Run("returns true when lidar returns an error that it reached end of dataset but the context is valid", func(t *testing.T) { cam := map[string]string{"name": "finished_replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam["name"]), cam["name"], logger) test.That(t, err, test.ShouldBeNil) config.Lidar = replaySensor @@ -454,7 +454,7 @@ func TestStart(t *testing.T) { t.Run("returns false when lidar returns an error that it reached end of dataset but the context was cancelled", func(t *testing.T) { cam := map[string]string{"name": "finished_replay_lidar"} logger := golog.NewTestLogger(t) - replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam), cam, logger) + replaySensor, err := s.NewLidar(context.Background(), s.SetupDeps(cam["name"]), cam["name"], logger) test.That(t, err, test.ShouldBeNil) config.Lidar = replaySensor diff --git a/sensors/sensors.go b/sensors/sensors.go index 309896f5..10ec921e 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -16,15 +16,10 @@ import ( goutils "go.viam.com/utils" ) -const ( - defaultDataFreqHz = 20 -) - // Lidar represents a LIDAR sensor. type Lidar struct { - Name string - lidar camera.Camera - dataFreqHz int + Name string + lidar camera.Camera } // TimedSensorReadingResponse represents a sensor reading with a time & allows the caller to know if the reading is from a replay sensor. diff --git a/sensors/sensors_test.go b/sensors/sensors_test.go index 45b1835b..adec9267 100644 --- a/sensors/sensors_test.go +++ b/sensors/sensors_test.go @@ -18,15 +18,15 @@ func TestValidateGetData(t *testing.T) { ctx := context.Background() lidar := map[string]string{"name": "good_lidar"} - goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar["name"]), lidar["name"], logger) test.That(t, err, test.ShouldBeNil) lidar = map[string]string{"name": "invalid_lidar"} - invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar["name"]), lidar["name"], logger) test.That(t, err, test.ShouldBeNil) lidar = map[string]string{"name": "np_pcd_camera"} - _, err = s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + _, err = s.NewLidar(ctx, s.SetupDeps(lidar["name"]), lidar["name"], logger) test.That(t, err, test.ShouldBeError, errors.New("configuring lidar camera error: 'camera' must support PCD")) sensorValidationMaxTimeout := time.Duration(50) * time.Millisecond @@ -39,7 +39,7 @@ func TestValidateGetData(t *testing.T) { t.Run("returns nil if a lidar reading succeeds within the timeout", func(t *testing.T) { lidar = map[string]string{"name": "warming_up_lidar"} - warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar["name"]), lidar["name"], logger) test.That(t, err, test.ShouldBeNil) err = s.ValidateGetData(ctx, warmingUpLidar, sensorValidationMaxTimeout, sensorValidationInterval, logger) test.That(t, err, test.ShouldBeNil) @@ -55,7 +55,7 @@ func TestValidateGetData(t *testing.T) { cancelFunc() lidar = map[string]string{"name": "warming_up_lidar"} - warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + warmingUpLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar["name"]), lidar["name"], logger) test.That(t, err, test.ShouldBeNil) err = s.ValidateGetData(cancelledCtx, warmingUpLidar, sensorValidationMaxTimeout, sensorValidationInterval, logger) @@ -68,8 +68,8 @@ func TestNewLidar(t *testing.T) { t.Run("No sensor provided", func(t *testing.T) { lidar := map[string]string{} - deps := s.SetupDeps(lidar) - actualLidar, err := s.NewLidar(context.Background(), deps, lidar, logger) + deps := s.SetupDeps(lidar["name"]) + actualLidar, err := s.NewLidar(context.Background(), deps, lidar["name"], logger) expectedLidar := s.Lidar{} test.That(t, actualLidar, test.ShouldResemble, expectedLidar) test.That(t, err, test.ShouldBeNil) @@ -77,8 +77,8 @@ func TestNewLidar(t *testing.T) { t.Run("Failed lidar creation with non-existing sensor", func(t *testing.T) { lidar := map[string]string{"name": "gibberish"} - deps := s.SetupDeps(lidar) - actualLidar, err := s.NewLidar(context.Background(), deps, lidar, logger) + deps := s.SetupDeps(lidar["name"]) + actualLidar, err := s.NewLidar(context.Background(), deps, lidar["name"], logger) expectedLidar := s.Lidar{} test.That(t, actualLidar, test.ShouldResemble, expectedLidar) test.That(t, err, test.ShouldBeError, @@ -89,8 +89,8 @@ func TestNewLidar(t *testing.T) { t.Run("Successful lidar creation", func(t *testing.T) { lidar := map[string]string{"name": "good_lidar"} ctx := context.Background() - deps := s.SetupDeps(lidar) - actualLidar, err := s.NewLidar(ctx, deps, lidar, logger) + deps := s.SetupDeps(lidar["name"]) + actualLidar, err := s.NewLidar(ctx, deps, lidar["name"], logger) test.That(t, actualLidar.Name, test.ShouldEqual, lidar["name"]) test.That(t, err, test.ShouldBeNil) @@ -105,19 +105,19 @@ func TestTimedSensorReading(t *testing.T) { ctx := context.Background() lidar := map[string]string{"name": "invalid_lidar"} - invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + invalidLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar["name"]), lidar["name"], logger) test.That(t, err, test.ShouldBeNil) lidar = map[string]string{"name": "invalid_replay_lidar"} - invalidReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + invalidReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar["name"]), lidar["name"], logger) test.That(t, err, test.ShouldBeNil) lidar = map[string]string{"name": "good_lidar"} - goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + goodLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar["name"]), lidar["name"], logger) test.That(t, err, test.ShouldBeNil) lidar = map[string]string{"name": "replay_lidar"} - goodReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar), lidar, logger) + goodReplayLidar, err := s.NewLidar(ctx, s.SetupDeps(lidar["name"]), lidar["name"], logger) test.That(t, err, test.ShouldBeNil) t.Run("when the lidar returns an error, returns that error", func(t *testing.T) { diff --git a/sensors/test_deps.go b/sensors/test_deps.go index 60f1549c..d5d78789 100644 --- a/sensors/test_deps.go +++ b/sensors/test_deps.go @@ -22,25 +22,25 @@ const ( ) // SetupDeps returns the dependencies based on the lidar passed as argument. -func SetupDeps(lidar map[string]string) resource.Dependencies { +func SetupDeps(lidarName string) resource.Dependencies { deps := make(resource.Dependencies) - switch lidar["name"] { + switch lidarName { case "good_lidar": - deps[camera.Named(lidar["name"])] = getGoodLidar() + deps[camera.Named(lidarName)] = getGoodLidar() case "warming_up_lidar": - deps[camera.Named(lidar["name"])] = getWarmingUpLidar() + deps[camera.Named(lidarName)] = getWarmingUpLidar() case "replay_lidar": - deps[camera.Named(lidar["name"])] = getReplayLidar(TestTime) + deps[camera.Named(lidarName)] = getReplayLidar(TestTime) case "invalid_replay_lidar": - deps[camera.Named(lidar["name"])] = getReplayLidar(BadTime) + deps[camera.Named(lidarName)] = getReplayLidar(BadTime) case "invalid_lidar": - deps[camera.Named(lidar["name"])] = getInvalidLidar() + deps[camera.Named(lidarName)] = getInvalidLidar() case "np_pcd_camera": - deps[camera.Named(lidar["name"])] = getNoPCDCamera() + deps[camera.Named(lidarName)] = getNoPCDCamera() case "gibberish_lidar": return deps case "finished_replay_lidar": - deps[camera.Named(lidar["name"])] = getFinishedReplayLidar() + deps[camera.Named(lidarName)] = getFinishedReplayLidar() } return deps diff --git a/testhelper/testhelper.go b/testhelper/testhelper.go index e366bf6c..90c97f3a 100644 --- a/testhelper/testhelper.go +++ b/testhelper/testhelper.go @@ -237,7 +237,7 @@ func CreateSLAMService( cfgService := resource.Config{Name: "test", API: slam.API, Model: viamcartographer.Model} cfgService.ConvertedAttributes = cfg - deps := s.SetupDeps(cfg.Camera) + deps := s.SetupDeps(cfg.Camera["name"]) sensorDeps, err := cfg.Validate("path") if err != nil { diff --git a/viam-cartographer/src/carto_facade/carto_facade_test.cc b/viam-cartographer/src/carto_facade/carto_facade_test.cc index 9680f09a..7db32d15 100644 --- a/viam-cartographer/src/carto_facade/carto_facade_test.cc +++ b/viam-cartographer/src/carto_facade/carto_facade_test.cc @@ -28,9 +28,10 @@ const auto tol = tt::tolerance(0.001); namespace viam { namespace carto_facade { -viam_carto_config viam_carto_config_setup( - int map_rate_sec, viam_carto_LIDAR_CONFIG lidar_config, - std::string data_dir, std::string camera) { +viam_carto_config viam_carto_config_setup(int map_rate_sec, + viam_carto_LIDAR_CONFIG lidar_config, + std::string data_dir, + std::string camera) { struct viam_carto_config vcc; vcc.map_rate_sec = map_rate_sec; vcc.lidar_config = lidar_config; @@ -120,7 +121,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { VIAM_CARTO_DATA_DIR_NOT_PROVIDED); std::string camera2 = ""; - + struct viam_carto_config vcc_empty_component_ref = viam_carto_config_setup( 1, VIAM_CARTO_THREE_D, tmp_dir.string(), camera2); @@ -133,9 +134,8 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { BOOST_TEST(viam_carto_init(&vc, lib, vcc_invalid_map_rate_sec, ac) == VIAM_CARTO_MAP_RATE_SEC_INVALID); - struct viam_carto_config vcc_invalid_lidar_config = - viam_carto_config_setup(1, static_cast(-1), - tmp_dir.string(), camera); + struct viam_carto_config vcc_invalid_lidar_config = viam_carto_config_setup( + 1, static_cast(-1), tmp_dir.string(), camera); BOOST_TEST(viam_carto_init(&vc, lib, vcc_invalid_lidar_config, ac) == VIAM_CARTO_LIDAR_CONFIG_INVALID); @@ -151,9 +151,8 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { fs::path invalid_path = tmp_dir / fs::path(bfs::unique_path().string()) / fs::path(bfs::unique_path().string()); - struct viam_carto_config vcc_invalid_path = - viam_carto_config_setup(1, VIAM_CARTO_THREE_D, invalid_path.string(), - camera); + struct viam_carto_config vcc_invalid_path = viam_carto_config_setup( + 1, VIAM_CARTO_THREE_D, invalid_path.string(), camera); BOOST_TEST(viam_carto_init(&vc, lib, vcc_invalid_path, ac) == VIAM_CARTO_DATA_DIR_FILE_SYSTEM_ERROR); diff --git a/viam_cartographer.go b/viam_cartographer.go index 57be1f86..dd7453b6 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -37,7 +37,7 @@ var ( const ( // DefaultExecutableName is what this program expects to call to start the cartographer grpc server. DefaultExecutableName = "carto_grpc_server" - defaultLidarDataFreqHz = 5 + defaultLidarDataRateMSec = 200 defaultMapRateSec = 60 defaultDialMaxTimeoutSec = 30 defaultSensorValidationMaxTimeoutSec = 30 @@ -160,14 +160,18 @@ func New( c.Model.Name, svcConfig.ConfigParams["mode"]) } - mapRateSec := vcConfig.GetOptionalParameters( + lidarDataRateMSec, mapRateSec, err := vcConfig.GetOptionalParameters( svcConfig, + defaultLidarDataRateMSec, defaultMapRateSec, logger, ) + if err != nil { + return nil, err + } // Get the lidar for the Dim2D cartographer sub algorithm - lidar, err := s.NewLidar(ctx, deps, svcConfig.Camera, logger) + lidar, err := s.NewLidar(ctx, deps, svcConfig.Camera["name"], logger) if err != nil { return nil, err } @@ -189,11 +193,11 @@ func New( Named: c.ResourceName().AsNamed(), lidarName: lidar.Name, lidar: lidar, + lidarDataRateMSec: lidarDataRateMSec, timedLidar: timedSensor, subAlgo: subAlgo, configParams: svcConfig.ConfigParams, dataDirectory: svcConfig.DataDirectory, - camera: svcConfig.Camera, mapRateSec: mapRateSec, cancelSensorProcessFunc: cancelSensorProcessFunc, cancelCartoFacadeFunc: cancelCartoFacadeFunc, From 52bb8b75f2942c8eb749e3c52326bad40e59b2b8 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Wed, 26 Jul 2023 15:47:37 -0400 Subject: [PATCH 38/41] capi --- cartofacade/capi.go | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/cartofacade/capi.go b/cartofacade/capi.go index 61628d6f..ca5307f1 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -179,11 +179,6 @@ func NewCarto(cfg CartoConfig, acfg CartoAlgoConfig, vcl CartoLibInterface) (Car return Carto{}, err } - status = C.free_bstring_array(vcc.sensors, C.size_t(1)) - if status != C.BSTR_OK { - return Carto{}, errors.New("unable to free memory for sensor list") - } - carto := Carto{value: pVc, SlamMode: toSlamMode(pVc.slam_mode)} return carto, nil } @@ -352,24 +347,13 @@ func toLidarConfig(lidarConfig LidarConfig) (C.viam_carto_LIDAR_CONFIG, error) { func getConfig(cfg CartoConfig) (C.viam_carto_config, error) { vcc := C.viam_carto_config{} - - // create pointer to bstring which can represent a list of sensors - sz := 1 - pSensor := C.alloc_bstring_array(C.size_t(sz)) - if pSensor == nil { - return C.viam_carto_config{}, errors.New("unable to allocate memory for sensor list") - } - sensorSlice := unsafe.Slice(pSensor, sz) - - sensorSlice[0] = goStringToBstring(cfg.Camera) + vcc.Camera = goStringToBstring(cfg.Camera) lidarCfg, err := toLidarConfig(cfg.LidarConfig) if err != nil { return C.viam_carto_config{}, err } - vcc.sensors = pSensor - vcc.sensors_len = C.int(sz) vcc.map_rate_sec = C.int(cfg.MapRateSecond) vcc.data_dir = goStringToBstring(cfg.DataDir) vcc.lidar_config = lidarCfg @@ -450,8 +434,6 @@ func toError(status C.int) error { return errors.New("VIAM_CARTO_LIB_INVALID") case C.VIAM_CARTO_LIB_NOT_INITIALIZED: return errors.New("VIAM_CARTO_LIB_NOT_INITIALIZED") - case C.VIAM_CARTO_SENSORS_LIST_EMPTY: - return errors.New("VIAM_CARTO_SENSORS_LIST_EMPTY") case C.VIAM_CARTO_UNKNOWN_ERROR: return errors.New("VIAM_CARTO_UNKNOWN_ERROR") case C.VIAM_CARTO_DATA_DIR_NOT_PROVIDED: From 647e244766a34f78ea3e36d673d077b60322250c Mon Sep 17 00:00:00 2001 From: PStrutz Date: Wed, 26 Jul 2023 15:53:27 -0400 Subject: [PATCH 39/41] capi fix --- cartofacade/capi.go | 2 +- cartofacade/capi_test.go | 8 ++------ cartofacade/testhelpers.go | 4 ++-- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/cartofacade/capi.go b/cartofacade/capi.go index ca5307f1..24708547 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -347,7 +347,7 @@ func toLidarConfig(lidarConfig LidarConfig) (C.viam_carto_LIDAR_CONFIG, error) { func getConfig(cfg CartoConfig) (C.viam_carto_config, error) { vcc := C.viam_carto_config{} - vcc.Camera = goStringToBstring(cfg.Camera) + vcc.camera = goStringToBstring(cfg.Camera) lidarCfg, err := toLidarConfig(cfg.LidarConfig) if err != nil { diff --git a/cartofacade/capi_test.go b/cartofacade/capi_test.go index 94ba955b..70574b89 100644 --- a/cartofacade/capi_test.go +++ b/cartofacade/capi_test.go @@ -62,16 +62,12 @@ func TestGetConfig(t *testing.T) { vcc, err := getConfig(cfg) test.That(t, err, test.ShouldBeNil) - sensors := bStringToGoStringSlice(vcc.sensors, int(vcc.sensors_len)) - test.That(t, sensors[0], test.ShouldResemble, "mysensor") - test.That(t, sensors[1], test.ShouldResemble, "imu") - test.That(t, vcc.sensors_len, test.ShouldEqual, 2) + camera := bstringToGoString(vcc.camera) + test.That(t, camera, test.ShouldResemble, "mysensor") dataDir := bstringToGoString(vcc.data_dir) test.That(t, dataDir, test.ShouldResemble, dir) - freeBstringArray(vcc.sensors, vcc.sensors_len) - test.That(t, vcc.lidar_config, test.ShouldEqual, TwoD) }) } diff --git a/cartofacade/testhelpers.go b/cartofacade/testhelpers.go index 62de4816..ff58106b 100644 --- a/cartofacade/testhelpers.go +++ b/cartofacade/testhelpers.go @@ -5,14 +5,14 @@ import ( ) // GetTestConfig gets a sample config for testing purposes. -func GetTestConfig(sensor string) (CartoConfig, string, error) { +func GetTestConfig(cameraName string) (CartoConfig, string, error) { dir, err := os.MkdirTemp("", "slam-test") if err != nil { return CartoConfig{}, "", err } return CartoConfig{ - Camera: "test_lidar", + Camera: cameraName, MapRateSecond: 5, DataDir: dir, ComponentReference: "component", From 699cd47b8f3c0dacec5d3d54d2d151d7cfe7f332 Mon Sep 17 00:00:00 2001 From: PStrutz Date: Wed, 26 Jul 2023 17:35:32 -0400 Subject: [PATCH 40/41] resolve testing issues --- config/config_test.go | 10 +++---- sensors/sensors_test.go | 8 ++--- .../src/carto_facade/carto_facade_test.cc | 30 +++++++++---------- viam_cartographer_test.go | 21 +------------ 4 files changed, 25 insertions(+), 44 deletions(-) diff --git a/config/config_test.go b/config/config_test.go index 78b158d6..fdf69707 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -79,7 +79,7 @@ func TestValidate(t *testing.T) { "data_frequency_hz": "twenty", } _, err := newConfig(cfgService) - test.That(t, err, test.ShouldBeError, newError("data_frequency_hz must only contain digits")) + test.That(t, err, test.ShouldBeError, newError("camera[data_frequency_hz] must only contain digits")) }) t.Run("Config with out of range values", func(t *testing.T) { @@ -89,7 +89,7 @@ func TestValidate(t *testing.T) { "data_frequency_hz": "-1", } _, err := newConfig(cfgService) - test.That(t, err, test.ShouldBeError, newError("cannot specify data_frequency_hz less than zero")) + test.That(t, err, test.ShouldBeError, newError("cannot specify camera[data_frequency_hz] less than zero")) cfgService.Attributes["camera"] = map[string]string{ "name": "a", "data_frequency_hz": "1", @@ -152,7 +152,7 @@ func TestGetOptionalParameters(t *testing.T) { logger) test.That(t, err, test.ShouldBeNil) test.That(t, mapRateSec, test.ShouldEqual, 1002) - test.That(t, lidarDataRateMSec, test.ShouldEqual, 1) + test.That(t, lidarDataRateMSec, test.ShouldEqual, 1000) }) t.Run("Return overrides", func(t *testing.T) { @@ -164,7 +164,7 @@ func TestGetOptionalParameters(t *testing.T) { cfg, err := newConfig(cfgService) two := 2 cfg.MapRateSec = &two - cfg.Camera["data_frequency_hz"] = "2000" + cfg.Camera["data_frequency_hz"] = "20" test.That(t, err, test.ShouldBeNil) lidarDataRateMSec, mapRateSec, err := GetOptionalParameters( cfg, @@ -173,7 +173,7 @@ func TestGetOptionalParameters(t *testing.T) { logger) test.That(t, err, test.ShouldBeNil) test.That(t, mapRateSec, test.ShouldEqual, 2) - test.That(t, lidarDataRateMSec, test.ShouldEqual, 2) + test.That(t, lidarDataRateMSec, test.ShouldEqual, 50) }) } diff --git a/sensors/sensors_test.go b/sensors/sensors_test.go index adec9267..66b8e69b 100644 --- a/sensors/sensors_test.go +++ b/sensors/sensors_test.go @@ -69,10 +69,10 @@ func TestNewLidar(t *testing.T) { t.Run("No sensor provided", func(t *testing.T) { lidar := map[string]string{} deps := s.SetupDeps(lidar["name"]) - actualLidar, err := s.NewLidar(context.Background(), deps, lidar["name"], logger) - expectedLidar := s.Lidar{} - test.That(t, actualLidar, test.ShouldResemble, expectedLidar) - test.That(t, err, test.ShouldBeNil) + _, err := s.NewLidar(context.Background(), deps, lidar["name"], logger) + test.That(t, err, test.ShouldBeError, + errors.New("error getting lidar camera "+ + " for slam service: \"rdk:component:camera/\" missing from dependencies")) }) t.Run("Failed lidar creation with non-existing sensor", func(t *testing.T) { diff --git a/viam-cartographer/src/carto_facade/carto_facade_test.cc b/viam-cartographer/src/carto_facade/carto_facade_test.cc index 7db32d15..cc7a04a7 100644 --- a/viam-cartographer/src/carto_facade/carto_facade_test.cc +++ b/viam-cartographer/src/carto_facade/carto_facade_test.cc @@ -422,7 +422,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_terminate) { BOOST_TEST((cf->config.camera) == camera); BOOST_TEST((cf->config.map_rate_sec).count() == 1); BOOST_TEST((cf->config.data_dir) == tmp_dir.string()); - BOOST_TEST(to_std_string(cf->config.component_reference) == "sensor_1"); + BOOST_TEST(to_std_string(cf->config.component_reference) == "lidar"); BOOST_TEST((cf->config.lidar_config) == VIAM_CARTO_THREE_D); BOOST_TEST(viam_carto_terminate(&vc) == VIAM_CARTO_SUCCESS); @@ -456,7 +456,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { // AddSensorReading { viam_carto_sensor_reading sr = new_test_sensor_reading( - "sensor_1", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", + "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", 1687900053773475); viam::carto_facade::CartoFacade *cf = static_cast(vc->carto_obj); @@ -515,7 +515,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { BOOST_TEST(pr.jmag == 0); BOOST_TEST(pr.kmag == 0); BOOST_TEST(pr.real == 1); - BOOST_TEST(to_std_string(pr.component_reference) == "sensor_1"); + BOOST_TEST(to_std_string(pr.component_reference) == "lidar"); BOOST_TEST(viam_carto_get_position_response_destroy(&pr) == VIAM_CARTO_SUCCESS); @@ -572,7 +572,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { { viam_carto_sensor_reading sr; // must be they first sensor in the sensor list - sr.sensor = bfromcstr("sensor_1"); + sr.sensor = bfromcstr("lidar"); std::string pcd = "empty lidar reading"; // passing 0 as the second parameter makes the string empty sr.sensor_reading = blk2bstr(pcd.c_str(), 0); @@ -588,7 +588,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { { viam_carto_sensor_reading sr; // must be they first sensor in the sensor list - sr.sensor = bfromcstr("sensor_1"); + sr.sensor = bfromcstr("lidar"); std::string pcd = "invalid lidar reading"; sr.sensor_reading = blk2bstr(pcd.c_str(), pcd.length()); BOOST_TEST(sr.sensor_reading != nullptr); @@ -602,7 +602,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { // unable to aquire lock { viam_carto_sensor_reading sr = new_test_sensor_reading( - "sensor_1", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", + "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", 1687900053773475); viam::carto_facade::CartoFacade *cf = static_cast(vc->carto_obj); @@ -660,7 +660,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { BOOST_TEST(pr.jmag == 0); BOOST_TEST(pr.kmag == 0); BOOST_TEST(pr.real == 1); - BOOST_TEST(to_std_string(pr.component_reference) == "sensor_1"); + BOOST_TEST(to_std_string(pr.component_reference) == "lidar"); BOOST_TEST(viam_carto_get_position_response_destroy(&pr) == VIAM_CARTO_SUCCESS); @@ -679,7 +679,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { { VLOG(1) << "viam_carto_add_sensor_reading 1"; viam_carto_sensor_reading sr = new_test_sensor_reading( - "sensor_1", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", + "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", 1629037851000000); BOOST_TEST(viam_carto_add_sensor_reading(vc, &sr) == VIAM_CARTO_SUCCESS); @@ -697,7 +697,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { BOOST_TEST(pr.jmag == 0); BOOST_TEST(pr.kmag == 0); BOOST_TEST(pr.real == 1); - BOOST_TEST(to_std_string(pr.component_reference) == "sensor_1"); + BOOST_TEST(to_std_string(pr.component_reference) == "lidar"); BOOST_TEST(viam_carto_get_position_response_destroy(&pr) == VIAM_CARTO_SUCCESS); @@ -726,7 +726,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { { VLOG(1) << "viam_carto_add_sensor_reading 2"; viam_carto_sensor_reading sr = new_test_sensor_reading( - "sensor_1", ".artifact/data/viam-cartographer/mock_lidar/1.pcd", + "lidar", ".artifact/data/viam-cartographer/mock_lidar/1.pcd", 1629037853000000); BOOST_TEST(viam_carto_add_sensor_reading(vc, &sr) == VIAM_CARTO_SUCCESS); @@ -746,7 +746,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { BOOST_TEST(pr.jmag == 0); BOOST_TEST(pr.kmag == 0); BOOST_TEST(pr.real == 1); - BOOST_TEST(to_std_string(pr.component_reference) == "sensor_1"); + BOOST_TEST(to_std_string(pr.component_reference) == "lidar"); BOOST_TEST(viam_carto_get_position_response_destroy(&pr) == VIAM_CARTO_SUCCESS); @@ -784,7 +784,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { { VLOG(1) << "viam_carto_add_sensor_reading 3"; viam_carto_sensor_reading sr = new_test_sensor_reading( - "sensor_1", ".artifact/data/viam-cartographer/mock_lidar/2.pcd", + "lidar", ".artifact/data/viam-cartographer/mock_lidar/2.pcd", 1629037855000000); BOOST_TEST(viam_carto_add_sensor_reading(vc, &sr) == VIAM_CARTO_SUCCESS); @@ -803,7 +803,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { BOOST_TEST(pr.jmag == 0); BOOST_TEST(pr.kmag != 0); BOOST_TEST(pr.real != 1); - BOOST_TEST(to_std_string(pr.component_reference) == "sensor_1"); + BOOST_TEST(to_std_string(pr.component_reference) == "lidar"); BOOST_TEST(viam_carto_get_position_response_destroy(&pr) == VIAM_CARTO_SUCCESS); @@ -832,7 +832,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo) { // AddSensorReading { viam_carto_sensor_reading sr = new_test_sensor_reading( - "sensor_1", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", + "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", 1687900053773475); viam::carto_facade::CartoFacade *cf = static_cast(vc->carto_obj); @@ -887,7 +887,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_config) { struct config c = viam::carto_facade::from_viam_carto_config(vcc); - BOOST_TEST(to_std_string(c.component_reference) == "sensor_1"); + BOOST_TEST(to_std_string(c.component_reference) == "lidar"); BOOST_TEST(c.data_dir == tmp_dir.string()); BOOST_TEST(c.lidar_config == VIAM_CARTO_THREE_D); BOOST_TEST(c.map_rate_sec.count() == 1); diff --git a/viam_cartographer_test.go b/viam_cartographer_test.go index 2147ed1e..be7270ad 100644 --- a/viam_cartographer_test.go +++ b/viam_cartographer_test.go @@ -199,29 +199,10 @@ func TestNew(t *testing.T) { } svc, err := testhelper.CreateSLAMService(t, attrCfg, logger) - test.That(t, err, test.ShouldBeError, errors.New("error validating \"path\": \"sensors\" must not be empty")) + test.That(t, err, test.ShouldBeError, errors.New("error validating \"path\": \"camera\" must not be empty")) test.That(t, svc, test.ShouldBeNil) }) - t.Run("Failed creation of cartographer slam service with more than one sensor when feature flag enabled", func(t *testing.T) { - termFunc := testhelper.InitTestCL(t, logger) - defer termFunc() - - dataDirectory, fsCleanupFunc := testhelper.InitInternalState(t) - defer fsCleanupFunc() - - attrCfg := &vcConfig.Config{ - Camera: map[string]string{"name": "lidar", "name2": "one-too-many"}, - ConfigParams: map[string]string{"mode": "2d"}, - DataDirectory: dataDirectory, - } - - _, err := testhelper.CreateSLAMService(t, attrCfg, logger) - test.That(t, err, test.ShouldBeError, - errors.New("configuring lidar camera error: 'sensors' must contain only one "+ - "lidar camera, but is 'sensors: [lidar, one-too-many]'")) - }) - t.Run("Failed creation of cartographer slam service with non-existing sensor when feature flag enabled", func(t *testing.T) { termFunc := testhelper.InitTestCL(t, logger) defer termFunc() From 21da3bcd1b937851583bc7b24ad99f7ac9d6fe5a Mon Sep 17 00:00:00 2001 From: PStrutz Date: Thu, 27 Jul 2023 12:26:49 -0400 Subject: [PATCH 41/41] debugging --- cartofacade/capi.go | 12 ++++++++---- cartofacade/carto_facade.go | 9 +++++++-- integration_test.go | 3 --- sensors/sensors.go | 6 +++++- testhelper/testhelper.go | 4 ++++ viam_cartographer.go | 12 +++++++++--- 6 files changed, 33 insertions(+), 13 deletions(-) diff --git a/cartofacade/capi.go b/cartofacade/capi.go index 24708547..49573866 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -28,6 +28,7 @@ import "C" import ( "errors" + "fmt" "time" "unsafe" ) @@ -160,26 +161,29 @@ func toSlamMode(cSlamMode C.int) SlamMode { // NewCarto calls viam_carto_init and returns a pointer to a viam carto object. vcl is only an interface to facilitate testing & that the only type vcl it is actually expected to have is a CartoLib func NewCarto(cfg CartoConfig, acfg CartoAlgoConfig, vcl CartoLibInterface) (Carto, error) { + fmt.Println("alls not good here") var pVc *C.viam_carto vcc, err := getConfig(cfg) if err != nil { return Carto{}, err } - + fmt.Println("1") vcac := toAlgoConfig(acfg) - + fmt.Println("2") cl, ok := vcl.(*CartoLib) if !ok { return Carto{}, errors.New("cannot cast provided library to a CartoLib") } - + fmt.Println("3") status := C.viam_carto_init(&pVc, cl.value, vcc, vcac) + fmt.Println("3.5") if err := toError(status); err != nil { return Carto{}, err } - + fmt.Println("4") carto := Carto{value: pVc, SlamMode: toSlamMode(pVc.slam_mode)} + fmt.Println("alls good here") return carto, nil } diff --git a/cartofacade/carto_facade.go b/cartofacade/carto_facade.go index 3281e225..2bc8e0d8 100644 --- a/cartofacade/carto_facade.go +++ b/cartofacade/carto_facade.go @@ -20,17 +20,19 @@ var ErrUnableToAcquireLock = errors.New("VIAM_CARTO_UNABLE_TO_ACQUIRE_LOCK") func (cf *CartoFacade) Initialize(ctx context.Context, timeout time.Duration, activeBackgroundWorkers *sync.WaitGroup) (SlamMode, error) { cf.startCGoroutine(ctx, activeBackgroundWorkers) untyped, err := cf.request(ctx, initialize, emptyRequestParams, timeout) + fmt.Println("6.5") if err != nil { + fmt.Println("6.6") return UnknownMode, err } - + fmt.Println("7") carto, ok := untyped.(Carto) if !ok { return UnknownMode, errors.New("unable to cast response from cartofacade to a carto struct") } cf.carto = &carto - + fmt.Println("8") return carto.SlamMode, nil } @@ -317,11 +319,14 @@ func (cf *CartoFacade) request( // wait until work can call into C (and timeout if needed) select { + case cf.requestChan <- req: select { case response := <-req.responseChan: + fmt.Println("6.3") return response.result, response.err case <-ctx.Done(): + fmt.Println("6.4") msg := "timeout has occurred while trying to read request from cartofacade" return nil, multierr.Combine(errors.New(msg), ctx.Err()) } diff --git a/integration_test.go b/integration_test.go index df433124..388073c3 100644 --- a/integration_test.go +++ b/integration_test.go @@ -132,15 +132,12 @@ func testHelperCartographer( sensorReadingInterval := time.Millisecond * 200 timedSensor, err := testhelper.IntegrationLidarTimedSensor(t, attrCfg.Camera["name"], replaySensor, sensorReadingInterval, done) test.That(t, err, test.ShouldBeNil) - svc, err := testhelper.CreateIntegrationSLAMService(t, attrCfg, timedSensor, logger) test.That(t, err, test.ShouldBeNil) start := time.Now() - cSvc, ok := svc.(*viamcartographer.CartographerService) test.That(t, ok, test.ShouldBeTrue) test.That(t, cSvc.SlamMode, test.ShouldEqual, expectedMode) - ctx, cancelFunc := context.WithTimeout(context.Background(), time.Second*5) defer cancelFunc() diff --git a/sensors/sensors.go b/sensors/sensors.go index 10ec921e..e0eed27e 100644 --- a/sensors/sensors.go +++ b/sensors/sensors.go @@ -4,6 +4,7 @@ package sensors import ( "bytes" "context" + "fmt" "time" "github.com/edaniels/golog" @@ -43,13 +44,16 @@ func NewLidar( ) (Lidar, error) { _, span := trace.StartSpan(ctx, "viamcartographer::sensors::NewLidar") defer span.End() - + fmt.Println(cameraName) newLidar, err := camera.FromDependencies(deps, cameraName) if err != nil { return Lidar{}, errors.Wrapf(err, "error getting lidar camera %v for slam service", cameraName) } + fmt.Println("am here") + fmt.Println(newLidar) // If there is a camera provided in the 'camera' field, we enforce that it supports PCD. properties, err := newLidar.Properties(ctx) + fmt.Println("got here") if err != nil { return Lidar{}, errors.Wrapf(err, "error getting lidar camera properties %v for slam service", cameraName) } diff --git a/testhelper/testhelper.go b/testhelper/testhelper.go index 90c97f3a..7056cf40 100644 --- a/testhelper/testhelper.go +++ b/testhelper/testhelper.go @@ -76,6 +76,10 @@ func getStubLidar(t *testing.T) *inject.Camera { t.Error("stub lidar Projector called") return nil, transform.NewNoIntrinsicsError("") } + cam.PropertiesFunc = func(ctx context.Context) (camera.Properties, error) { + t.Error("stub lidar Properties called") + return camera.Properties{SupportsPCD: true}, nil + } return cam } diff --git a/viam_cartographer.go b/viam_cartographer.go index dd7453b6..66742ceb 100644 --- a/viam_cartographer.go +++ b/viam_cartographer.go @@ -5,6 +5,7 @@ package viamcartographer import ( "bytes" "context" + "fmt" "strconv" "sync" "sync/atomic" @@ -216,7 +217,7 @@ func New( } } }() - + fmt.Println("1") if err = s.ValidateGetData( cancelSensorProcessCtx, timedSensor, @@ -226,13 +227,15 @@ func New( err = errors.Wrap(err, "failed to get data from lidar") return nil, err } + fmt.Println("2") err = initCartoFacade(cancelCartoFacadeCtx, cartoSvc) if err != nil { return nil, err } - + fmt.Println("1") initSensorProcess(cancelSensorProcessCtx, cartoSvc) + fmt.Println("2") return cartoSvc, nil } @@ -334,7 +337,7 @@ func initCartoFacade(ctx context.Context, cartoSvc *CartographerService) error { if err != nil { return err } - + fmt.Println("3") cartoCfg := cartofacade.CartoConfig{ Camera: cartoSvc.camera["name"], MapRateSecond: cartoSvc.mapRateSec, @@ -342,9 +345,12 @@ func initCartoFacade(ctx context.Context, cartoSvc *CartographerService) error { ComponentReference: cartoSvc.lidarName, LidarConfig: cartofacade.TwoD, } + fmt.Println("4") cf := cartofacade.New(&cartoLib, cartoCfg, cartoAlgoConfig) + fmt.Println("4.5") slamMode, err := cf.Initialize(ctx, cartoSvc.cartoFacadeTimeout, &cartoSvc.cartoFacadeWorkers) + fmt.Println("5") if err != nil { cartoSvc.logger.Errorw("cartofacade initialize failed", "error", err) return err