diff --git a/scenarios/SickLaserUnitTest/config/SickLaserUnit.cfg b/scenarios/SickLaserUnitTest/config/SickLaserUnit.cfg index bac8b18e34e4899622d2b49608a42794af7e9fae..5ff571ebdb58c6f447e14154934e7b4cac213a35 100644 --- a/scenarios/SickLaserUnitTest/config/SickLaserUnit.cfg +++ b/scenarios/SickLaserUnitTest/config/SickLaserUnit.cfg @@ -151,26 +151,18 @@ ArmarX.SickLaserUnit.angleOffset = 0.0 -# ArmarX.SickLaserUnit.deviceNumber: number of the LaserScanner Device +# ArmarX.SickLaserUnit.devices: List of Devices in format frame1,ip1,port1;frame2,ip2,port2 # Attributes: -# - Default: 0 +# - Default: LaserScannerFront,192.168.8.133,2112 # - Case sensitivity: yes # - Required: no -# ArmarX.SickLaserUnit.deviceNumber = 0 - - -# ArmarX.SickLaserUnit.devices: No Description -# Attributes: -# - Default: Device1; Scanner2 -# - Case sensitivity: no -# - Required: no -ArmarX.SickLaserUnit.devices = Device1; Scanner2 +ArmarX.SickLaserUnit.devices = LaserScannerFront,192.168.8.133,2112 -# ArmarX.SickLaserUnit.hostname: Hostname of the LaserScanner +# ArmarX.SickLaserUnit.hostname: No Description # Attributes: # - Default: 192.168.8.133 -# - Case sensitivity: yes +# - Case sensitivity: no # - Required: no ArmarX.SickLaserUnit.hostname = 192.168.8.133 @@ -183,10 +175,10 @@ ArmarX.SickLaserUnit.hostname = 192.168.8.133 ArmarX.SickLaserUnit.laserScannerTopicName = "SickTopic" -# ArmarX.SickLaserUnit.port: port to use on the LaserScanner +# ArmarX.SickLaserUnit.port: No Description # Attributes: # - Default: 2112 -# - Case sensitivity: yes +# - Case sensitivity: no # - Required: no ArmarX.SickLaserUnit.port = 2112 @@ -222,15 +214,6 @@ ArmarX.SickLaserUnit.rangeMin = 0.01 ArmarX.SickLaserUnit.scannerType = sick_tim_5xx -# ArmarX.SickLaserUnit.subscribeDatagram: subscribe to Datagram in communication or not -# Attributes: -# - Default: false -# - Case sensitivity: yes -# - Required: no -# - Possible values: {0, 1, false, no, true, yes} -# ArmarX.SickLaserUnit.subscribeDatagram = false - - # ArmarX.SickLaserUnit.timeIncrement: timeIncrement?? # Attributes: # - Default: 0.10000000000000001 @@ -247,19 +230,20 @@ ArmarX.SickLaserUnit.timeIncrement = 0.1 # ArmarX.SickLaserUnit.timelimit = 5 -# ArmarX.SickLaserUnit.topicName: Name of topic. +# ArmarX.SickLaserUnit.topicName: Name of the topic # Attributes: +# - Default: SICKLaserScanner # - Case sensitivity: yes -# - Required: yes +# - Required: no ArmarX.SickLaserUnit.topicName = "myLaserTopic1" # ArmarX.SickLaserUnit.tpc.sub.LaserScannerUnit: Name of the `LaserScannerUnit` topic to subscribe to. # Attributes: -# - Default: LaserScannerUnit +# - Default: SICKLaserScanner # - Case sensitivity: yes # - Required: no -# ArmarX.SickLaserUnit.tpc.sub.LaserScannerUnit = LaserScannerUnit +# ArmarX.SickLaserUnit.tpc.sub.LaserScannerUnit = SICKLaserScanner # ArmarX.SickLaserUnit.updatePeriod: No Description diff --git a/source/RobotAPI/drivers/SickLaserUnit/SickLaserUnit.cpp b/source/RobotAPI/drivers/SickLaserUnit/SickLaserUnit.cpp index 2e852005c897449b67185c19fecb109484c1709f..6c84b806ffc36dca5a6e981da5d19a2a67f329d2 100644 --- a/source/RobotAPI/drivers/SickLaserUnit/SickLaserUnit.cpp +++ b/source/RobotAPI/drivers/SickLaserUnit/SickLaserUnit.cpp @@ -123,9 +123,7 @@ namespace armarx def->optional(properties.topicName, "topicName", "Name of the topic"); //Scanner parameters - def->optional(properties.frameName, "frameName", "Name of scanner frame."); - def->optional(properties.hostname, "hostname", "Hostname of the LaserScanner"); - def->optional(properties.port, "port", "port to use on the LaserScanner"); + def->optional(properties.devices, "devices", "List of Devices in format frame1,ip1,port1;frame2,ip2,port2"); def->optional(properties.timelimit, "timelimit", "timelimit for communication"); def->required(properties.scannerType, "scannerType", "Name of the LaserScanner"); def->optional(properties.angleOffset, "angleOffset", "offset to the scanning angle"); @@ -145,38 +143,50 @@ namespace armarx ARMARX_INFO_S << "initializing SickLaserUnit."; - scanDevice.scanTopic = topic; - scanDevice.isSensorInitialized = false; - if (properties.hostname != "") + std::vector<std::string> splitDeviceStrings = Split(properties.devices, ";"); + scanDevices.clear(); + scanDevices.reserve(splitDeviceStrings.size()); + for (std::string const& deviceString : splitDeviceStrings) { - scanDevice.useTcp = true; - scanDevice.ip = properties.hostname; - } - scanDevice.port = properties.port; - scanDevice.frameName = properties.frameName; - scanDevice.angleOffset = properties.angleOffset; - scanDevice.timelimit = properties.timelimit; - scanDevice.scannerType = properties.scannerType; - scanDevice.rangeMin = properties.rangeMin; - scanDevice.rangeMax = properties.rangeMax; - scanDevice.timeIncrement = properties.timeIncrement; - //scanner Parameters - try - { - scanDevice.parser = new sick_scan::SickGenericParser(scanDevice.scannerType); - scanDevice.parser->set_range_min(properties.rangeMin); - scanDevice.parser->set_range_max(properties.rangeMax); - scanDevice.parser->set_time_increment(properties.timeIncrement); - } - catch (std::exception const& e) - { - ARMARX_ERROR_S << "Could not create parser. Wrong Scanner name."; - return; + std::vector<std::string> deviceInfo = Split(deviceString, ","); + if (deviceInfo.size() != 3) + { + ARMARX_WARNING << "Unexpected format for laser scanner device: " << deviceString + << " (split size: " << deviceInfo.size() << ")"; + continue; + } + SickLaserScanDevice& device = scanDevices.emplace_back(); + device.scanTopic = topic; + device.isSensorInitialized = false; + device.frameName = deviceInfo[0]; + if (deviceInfo[1] != "") + { + device.useTcp = true; + device.ip = deviceInfo[1]; + } + device.port = deviceInfo[2]; + device.angleOffset = properties.angleOffset; + device.timelimit = properties.timelimit; + device.scannerType = properties.scannerType; + device.rangeMin = properties.rangeMin; + device.rangeMax = properties.rangeMax; + device.timeIncrement = properties.timeIncrement; + //scanner Parameters + try + { + device.parser = new sick_scan::SickGenericParser(device.scannerType); + device.parser->set_range_min(properties.rangeMin); + device.parser->set_range_max(properties.rangeMax); + device.parser->set_time_increment(properties.timeIncrement); + } + catch (std::exception const& e) + { + ARMARX_ERROR_S << "Could not create parser. Wrong Scanner name."; + return; + } + device.parser->getCurrentParamPtr()->setUseBinaryProtocol(false); + device.colaDialectId = 'A'; } - scanDevice.parser->getCurrentParamPtr()->setUseBinaryProtocol(false); - scanDevice.colaDialectId = 'A'; - ARMARX_INFO_S << "ASCII protocol activated."; - ARMARX_INFO_S << "SickLaserUnit initialisation complete."; //addPlugin(heartbeat); //configureHeartbeatChannel(); @@ -186,20 +196,20 @@ namespace armarx { topic = getTopic<LaserScannerUnitListenerPrx>(properties.topicName); offeringTopic(properties.topicName); - scanDevice.scanTopic = topic; - - ARMARX_INFO_S << "Connecting."; - //start the laser scanner - if (scanDevice.task) + for (SickLaserScanDevice& device : scanDevices) { - scanDevice.task->stop(); - scanDevice.task = nullptr; + device.scanTopic = topic; + //start the laser scanner + if (device.task) + { + device.task->stop(); + device.task = nullptr; + } + device.runState = RunState::scannerInit; + device.task = new RunningTask<SickLaserScanDevice>(&device, &SickLaserScanDevice::run, "SickLaserScanUpdate_" + device.ip); + device.task->start(); } - scanDevice.runState = RunState::scannerInit; - scanDevice.task = new RunningTask<SickLaserScanDevice>(&scanDevice, &SickLaserScanDevice::run, "SickLaserScanUpdate_" + scanDevice.ip); - scanDevice.task->start(); - // Do things after connecting to topics and components. /* (Requies the armarx::DebugObserverComponentPluginUser.) @@ -231,18 +241,21 @@ namespace armarx void SickLaserUnit::onDisconnectComponent() { ARMARX_INFO_S << "Disconnecting LaserScanner."; - if (scanDevice.task) - { - scanDevice.task->stop(); - scanDevice.task = nullptr; - } - if (scanDevice.scanner) - { - delete scanDevice.scanner; - } - if (scanDevice.parser) + for (SickLaserScanDevice& device : scanDevices) { - delete scanDevice.parser; + if (device.task) + { + device.task->stop(); + device.task = nullptr; + } + if (device.scanner) + { + delete device.scanner; + } + if (device.parser) + { + delete device.parser; + } } } diff --git a/source/RobotAPI/drivers/SickLaserUnit/SickLaserUnit.h b/source/RobotAPI/drivers/SickLaserUnit/SickLaserUnit.h index 388285ae8314bf45829316c1eafa24696a9a0e6e..69d6385c130969a4d18a6d104f91765ec4d9a876 100644 --- a/source/RobotAPI/drivers/SickLaserUnit/SickLaserUnit.h +++ b/source/RobotAPI/drivers/SickLaserUnit/SickLaserUnit.h @@ -133,9 +133,7 @@ namespace armarx { std::string topicName = "SICKLaserScanner"; //scanner parameters - std::string hostname = "192.168.8.133"; - std::string port = "2112"; - std::string frameName = "LaserScannerFront"; + std::string devices = "LaserScannerFront,192.168.8.133,2112"; int timelimit = 5; std::string scannerType = "sick_tim_5xx"; double angleOffset = 0.0; @@ -144,7 +142,7 @@ namespace armarx double timeIncrement = 0.1; }; Properties properties; - SickLaserScanDevice scanDevice; + std::vector<SickLaserScanDevice> scanDevices; LaserScannerUnitListenerPrx topic; //HeartbeatComponentPlugin heartbeat;