diff --git a/scenarios/ArMemObjectMemory/config/ArVizStorage.cfg b/scenarios/ArMemObjectMemory/config/ArVizStorage.cfg index 0dcbd8d5775b8c0f562bba62b5f2fe282e2da6d0..302ac28c37dd28de3e68fb4fe4c2174faa4ec3bf 100644 --- a/scenarios/ArMemObjectMemory/config/ArVizStorage.cfg +++ b/scenarios/ArMemObjectMemory/config/ArVizStorage.cfg @@ -27,7 +27,7 @@ # ArmarX.ArVizStorage.EnableProfiling = false -# ArmarX.ArVizStorage.HistoryPath: Destination path where the history are serialized to +# ArmarX.ArVizStorage.HistoryPath: Destination path where the history is serialized to # Attributes: # - Default: RobotAPI/ArVizStorage # - Case sensitivity: yes @@ -68,7 +68,7 @@ # ArmarX.ArVizStorage.TopicName = ArVizTopic -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArMemObjectMemory/config/ArticulatedObjectLocalizerExample.cfg b/scenarios/ArMemObjectMemory/config/ArticulatedObjectLocalizerExample.cfg index 9d225df2f4efadbb731a79fd45dbf852189ec80b..ce2498f12be6b0ce2cd02bfab3ebdc4140a797ca 100644 --- a/scenarios/ArMemObjectMemory/config/ArticulatedObjectLocalizerExample.cfg +++ b/scenarios/ArMemObjectMemory/config/ArticulatedObjectLocalizerExample.cfg @@ -60,12 +60,19 @@ # ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.MemoryName = Object -# ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.ProviderName: +# ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.read.ProviderName: # Attributes: # - Default: PriorKnowledgeData # - Case sensitivity: yes # - Required: no -# ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.ProviderName = PriorKnowledgeData +# ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.read.ProviderName = PriorKnowledgeData + + +# ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.write.ProviderName: Name of this provider +# Attributes: +# - Case sensitivity: yes +# - Required: yes +ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.write.ProviderName = sim_track # ArmarX.ArticulatedObjectLocalizerExample.mns.MemoryNameSystemEnabled: Whether to use (and depend on) the Memory Name System (MNS). @@ -94,14 +101,6 @@ # ArmarX.ArticulatedObjectLocalizerExample.tpc.pub.DebugObserver = DebugObserver -# ArmarX.ArticulatedObjectLocalizerExample.tpc.sub.MemoryListener: Name of the `MemoryListener` topic to subscribe to. -# Attributes: -# - Default: MemoryUpdates -# - Case sensitivity: yes -# - Required: no -# ArmarX.ArticulatedObjectLocalizerExample.tpc.sub.MemoryListener = MemoryUpdates - - # ArmarX.ArticulatedObjectLocalizerExample.updateFrequency: Memory update frequency (write). # Attributes: # - Default: 25 @@ -110,7 +109,7 @@ # ArmarX.ArticulatedObjectLocalizerExample.updateFrequency = 25 -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArMemObjectMemory/config/DebugObserver.cfg b/scenarios/ArMemObjectMemory/config/DebugObserver.cfg index 4a0b9dac036cd4d103efd7d1b718d508f285d85a..8dc7ead26b3bd2f7678b3b3e7a1b00c01213225d 100644 --- a/scenarios/ArMemObjectMemory/config/DebugObserver.cfg +++ b/scenarios/ArMemObjectMemory/config/DebugObserver.cfg @@ -18,7 +18,7 @@ # ArmarX.ApplicationName = "" -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArMemObjectMemory/config/MemoryNameSystem.cfg b/scenarios/ArMemObjectMemory/config/MemoryNameSystem.cfg index 7dd22218243ca4f9e67e843da8b42916f3b8568a..b8bc70a66ca7f32a628886ad1bf13e373f9750d3 100644 --- a/scenarios/ArMemObjectMemory/config/MemoryNameSystem.cfg +++ b/scenarios/ArMemObjectMemory/config/MemoryNameSystem.cfg @@ -18,7 +18,7 @@ # ArmarX.ApplicationName = "" -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg b/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg index e67a4c41162632026046dc8402466d2deb7ee233..5e0858b92c6caa5e2aba4453dac7bacef8367318 100644 --- a/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg +++ b/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg @@ -18,7 +18,7 @@ # ArmarX.ApplicationName = "" -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes @@ -92,6 +92,14 @@ # ArmarX.LoggingGroup = "" +# ArmarX.ObjectMemory.ArVizStorageName: Name of the ArViz storage +# Attributes: +# - Default: ArVizStorage +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.ArVizStorageName = ArVizStorage + + # ArmarX.ObjectMemory.ArVizTopicName: Name of the ArViz topic # Attributes: # - Default: ArVizTopic @@ -134,14 +142,6 @@ # ArmarX.ObjectMemory.RemoteGuiName = RemoteGuiProvider -# ArmarX.ObjectMemory.RemoteStateComponentName: Name of the robot state component -# Attributes: -# - Default: RobotStateComponent -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.RemoteStateComponentName = RobotStateComponent - - # ArmarX.ObjectMemory.cmp.KinematicUnitObserverName: Name of the kinematic unit observer. # Attributes: # - Default: KinematicUnitObserver @@ -150,55 +150,6 @@ # ArmarX.ObjectMemory.cmp.KinematicUnitObserverName = KinematicUnitObserver -# ArmarX.ObjectMemory.ltm.00_enabled: -# Attributes: -# - Default: true -# - Case sensitivity: yes -# - Required: no -# - Possible values: {0, 1, false, no, true, yes} -# ArmarX.ObjectMemory.ltm.00_enabled = true - - -# ArmarX.ObjectMemory.ltm.10_host: -# Attributes: -# - Default: localhost -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.ltm.10_host = localhost - - -# ArmarX.ObjectMemory.ltm.11_port: -# Attributes: -# - Default: 25270 -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.ltm.11_port = 25270 - - -# ArmarX.ObjectMemory.ltm.20_user: -# Attributes: -# - Default: "" -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.ltm.20_user = "" - - -# ArmarX.ObjectMemory.ltm.21_password: -# Attributes: -# - Default: "" -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.ltm.21_password = "" - - -# ArmarX.ObjectMemory.ltm.22_database: -# Attributes: -# - Default: Test -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.ltm.22_database = Test - - # ArmarX.ObjectMemory.mem.MemoryName: Name of this memory server. # Attributes: # - Default: Object @@ -207,55 +158,6 @@ # ArmarX.ObjectMemory.mem.MemoryName = Object -# ArmarX.ObjectMemory.mem.articulated.cls.CoreSegmentName: Name of the object instance core segment. -# Attributes: -# - Default: ArticulatedObjectClass -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.mem.articulated.cls.CoreSegmentName = ArticulatedObjectClass - - -# ArmarX.ObjectMemory.mem.articulated.cls.LoadFromObjectsPackage: If true, load the objects from the objects package on startup. -# Attributes: -# - Default: true -# - Case sensitivity: yes -# - Required: no -# - Possible values: {0, 1, false, no, true, yes} -# ArmarX.ObjectMemory.mem.articulated.cls.LoadFromObjectsPackage = true - - -# ArmarX.ObjectMemory.mem.articulated.cls.MaxHistorySize: Maximal size of object poses history (-1 for infinite). -# Attributes: -# - Default: -1 -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.mem.articulated.cls.MaxHistorySize = -1 - - -# ArmarX.ObjectMemory.mem.articulated.cls.ObjectsPackage: Name of the objects package to load from. -# Attributes: -# - Default: PriorKnowledgeData -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.mem.articulated.cls.ObjectsPackage = PriorKnowledgeData - - -# ArmarX.ObjectMemory.mem.articulated.inst.CoreSegmentName: Name of the object instance core segment. -# Attributes: -# - Default: ArticulatedObjectInstance -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.mem.articulated.inst.CoreSegmentName = ArticulatedObjectInstance - - -# ArmarX.ObjectMemory.mem.articulated.inst.MaxHistorySize: Maximal size of object poses history (-1 for infinite). -# Attributes: -# - Default: -1 -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.mem.articulated.inst.MaxHistorySize = -1 - - # ArmarX.ObjectMemory.mem.attachments.CoreSegmentName: Name of the object instance core segment. # Attributes: # - Default: Attachments @@ -272,14 +174,6 @@ # ArmarX.ObjectMemory.mem.attachments.MaxHistorySize = -1 -# ArmarX.ObjectMemory.mem.cls.CoreSegmentName: Name of the object clazz core segment. -# Attributes: -# - Default: Class -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.mem.cls.CoreSegmentName = Class - - # ArmarX.ObjectMemory.mem.cls.Floor.EntityName: Object class entity of the floor. # Attributes: # - Default: Building/floor-20x20 @@ -323,28 +217,28 @@ # ArmarX.ObjectMemory.mem.cls.LoadFromObjectsPackage = true -# ArmarX.ObjectMemory.mem.cls.MaxHistorySize: Maximal size of object poses history (-1 for infinite). +# ArmarX.ObjectMemory.mem.cls.ObjectsPackage: Name of the objects package to load from. # Attributes: -# - Default: -1 +# - Default: PriorKnowledgeData # - Case sensitivity: yes # - Required: no -# ArmarX.ObjectMemory.mem.cls.MaxHistorySize = -1 +# ArmarX.ObjectMemory.mem.cls.ObjectsPackage = PriorKnowledgeData -# ArmarX.ObjectMemory.mem.cls.ObjectsPackage: Name of the objects package to load from. +# ArmarX.ObjectMemory.mem.cls.seg.CoreMaxHistorySize: Maximal size of the Class entity histories (-1 for infinite). # Attributes: -# - Default: PriorKnowledgeData +# - Default: -1 # - Case sensitivity: yes # - Required: no -# ArmarX.ObjectMemory.mem.cls.ObjectsPackage = PriorKnowledgeData +# ArmarX.ObjectMemory.mem.cls.seg.CoreMaxHistorySize = -1 -# ArmarX.ObjectMemory.mem.inst.CoreSegmentName: Name of the object instance core segment. +# ArmarX.ObjectMemory.mem.cls.seg.CoreSegmentName: Name of the Class core segment. # Attributes: -# - Default: Instance +# - Default: Class # - Case sensitivity: yes # - Required: no -# ArmarX.ObjectMemory.mem.inst.CoreSegmentName = Instance +# ArmarX.ObjectMemory.mem.cls.seg.CoreSegmentName = Class # ArmarX.ObjectMemory.mem.inst.DiscardSnapshotsWhileAttached: If true, no new snapshots are stored while an object is attached to a robot node. @@ -357,14 +251,6 @@ # ArmarX.ObjectMemory.mem.inst.DiscardSnapshotsWhileAttached = true -# ArmarX.ObjectMemory.mem.inst.MaxHistorySize: Maximal size of object poses history (-1 for infinite). -# Attributes: -# - Default: 25 -# - Case sensitivity: yes -# - Required: no -# ArmarX.ObjectMemory.mem.inst.MaxHistorySize = 25 - - # ArmarX.ObjectMemory.mem.inst.calibration.offset: Offset for the node to be calibrated. # Attributes: # - Default: 0 @@ -472,8 +358,9 @@ # ArmarX.ObjectMemory.mem.inst.scene.11_Directory = scenes -# ArmarX.ObjectMemory.mem.inst.scene.12_SnapshotToLoad: Scene snapshot to load on startup (e.g. 'Scene_2021-06-24_20-20-03'). -# You can also specify paths relative to 'Package/scenes/'. +# ArmarX.ObjectMemory.mem.inst.scene.12_SnapshotToLoad: Scene to load on startup (e.g. 'Scene_2021-06-24_20-20-03'). +# You can also specify paths relative to 'Package/scenes/'. +# You can also specify a ; separated list of scenes. # Attributes: # - Default: "" # - Case sensitivity: yes @@ -481,6 +368,22 @@ # ArmarX.ObjectMemory.mem.inst.scene.12_SnapshotToLoad = "" +# ArmarX.ObjectMemory.mem.inst.seg.CoreMaxHistorySize: Maximal size of the Instance entity histories (-1 for infinite). +# Attributes: +# - Default: 64 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.inst.seg.CoreMaxHistorySize = 64 + + +# ArmarX.ObjectMemory.mem.inst.seg.CoreSegmentName: Name of the Instance core segment. +# Attributes: +# - Default: Instance +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.inst.seg.CoreSegmentName = Instance + + # ArmarX.ObjectMemory.mem.inst.visu.alpha: Alpha of objects (1 = solid, 0 = transparent). # Attributes: # - Default: 1 @@ -515,6 +418,32 @@ # ArmarX.ObjectMemory.mem.inst.visu.frequenzyHz = 25 +# ArmarX.ObjectMemory.mem.inst.visu.gaussians.position: Enable showing pose gaussians (orientation part). +# Attributes: +# - Default: false +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.inst.visu.gaussians.position = false + + +# ArmarX.ObjectMemory.mem.inst.visu.gaussians.positionDisplaced: Displace center orientation (co)variance circle arrows along their rotation axis. +# Attributes: +# - Default: false +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.inst.visu.gaussians.positionDisplaced = false + + +# ArmarX.ObjectMemory.mem.inst.visu.gaussians.positionScale: Scaling of pose gaussians (orientation part). +# Attributes: +# - Default: 100 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.inst.visu.gaussians.positionScale = 100 + + # ArmarX.ObjectMemory.mem.inst.visu.inGlobalFrame: If true, show global poses. If false, show poses in robot frame. # Attributes: # - Default: true @@ -550,6 +479,31 @@ # ArmarX.ObjectMemory.mem.inst.visu.oobbs = false +# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.show: Show arrows linearly predicting object positions. +# Attributes: +# - Default: false +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.show = false + + +# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.timeOffset: The offset (in seconds) to the current time to make predictions for. +# Attributes: +# - Default: 1 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.timeOffset = 1 + + +# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.timeWindow: The time window (in seconds) into the past to perform the regression on. +# Attributes: +# - Default: 2 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.timeWindow = 2 + + # ArmarX.ObjectMemory.mem.inst.visu.useArticulatedModels: Prefer articulated object models if available. # Attributes: # - Default: true @@ -559,6 +513,158 @@ # ArmarX.ObjectMemory.mem.inst.visu.useArticulatedModels = true +# ArmarX.ObjectMemory.mem.ltm..buffer.storeFreq: Frequency to store the buffer to the LTM in Hz. +# Attributes: +# - Default: 10 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.ltm..buffer.storeFreq = 10 + + +# ArmarX.ObjectMemory.mem.ltm.depthImageExtractor.Enabled: +# Attributes: +# - Default: true +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.ltm.depthImageExtractor.Enabled = true + + +# ArmarX.ObjectMemory.mem.ltm.enabled: +# Attributes: +# - Default: false +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.ltm.enabled = false + + +# ArmarX.ObjectMemory.mem.ltm.exrConverter.Enabled: +# Attributes: +# - Default: true +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.ltm.exrConverter.Enabled = true + + +# ArmarX.ObjectMemory.mem.ltm.imageExtractor.Enabled: +# Attributes: +# - Default: true +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.ltm.imageExtractor.Enabled = true + + +# ArmarX.ObjectMemory.mem.ltm.memFreqFilter.Enabled: +# Attributes: +# - Default: false +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.ltm.memFreqFilter.Enabled = false + + +# ArmarX.ObjectMemory.mem.ltm.memFreqFilter.WaitingTime: Waiting time in MS after each LTM update. +# Attributes: +# - Default: -1 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.ltm.memFreqFilter.WaitingTime = -1 + + +# ArmarX.ObjectMemory.mem.ltm.pngConverter.Enabled: +# Attributes: +# - Default: true +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.ltm.pngConverter.Enabled = true + + +# ArmarX.ObjectMemory.mem.ltm.sizeToCompressDataInMegaBytes: The size in MB to compress away the current export. Exports are numbered (lower number means newer). +# Attributes: +# - Default: 1024 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.ltm.sizeToCompressDataInMegaBytes = 1024 + + +# ArmarX.ObjectMemory.mem.ltm.snapEqFilter.Enabled: +# Attributes: +# - Default: false +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.ltm.snapEqFilter.Enabled = false + + +# ArmarX.ObjectMemory.mem.ltm.snapEqFilter.MaxWaitingTime: Max Waiting time in MS after each Entity update. +# Attributes: +# - Default: -1 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.ltm.snapEqFilter.MaxWaitingTime = -1 + + +# ArmarX.ObjectMemory.mem.ltm.snapFreqFilter.Enabled: +# Attributes: +# - Default: false +# - Case sensitivity: yes +# - Required: no +# - Possible values: {0, 1, false, no, true, yes} +# ArmarX.ObjectMemory.mem.ltm.snapFreqFilter.Enabled = false + + +# ArmarX.ObjectMemory.mem.ltm.snapFreqFilter.WaitingTime: Waiting time in MS after each Entity update. +# Attributes: +# - Default: -1 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.ltm.snapFreqFilter.WaitingTime = -1 + + +# ArmarX.ObjectMemory.mem.ltm.storagepath: The path to the memory storage (the memory will be stored in a seperate subfolder). +# Attributes: +# - Default: Default value not mapped. +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.ltm.storagepath = Default value not mapped. + + +# ArmarX.ObjectMemory.mem.robot_state.Memory: +# Attributes: +# - Default: RobotState +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.robot_state.Memory = RobotState + + +# ArmarX.ObjectMemory.mem.robot_state.descriptionSegment: +# Attributes: +# - Default: Description +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.robot_state.descriptionSegment = Description + + +# ArmarX.ObjectMemory.mem.robot_state.localizationSegment: +# Attributes: +# - Default: Localization +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.robot_state.localizationSegment = Localization + + +# ArmarX.ObjectMemory.mem.robot_state.proprioceptionSegment: +# Attributes: +# - Default: Proprioception +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectMemory.mem.robot_state.proprioceptionSegment = Proprioception + + # ArmarX.ObjectMemory.mns.MemoryNameSystemEnabled: Whether to use (and depend on) the Memory Name System (MNS). # Set to false to use this memory as a stand-alone. # Attributes: @@ -577,28 +683,28 @@ # ArmarX.ObjectMemory.mns.MemoryNameSystemName = MemoryNameSystem -# ArmarX.ObjectMemory.tpc.pub.DebugObserver: Name of the `DebugObserver` topic to publish data to. +# ArmarX.ObjectMemory.prediction.TimeWindow: Duration of time window into the past to use for predictions when requested via the PredictingMemoryInterface (in seconds). # Attributes: -# - Default: DebugObserver +# - Default: 2 # - Case sensitivity: yes # - Required: no -# ArmarX.ObjectMemory.tpc.pub.DebugObserver = DebugObserver +# ArmarX.ObjectMemory.prediction.TimeWindow = 2 -# ArmarX.ObjectMemory.tpc.pub.MemoryListener: Name of the `MemoryListener` topic to publish data to. +# ArmarX.ObjectMemory.robotName: # Attributes: -# - Default: MemoryUpdates +# - Default: Armar6 # - Case sensitivity: yes # - Required: no -# ArmarX.ObjectMemory.tpc.pub.MemoryListener = MemoryUpdates +# ArmarX.ObjectMemory.robotName = Armar6 -# ArmarX.ObjectMemory.tpc.sub.MemoryListener: Name of the `MemoryListener` topic to subscribe to. +# ArmarX.ObjectMemory.tpc.pub.DebugObserver: Name of the `DebugObserver` topic to publish data to. # Attributes: -# - Default: MemoryUpdates +# - Default: DebugObserver # - Case sensitivity: yes # - Required: no -# ArmarX.ObjectMemory.tpc.sub.MemoryListener = MemoryUpdates +# ArmarX.ObjectMemory.tpc.pub.DebugObserver = DebugObserver # ArmarX.ObjectMemory.tpc.sub.ObjectPoseTopic: Name of the `ObjectPoseTopic` topic to subscribe to. diff --git a/scenarios/ArMemObjectMemory/config/ObjectPoseClientExample.cfg b/scenarios/ArMemObjectMemory/config/ObjectPoseClientExample.cfg index f75bad15e903fd399e990eb38dce28887c537d98..e64f75326949fb3263f378a19067aa2b8f85c00d 100644 --- a/scenarios/ArMemObjectMemory/config/ObjectPoseClientExample.cfg +++ b/scenarios/ArMemObjectMemory/config/ObjectPoseClientExample.cfg @@ -18,7 +18,7 @@ # ArmarX.ApplicationName = "" -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes @@ -92,6 +92,14 @@ # ArmarX.LoggingGroup = "" +# ArmarX.ObjectPoseClientExample.ArVizStorageName: Name of the ArViz storage +# Attributes: +# - Default: ArVizStorage +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectPoseClientExample.ArVizStorageName = ArVizStorage + + # ArmarX.ObjectPoseClientExample.ArVizTopicName: Name of the ArViz topic # Attributes: # - Default: ArVizTopic @@ -142,6 +150,22 @@ # ArmarX.ObjectPoseClientExample.ObjectName = "" +# ArmarX.ObjectPoseClientExample.predictions.NumberPerObject: How many predictions with increasing time offsets to make per object. +# Attributes: +# - Default: 5 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectPoseClientExample.predictions.NumberPerObject = 5 + + +# ArmarX.ObjectPoseClientExample.predictions.TimeIncrement: The size of the prediction time offset increment in milliseconds. +# Attributes: +# - Default: 200 +# - Case sensitivity: yes +# - Required: no +# ArmarX.ObjectPoseClientExample.predictions.TimeIncrement = 200 + + # ArmarX.RedirectStdout: Redirect std::cout and std::cerr to ArmarXLog # Attributes: # - Default: true diff --git a/scenarios/ArMemObjectMemory/config/ObjectPoseProviderExample.cfg b/scenarios/ArMemObjectMemory/config/ObjectPoseProviderExample.cfg index 76fbf317102eb56ab01bfd0037544c69f85c6c27..5cb44d32cf1e0a1d8fea853e5b8c07603c4a0c6f 100644 --- a/scenarios/ArMemObjectMemory/config/ObjectPoseProviderExample.cfg +++ b/scenarios/ArMemObjectMemory/config/ObjectPoseProviderExample.cfg @@ -18,7 +18,7 @@ # ArmarX.ApplicationName = "" -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArMemObjectMemory/config/RemoteGuiProviderApp.cfg b/scenarios/ArMemObjectMemory/config/RemoteGuiProviderApp.cfg index 4fd690cefd94559b207493cf40e346a3e47f3b12..4b6abea40d72afd7d313ee47a9b191f3b26de30d 100644 --- a/scenarios/ArMemObjectMemory/config/RemoteGuiProviderApp.cfg +++ b/scenarios/ArMemObjectMemory/config/RemoteGuiProviderApp.cfg @@ -18,7 +18,7 @@ # ArmarX.ApplicationName = "" -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArViz/config/ArVizStorage.cfg b/scenarios/ArViz/config/ArVizStorage.cfg index 30b8ea5904d318cf689370e81d3d3a7c47d07a68..302ac28c37dd28de3e68fb4fe4c2174faa4ec3bf 100644 --- a/scenarios/ArViz/config/ArVizStorage.cfg +++ b/scenarios/ArViz/config/ArVizStorage.cfg @@ -27,7 +27,7 @@ # ArmarX.ArVizStorage.EnableProfiling = false -# ArmarX.ArVizStorage.HistoryPath: Destination path where the history are serialized to +# ArmarX.ArVizStorage.HistoryPath: Destination path where the history is serialized to # Attributes: # - Default: RobotAPI/ArVizStorage # - Case sensitivity: yes diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.cpp b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.cpp index 0a4d7031aad04aaf9cf42a044b1d1667b3c02ce3..2e4c5851c2417c67158785cb31226b03fff7c269 100644 --- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.cpp +++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.cpp @@ -35,9 +35,13 @@ armarx::HandUnitConfigDialog::HandUnitConfigDialog(QWidget* parent) : setName(getDefaultName()); // @@@ This is necessary for more than 1 widget or even reopening the widget. - proxyFinder = new IceProxyFinder<HandUnitInterfacePrx>(this); - proxyFinder->setSearchMask("*Unit"); - ui->proxyFinderContainer->addWidget(proxyFinder, 0, 0, 1, 1); + proxyFinderLeftHand = new IceProxyFinder<HandUnitInterfacePrx>(this); + proxyFinderLeftHand->setSearchMask("*Unit"); + ui->proxyFinderContainerLeftHand->addWidget(proxyFinderLeftHand, 0, 0, 1, 1); + + proxyFinderRightHand = new IceProxyFinder<HandUnitInterfacePrx>(this); + proxyFinderRightHand->setSearchMask("*Unit"); + ui->proxyFinderContainerRightHand->addWidget(proxyFinderRightHand, 0, 0, 1, 1); } armarx::HandUnitConfigDialog::~HandUnitConfigDialog() @@ -49,7 +53,8 @@ armarx::HandUnitConfigDialog::~HandUnitConfigDialog() void armarx::HandUnitConfigDialog::onInitComponent() { - proxyFinder->setIceManager(getIceManager()); + proxyFinderLeftHand->setIceManager(getIceManager()); + proxyFinderRightHand->setIceManager(getIceManager()); } void armarx::HandUnitConfigDialog::onConnectComponent() diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.h b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.h index 1ed61c68cc05ded112d6a0515acae2008ab17602..149d8ce6101c2484d2a40e45d903d0faf45ed491 100644 --- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.h +++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.h @@ -58,7 +58,8 @@ namespace armarx private: Ui::HandUnitConfigDialog* ui; - IceProxyFinderBase* proxyFinder; + IceProxyFinderBase* proxyFinderLeftHand; + IceProxyFinderBase* proxyFinderRightHand; std::string uuid; friend class HandUnitWidget; diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.ui b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.ui index 844cc1788efaa923a720bc1e08c8e00cab82de32..3197505fadbb74544a4c3e4ad14e01c521357226 100644 --- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.ui +++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.ui @@ -7,48 +7,116 @@ <x>0</x> <y>0</y> <width>527</width> - <height>113</height> + <height>179</height> </rect> </property> <property name="windowTitle"> <string>Dialog</string> </property> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="3" column="0"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - <item row="0" column="0"> - <layout class="QGridLayout" name="gridLayout"> - <item row="1" column="1"> - <widget class="QLineEdit" name="editHandName"> - <property name="readOnly"> - <bool>true</bool> - </property> - <property name="placeholderText"> - <string>will be retrieved from HandUnit</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="labelHandName"> - <property name="text"> - <string>Hand Name</string> - </property> - </widget> - </item> - <item row="0" column="0" colspan="2"> - <layout class="QGridLayout" name="proxyFinderContainer"/> - </item> - </layout> - </item> - </layout> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="geometry"> + <rect> + <x>350</x> + <y>150</y> + <width>166</width> + <height>25</height> + </rect> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + <widget class="QLabel" name="labelLeftHandName"> + <property name="geometry"> + <rect> + <x>20</x> + <y>50</y> + <width>111</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string>Left Hand Name</string> + </property> + </widget> + <widget class="QLineEdit" name="editLeftHandName"> + <property name="geometry"> + <rect> + <x>166</x> + <y>50</y> + <width>351</width> + <height>25</height> + </rect> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + <property name="placeholderText"> + <string>will be retrieved from HandUnit</string> + </property> + </widget> + <widget class="QLineEdit" name="editRightHandName"> + <property name="geometry"> + <rect> + <x>166</x> + <y>120</y> + <width>351</width> + <height>25</height> + </rect> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + <property name="placeholderText"> + <string>will be retrieved from HandUnit</string> + </property> + </widget> + <widget class="QLabel" name="labelRightHandName"> + <property name="geometry"> + <rect> + <x>20</x> + <y>120</y> + <width>121</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string>Right Hand Name</string> + </property> + </widget> + <widget class="QWidget" name="layoutWidget"> + <property name="geometry"> + <rect> + <x>10</x> + <y>80</y> + <width>511</width> + <height>35</height> + </rect> + </property> + <layout class="QGridLayout" name="gridLayoutRightHand"> + <item row="0" column="0"> + <layout class="QGridLayout" name="proxyFinderContainerRightHand"/> + </item> + </layout> + </widget> + <widget class="QWidget" name=""> + <property name="geometry"> + <rect> + <x>9</x> + <y>9</y> + <width>511</width> + <height>35</height> + </rect> + </property> + <layout class="QGridLayout" name="gridLayoutLeftHand"> + <item row="0" column="0" colspan="2"> + <layout class="QGridLayout" name="proxyFinderContainerLeftHand"/> + </item> + </layout> + </widget> </widget> <tabstops> <tabstop>buttonBox</tabstop> diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.cpp b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.cpp index 5c86b2dda49248a4148b5f3c83785272a94789f9..ea3190228596e928bc349b9fd1a063c88025cc63 100644 --- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.cpp +++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.cpp @@ -35,6 +35,9 @@ #include <QLineEdit> #include <QMessageBox> #include <QTimer> +#include <QtWidgets/QSlider> +#include <QtWidgets/QTableWidgetItem> +#include <QString> #include <cmath> @@ -46,60 +49,107 @@ namespace armarx } HandUnitWidget::HandUnitWidget() : - handName("NOT SET YET"), - handUnitProxyName(""), - setJointAnglesFlag(false) + leftHandName("NOT SET YET"), + rightHandName("NOT SET YET"), + leftHandUnitProxyName(""), + rightHandUnitProxyName(""), + setLeftHandJointAnglesFlag(false), + setRightHandJointAnglesFlag(false) { // init gui ui.setupUi(getWidget()); - jointAngleUpdateTask = new PeriodicTask<HandUnitWidget>(this, &HandUnitWidget::setJointAngles, 50); + setLeftHandJointAngleUpdateTask = new PeriodicTask<HandUnitWidget>(this, &HandUnitWidget::setLeftHandJointAngles, 50); + setRightHandJointAngleUpdateTask = new PeriodicTask<HandUnitWidget>(this, &HandUnitWidget::setRightHandJointAngles, 50); updateInfoTimer = new QTimer(this); } void HandUnitWidget::onInitComponent() { - usingProxy(handUnitProxyName); + usingProxy(leftHandUnitProxyName); + usingProxy(rightHandUnitProxyName); //usingTopic(handName + "State"); //ARMARX_WARNING << "Listening on Topic: " << handName + "State"; } void HandUnitWidget::onConnectComponent() { - connectSlots(); - jointAngleUpdateTask->start(); updateInfoTimer->start(50); - handUnitProxy = getProxy<HandUnitInterfacePrx>(handUnitProxyName); - handName = handUnitProxy->getHandName(); - // @@@ In simulation hand is called 'Hand L'/'Hand R'. On 3b Hand is called 'TCP R' - if (handName != "Hand L" && handName != "Hand R" && handName != "TCP L" && handName != "TCP R") + + setLeftHandJointAngleUpdateTask->start(); + + leftHandUnitProxy = getProxy<HandUnitInterfacePrx>(leftHandUnitProxyName); + leftHandName = leftHandUnitProxy->getHandName(); + + if (leftHandName == "Hand L" || leftHandName == "TCP L") { - //QMessageBox::warning(NULL, "Hand not supported", QString("Hand with name \"") + QString::fromStdString(handName) + " \" is not suppored."); - ARMARX_WARNING << "Hand with name \"" << handName << "\" is not supported."; + leftHandConversionFactor *= M_PI / 2; + } + else if (leftHandName != "Hand_L_EEF") + { + ARMARX_WARNING << "Left hand with name \"" << leftHandName << "\" is not supported."; } - //ui.labelInfo->setText(QString::fromStdString(handUnitProxyName + " :: " + handName)); + SingleTypeVariantListPtr leftHandPreshapeStrings = SingleTypeVariantListPtr::dynamicCast(leftHandUnitProxy->getShapeNames()); + QStringList leftHandList; + int leftHandPreshapeCount = leftHandPreshapeStrings->getSize(); - SingleTypeVariantListPtr preshapeStrings = SingleTypeVariantListPtr::dynamicCast(handUnitProxy->getShapeNames()); - QStringList list; - int preshapeCount = preshapeStrings->getSize(); + for (int i = 0; i < leftHandPreshapeCount; ++i) + { + std::string shape = ((leftHandPreshapeStrings->getVariant(i))->get<std::string>()); +// ARMARX_INFO << VAROUT(shape); + leftHandList << QString::fromStdString(shape); + } - for (int i = 0; i < preshapeCount; ++i) + ui.comboLeftHandPreshapes->clear(); + ui.comboLeftHandPreshapes->addItems(leftHandList); + + + + setRightHandJointAngleUpdateTask->start(); + + rightHandUnitProxy = getProxy<HandUnitInterfacePrx>(rightHandUnitProxyName); + rightHandName = rightHandUnitProxy->getHandName(); + + if (rightHandName == "Hand R" || rightHandName == "TCP R") { - std::string shape = ((preshapeStrings->getVariant(i))->get<std::string>()); - list << QString::fromStdString(shape); + rightHandConversionFactor *= M_PI / 2; } + else if (rightHandName != "Hand_R_EEF") + { + ARMARX_WARNING << "Right hand with name \"" << rightHandName << "\" is not supported."; + } + + SingleTypeVariantListPtr rightHandPreshapeStrings = SingleTypeVariantListPtr::dynamicCast(rightHandUnitProxy->getShapeNames()); + QStringList rightHandList; + int rightHandPreshapeCount = rightHandPreshapeStrings->getSize(); + + for (int i = 0; i < rightHandPreshapeCount; ++i) + { + std::string shape = ((rightHandPreshapeStrings->getVariant(i))->get<std::string>()); +// ARMARX_INFO << VAROUT(shape); + rightHandList << QString::fromStdString(shape); + } + + ui.comboRightHandPreshapes->clear(); + ui.comboRightHandPreshapes->addItems(rightHandList); - ui.comboPreshapes->clear(); - ui.comboPreshapes->addItems(list); + + +// ARMARX_INFO << "initGUIJointFrames"; + initGUIJointFrames(); + displayJointAngleUpdateTask = new PeriodicTask<HandUnitWidget>(this, &HandUnitWidget::updateJointValueTable, 50); + displayJointAngleUpdateTask->start(); } void HandUnitWidget::onDisconnectComponent() { - jointAngleUpdateTask->stop(); + setLeftHandJointAngleUpdateTask->stop(); + setRightHandJointAngleUpdateTask->stop(); + displayJointAngleUpdateTask->stop(); updateInfoTimer->stop(); } @@ -121,136 +171,323 @@ namespace armarx void HandUnitWidget::configured() { - handUnitProxyName = dialog->proxyFinder->getSelectedProxyName().toStdString(); + leftHandUnitProxyName = dialog->proxyFinderLeftHand->getSelectedProxyName().toStdString(); + rightHandUnitProxyName = dialog->proxyFinderRightHand->getSelectedProxyName().toStdString(); } - void HandUnitWidget::preshapeHand() + void HandUnitWidget::preshapeLeftHand() { - setPreshape(ui.comboPreshapes->currentText().toUtf8().data()); + setLeftHandPreshape(ui.comboLeftHandPreshapes->currentText().toUtf8().data()); } - void HandUnitWidget::setJointAngles() + void HandUnitWidget::preshapeRightHand() { - if (!handUnitProxy) + setRightHandPreshape(ui.comboRightHandPreshapes->currentText().toUtf8().data()); + } + + void HandUnitWidget::setLeftHandJointAngles() + { +// ARMARX_INFO << "setLeftHandJointAngles"; + if (!leftHandUnitProxy) { ARMARX_WARNING << "invalid proxy"; return; } - if (!setJointAnglesFlag) + if (!setLeftHandJointAnglesFlag) + { + return; + } + + setLeftHandJointAnglesFlag = false; + + NameValueMap leftHandJa; + NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues(); + float value = 0; + if (leftHandName == "Hand L" || leftHandName == "TCP L") { + leftHandConversionFactor *= M_PI / 2; + } + else if (leftHandName != "Hand_L_EEF") + { + ARMARX_WARNING << "Left hand with name \"" << leftHandName << "\" is not supported."; return; } - setJointAnglesFlag = false; + for (const auto& pair : currentLeftHandJointValues) + { + if (pair.first == currentLeftHandJoint) + { + value = static_cast<float>(ui.horizontalSliderLeftHandJointPos->value() * leftHandConversionFactor); +// ARMARX_INFO << VAROUT(value); + leftHandJa[pair.first] = value; + break; + } + } - NameValueMap ja; +// ARMARX_INFO << VAROUT(value / leftHandConversionFactor); + ui.lcdNumberLeftHandJointValue->display(value / leftHandConversionFactor); + leftHandUnitProxy->setJointAngles(leftHandJa); + } - if (handName == "Hand L" || handName == "TCP L") + void HandUnitWidget::setRightHandJointAngles() + { +// ARMARX_INFO << "setRightHandJointAngles"; + if (!rightHandUnitProxy) { - ja["Hand Palm 2 L"] = ui.horizontalSliderPalm->value() * M_PI / 180; - ja["Index L J0"] = ui.horizontalSliderIndexJ0->value() * M_PI / 180; - ja["Index L J1"] = ui.horizontalSliderIndexJ1->value() * M_PI / 180; - ja["Middle L J0"] = ui.horizontalSliderMiddleJ0->value() * M_PI / 180; - ja["Middle L J1"] = ui.horizontalSliderMiddleJ1->value() * M_PI / 180; - ja["Thumb L J0"] = ui.horizontalSliderThumbJ0->value() * M_PI / 180; - ja["Thumb L J1"] = ui.horizontalSliderThumbJ1->value() * M_PI / 180; - float rinkyValue = ui.horizontalSliderRinky->value() * M_PI / 180; - ja["Ring L J0"] = rinkyValue; - ja["Ring L J1"] = rinkyValue; - ja["Pinky L J0"] = rinkyValue; - ja["Pinky L J1"] = rinkyValue; + ARMARX_WARNING << "invalid proxy"; + return; } - else if (handName == "Hand R" || handName == "TCP R") + + if (!setRightHandJointAnglesFlag) { - ja["Hand Palm 2 R"] = ui.horizontalSliderPalm->value() * M_PI / 180; - ja["Index R J0"] = ui.horizontalSliderIndexJ0->value() * M_PI / 180; - ja["Index R J1"] = ui.horizontalSliderIndexJ1->value() * M_PI / 180; - ja["Middle R J0"] = ui.horizontalSliderMiddleJ0->value() * M_PI / 180; - ja["Middle R J1"] = ui.horizontalSliderMiddleJ1->value() * M_PI / 180; - ja["Thumb R J0"] = ui.horizontalSliderThumbJ0->value() * M_PI / 180; - ja["Thumb R J1"] = ui.horizontalSliderThumbJ1->value() * M_PI / 180; - float rinkyValue = ui.horizontalSliderRinky->value() * M_PI / 180; - ja["Ring R J0"] = rinkyValue; - ja["Ring R J1"] = rinkyValue; - ja["Pinky R J0"] = rinkyValue; - ja["Pinky R J1"] = rinkyValue; + return; } - else + + setRightHandJointAnglesFlag = false; + + NameValueMap rightHandJa; + NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues(); + float value = 0; + if (rightHandName == "Hand R" || rightHandName == "TCP R") + { + rightHandConversionFactor *= M_PI / 2; + } + else if (rightHandName != "Hand_R_EEF") + { + ARMARX_WARNING << "Right hand with name \"" << rightHandName << "\" is not supported."; + return; + } + + for (const auto& pair : currentRightHandJointValues) { - ARMARX_WARNING << "Hand with name \"" << handName << "\" is not supported."; + if (pair.first == currentRightHandJoint) + { + value = static_cast<float>(ui.horizontalSliderRightHandJointPos->value() * rightHandConversionFactor); +// ARMARX_INFO << VAROUT(value); + rightHandJa[pair.first] = value; + break; + } } - handUnitProxy->setJointAngles(ja); +// ARMARX_INFO << VAROUT(value / rightHandConversionFactor); + ui.lcdNumberRightHandJointValue->display(value / rightHandConversionFactor); + rightHandUnitProxy->setJointAngles(rightHandJa); + } + + void HandUnitWidget::requestSetLeftHandJointAngles() + { + setLeftHandJointAnglesFlag = true; } - void HandUnitWidget::requestSetJointAngles() + void HandUnitWidget::requestSetRightHandJointAngles() { - setJointAnglesFlag = true; + setRightHandJointAnglesFlag = true; } - void HandUnitWidget::openHand() + void HandUnitWidget::openLeftHand() { - setPreshape("Open"); + setLeftHandPreshape("Open"); } - void HandUnitWidget::closeHand() + void HandUnitWidget::openRightHand() { - setPreshape("Close"); + setRightHandPreshape("Open"); } - void HandUnitWidget::closeThumb() + void HandUnitWidget::closeLeftHand() { - setPreshape("Thumb"); + setLeftHandPreshape("Close"); } - void HandUnitWidget::relaxHand() + void HandUnitWidget::closeRightHand() { - setPreshape("Relax"); + setRightHandPreshape("Close"); + } + + void HandUnitWidget::relaxLeftHand() + { + setLeftHandPreshape("Relax"); + } + + void HandUnitWidget::relaxRightHand() + { + setRightHandPreshape("Relax"); } void HandUnitWidget::updateInfoLabel() { - ui.labelInfo->setText(QString::fromStdString(handUnitProxyName + " :: " + handName + " State: " + handUnitProxy->describeHandState())); + ui.labelInfoLeftHand->setText(QString::fromStdString(leftHandUnitProxyName + " :: " + leftHandName + " State: " + leftHandUnitProxy->describeHandState())); + ui.labelInfoRightHand->setText(QString::fromStdString(rightHandUnitProxyName + " :: " + rightHandName + " State: " + rightHandUnitProxy->describeHandState())); } - void HandUnitWidget::setPreshape(std::string preshape) + void HandUnitWidget::updateJointValueTable() { - ARMARX_INFO << "Setting new hand shape: " << preshape; - handUnitProxy->setShape(preshape); + NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues(); +// ARMARX_INFO << VAROUT(leftHandUnitProxy->getCurrentJointValues()); + int frameLeftHandRowIdx = 0; + + for (const auto& pair : currentLeftHandJointValues) + { +// ARMARX_INFO << VAROUT(pair.first); + QString name(pair.first.c_str()); + QTableWidgetItem* newItem = new QTableWidgetItem(QString::number(pair.second)); + ui.tableWidgetLeftHand->setItem(frameLeftHandRowIdx, 1, newItem); + frameLeftHandRowIdx++; + } + + + + NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues(); +// ARMARX_INFO << VAROUT(rightHandUnitProxy->getCurrentJointValues()); + int frameRightHandRowIdx = 0; + + for (const auto& pair : currentRightHandJointValues) + { +// ARMARX_INFO << VAROUT(pair.first); + QString name(pair.first.c_str()); + QTableWidgetItem* newItem = new QTableWidgetItem(QString::number(pair.second)); + ui.tableWidgetRightHand->setItem(frameRightHandRowIdx, 1, newItem); + frameRightHandRowIdx++; + } + } + + void HandUnitWidget::selectLeftHandJoint(int i) + { +// ARMARX_INFO << "selectLeftHandJoint " << i; + NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues(); + int idx = 0; + + for (const auto& pair: currentLeftHandJointValues) + { + if (idx == i) + { + currentLeftHandJoint = pair.first; + int convertedValue = static_cast<int>(pair.second / leftHandConversionFactor); + ui.horizontalSliderLeftHandJointPos->setSliderPosition(convertedValue); + ui.lcdNumberLeftHandJointValue->display(convertedValue); +// ARMARX_INFO << "Found joint"; + break; + } + idx++; + } + } + + void HandUnitWidget::selectRightHandJoint(int i) + { +// ARMARX_INFO << "selectRightHandJoint " << i; + NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues(); + int idx = 0; + + for (const auto& pair: currentRightHandJointValues) + { + if (idx == i) + { + currentRightHandJoint = pair.first; + int convertedValue = static_cast<int>(pair.second / rightHandConversionFactor); + ui.horizontalSliderRightHandJointPos->setSliderPosition(convertedValue); + ui.lcdNumberRightHandJointValue->display(convertedValue); +// ARMARX_INFO << "Found joint"; + break; + } + idx++; + } + } + + void HandUnitWidget::setLeftHandPreshape(std::string preshape) + { +// ARMARX_INFO << "Setting new left hand shape: " << preshape; + leftHandUnitProxy->setShape(preshape); + } + + void HandUnitWidget::setRightHandPreshape(std::string preshape) + { +// ARMARX_INFO << "Setting new right hand shape: " << preshape; + rightHandUnitProxy->setShape(preshape); } void HandUnitWidget::loadSettings(QSettings* settings) { - handUnitProxyName = settings->value("handUnitProxyName", QString::fromStdString(handUnitProxyName)).toString().toStdString(); - handName = settings->value("handName", QString::fromStdString(handName)).toString().toStdString(); + leftHandUnitProxyName = settings->value("leftHandUnitProxyName", QString::fromStdString(leftHandUnitProxyName)).toString().toStdString(); + leftHandName = settings->value("leftHandName", QString::fromStdString(leftHandName)).toString().toStdString(); + rightHandUnitProxyName = settings->value("rightHandUnitProxyName", QString::fromStdString(rightHandUnitProxyName)).toString().toStdString(); + rightHandName = settings->value("rightHandName", QString::fromStdString(rightHandName)).toString().toStdString(); } void HandUnitWidget::saveSettings(QSettings* settings) { - settings->setValue("handUnitProxyName", QString::fromStdString(handUnitProxyName)); - settings->setValue("handName", QString::fromStdString(handName)); - } - - - void HandUnitWidget::connectSlots() - { - connect(ui.buttonPreshape, SIGNAL(clicked()), this, SLOT(preshapeHand()), Qt::UniqueConnection); - connect(ui.buttonOpenHand, SIGNAL(clicked()), this, SLOT(openHand()), Qt::UniqueConnection); - connect(ui.buttonCloseHand, SIGNAL(clicked()), this, SLOT(closeHand()), Qt::UniqueConnection); - connect(ui.buttonCloseThumb, SIGNAL(clicked()), this, SLOT(closeThumb()), Qt::UniqueConnection); - connect(ui.buttonRelaxHand, SIGNAL(clicked()), this, SLOT(relaxHand()), Qt::UniqueConnection); - //connect(ui.comboPreshapes, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(selectPreshape(const QString&)), Qt::UniqueConnection); - connect(ui.buttonSetJointAngles, SIGNAL(clicked()), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection); - connect(ui.horizontalSliderIndexJ0, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection); - connect(ui.horizontalSliderIndexJ1, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection); - connect(ui.horizontalSliderMiddleJ0, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection); - connect(ui.horizontalSliderMiddleJ1, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection); - connect(ui.horizontalSliderRinky, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection); - connect(ui.horizontalSliderPalm, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection); - connect(ui.horizontalSliderThumbJ0, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection); - connect(ui.horizontalSliderThumbJ1, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection); - connect(updateInfoTimer, SIGNAL(timeout()), this, SLOT(updateInfoLabel())); + settings->setValue("leftHandUnitProxyName", QString::fromStdString(leftHandUnitProxyName)); + settings->setValue("leftHandName", QString::fromStdString(leftHandName)); + settings->setValue("rightHandUnitProxyName", QString::fromStdString(rightHandUnitProxyName)); + settings->setValue("rightHandName", QString::fromStdString(rightHandName)); + } + + + void HandUnitWidget::initGUIJointFrames() + { + NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues(); +// ARMARX_INFO << VAROUT(leftHandUnitProxy->getCurrentJointValues()); + int frameLeftHandRowIdx = 0; + + connect(ui.buttonPreshapeLeftHand, SIGNAL(clicked()), this, SLOT(preshapeLeftHand()), Qt::UniqueConnection); + connect(ui.buttonOpenLeftHand, SIGNAL(clicked()), this, SLOT(openLeftHand()), Qt::UniqueConnection); + connect(ui.buttonCloseLeftHand, SIGNAL(clicked()), this, SLOT(closeLeftHand()), Qt::UniqueConnection); + connect(ui.buttonRelaxLeftHand, SIGNAL(clicked()), this, SLOT(relaxLeftHand()), Qt::UniqueConnection); + ui.horizontalSliderLeftHandJointPos->setMaximum(100); + ui.horizontalSliderLeftHandJointPos->setMinimum(0); + connect(ui.horizontalSliderLeftHandJointPos, SIGNAL(sliderMoved(int)), this, SLOT(requestSetLeftHandJointAngles()), Qt::UniqueConnection); + connect(ui.comboLeftHandJoints, SIGNAL(currentIndexChanged(int)), this, SLOT(selectLeftHandJoint(int)), Qt::UniqueConnection); + + ui.tableWidgetLeftHand->setRowCount(currentLeftHandJointValues.size()); + ui.tableWidgetLeftHand->setColumnCount(2); + + ui.comboLeftHandJoints->clear(); + + qRegisterMetaType<QVector<int> >("QVector<int>"); + for (const auto& pair : currentLeftHandJointValues) + { +// ARMARX_INFO << VAROUT(pair.first); + QString name(pair.first.c_str()); + QTableWidgetItem* newItem = new QTableWidgetItem(name); + ui.tableWidgetLeftHand->setItem(frameLeftHandRowIdx, 0, newItem); + ui.comboLeftHandJoints->addItem(name); + frameLeftHandRowIdx++; + } + + ui.comboLeftHandJoints->setCurrentIndex(-1); + + + + NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues(); +// ARMARX_INFO << VAROUT(rightHandUnitProxy->getCurrentJointValues()); + int frameRightHandRowIdx = 0; + + connect(ui.buttonPreshapeRightHand, SIGNAL(clicked()), this, SLOT(preshapeRightHand()), Qt::UniqueConnection); + connect(ui.buttonOpenRightHand, SIGNAL(clicked()), this, SLOT(openRightHand()), Qt::UniqueConnection); + connect(ui.buttonCloseRightHand, SIGNAL(clicked()), this, SLOT(closeRightHand()), Qt::UniqueConnection); + connect(ui.buttonRelaxRightHand, SIGNAL(clicked()), this, SLOT(relaxRightHand()), Qt::UniqueConnection); + ui.horizontalSliderRightHandJointPos->setMaximum(100); + ui.horizontalSliderRightHandJointPos->setMinimum(0); + connect(ui.horizontalSliderRightHandJointPos, SIGNAL(sliderMoved(int)), this, SLOT(requestSetRightHandJointAngles()), Qt::UniqueConnection); + connect(ui.comboRightHandJoints, SIGNAL(currentIndexChanged(int)), this, SLOT(selectRightHandJoint(int)), Qt::UniqueConnection); + + ui.tableWidgetRightHand->setRowCount(currentRightHandJointValues.size()); + ui.tableWidgetRightHand->setColumnCount(2); + + ui.comboRightHandJoints->clear(); + + qRegisterMetaType<QVector<int> >("QVector<int>"); + for (const auto& pair : currentRightHandJointValues) + { +// ARMARX_INFO << VAROUT(pair.first); + QString name(pair.first.c_str()); + QTableWidgetItem* newItem = new QTableWidgetItem(name); + ui.tableWidgetRightHand->setItem(frameRightHandRowIdx, 0, newItem); + ui.comboRightHandJoints->addItem(name); + frameRightHandRowIdx++; + } + + ui.comboRightHandJoints->setCurrentIndex(-1); } diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.h b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.h index 2e7968738f29b200a0b5bf14f2f5358024762943..24d7900cedbff8c64539a33f6bc8b251af88fc26 100644 --- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.h +++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.h @@ -112,36 +112,55 @@ namespace armarx public slots: - void preshapeHand(); - void setJointAngles(); - void requestSetJointAngles(); - void openHand(); - void closeHand(); - void closeThumb(); - void relaxHand(); + void preshapeLeftHand(); + void preshapeRightHand(); + void setLeftHandJointAngles(); + void setRightHandJointAngles(); + void requestSetLeftHandJointAngles(); + void requestSetRightHandJointAngles(); + void openLeftHand(); + void openRightHand(); + void closeLeftHand(); + void closeRightHand(); + void relaxLeftHand(); + void relaxRightHand(); void updateInfoLabel(); + void updateJointValueTable(); + void selectLeftHandJoint(int i); + void selectRightHandJoint(int i); private: - void setPreshape(std::string preshape); + void setLeftHandPreshape(std::string preshape); + void setRightHandPreshape(std::string preshape); protected: - void connectSlots(); + void initGUIJointFrames(); Ui::HandUnitGuiPlugin ui; private: - std::string handName; + std::string leftHandName; + std::string rightHandName; //std::string preshapeName; - std::string handUnitProxyName; - HandUnitInterfacePrx handUnitProxy; + std::string leftHandUnitProxyName; + std::string rightHandUnitProxyName; + HandUnitInterfacePrx leftHandUnitProxy; + HandUnitInterfacePrx rightHandUnitProxy; //QPointer<QWidget> __widget; QPointer<HandUnitConfigDialog> dialog; - PeriodicTask<HandUnitWidget>::pointer_type jointAngleUpdateTask; + PeriodicTask<HandUnitWidget>::pointer_type setLeftHandJointAngleUpdateTask; + PeriodicTask<HandUnitWidget>::pointer_type setRightHandJointAngleUpdateTask; + PeriodicTask<HandUnitWidget>::pointer_type displayJointAngleUpdateTask; QTimer* updateInfoTimer; - bool setJointAnglesFlag; + bool setLeftHandJointAnglesFlag; + bool setRightHandJointAnglesFlag; + std::basic_string<char> currentLeftHandJoint; + std::basic_string<char> currentRightHandJoint; + double leftHandConversionFactor= 1.0 / 100.0; + double rightHandConversionFactor = 1.0 / 100.0; // HandUnitListener interface diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.ui b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.ui index bda4f4ae305f68c0b8b31a63850f6b8e79e07fdd..cec1e1ea724f251927d10b8a2c167579198b3726 100644 --- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.ui +++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.ui @@ -19,239 +19,401 @@ <property name="windowTitle"> <string>Form</string> </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="1" column="3"> - <widget class="Line" name="line"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - </widget> - </item> - <item row="2" column="1" colspan="7"> - <widget class="QFrame" name="frame"> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="7" column="0"> - <widget class="QLabel" name="label_8"> - <property name="text"> - <string>Rinky</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>Thumb J1</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QSlider" name="horizontalSliderThumbJ1"> - <property name="maximum"> - <number>90</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="7" column="1"> - <widget class="QSlider" name="horizontalSliderRinky"> - <property name="maximum"> - <number>90</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="6" column="0"> - <widget class="QLabel" name="label_7"> - <property name="text"> - <string>Middle J1</string> - </property> - </widget> - </item> - <item row="5" column="0"> - <widget class="QLabel" name="label_6"> - <property name="text"> - <string>Middle J0</string> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="label_5"> - <property name="text"> - <string>Index J1</string> - </property> - </widget> - </item> - <item row="6" column="1"> - <widget class="QSlider" name="horizontalSliderMiddleJ1"> - <property name="maximum"> - <number>90</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="5" column="1"> - <widget class="QSlider" name="horizontalSliderMiddleJ0"> - <property name="maximum"> - <number>90</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QSlider" name="horizontalSliderThumbJ0"> - <property name="maximum"> - <number>90</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>Thumb J0</string> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_4"> - <property name="text"> - <string>Index J0</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QSlider" name="horizontalSliderPalm"> - <property name="maximum"> - <number>90</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QSlider" name="horizontalSliderIndexJ0"> - <property name="maximum"> - <number>90</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QSlider" name="horizontalSliderIndexJ1"> - <property name="maximum"> - <number>90</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="3" column="2" rowspan="2"> - <widget class="QPushButton" name="buttonSetJointAngles"> - <property name="maximumSize"> - <size> - <width>50</width> - <height>16777215</height> - </size> - </property> - <property name="text"> - <string>Set</string> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Palm</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="1" column="7"> - <widget class="QPushButton" name="buttonRelaxHand"> - <property name="text"> - <string>Relax</string> - </property> - </widget> - </item> - <item row="1" column="5"> - <widget class="QPushButton" name="buttonCloseThumb"> - <property name="text"> - <string>Thumb</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QComboBox" name="comboPreshapes"/> - </item> - <item row="1" column="2"> - <widget class="QPushButton" name="buttonPreshape"> - <property name="maximumSize"> - <size> - <width>100</width> - <height>16777215</height> - </size> - </property> - <property name="text"> - <string>Preshape</string> - </property> - </widget> - </item> - <item row="1" column="6"> - <widget class="QPushButton" name="buttonCloseHand"> - <property name="text"> - <string>Close</string> - </property> - </widget> - </item> - <item row="1" column="4"> - <widget class="QPushButton" name="buttonOpenHand"> - <property name="text"> - <string>Open</string> - </property> - </widget> - </item> - <item row="0" column="1" colspan="7"> - <widget class="QLabel" name="labelInfo"> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>20</height> - </size> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string><Info Here></string> - </property> - </widget> - </item> - </layout> + <widget class="Line" name="lineLeftHand"> + <property name="geometry"> + <rect> + <x>146</x> + <y>35</y> + <width>16</width> + <height>25</height> + </rect> + </property> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + <widget class="QFrame" name="frameLeftHand"> + <property name="geometry"> + <rect> + <x>9</x> + <y>156</y> + <width>301</width> + <height>231</height> + </rect> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> + <widget class="QTableWidget" name="tableWidgetLeftHand"/> + </item> + </layout> + </widget> + <widget class="QComboBox" name="comboLeftHandPreshapes"> + <property name="geometry"> + <rect> + <x>9</x> + <y>35</y> + <width>60</width> + <height>25</height> + </rect> + </property> + </widget> + <widget class="QPushButton" name="buttonPreshapeLeftHand"> + <property name="geometry"> + <rect> + <x>71</x> + <y>35</y> + <width>80</width> + <height>25</height> + </rect> + </property> + <property name="maximumSize"> + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>Preshape</string> + </property> + </widget> + <widget class="QPushButton" name="buttonOpenLeftHand"> + <property name="geometry"> + <rect> + <x>157</x> + <y>35</y> + <width>50</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string>Open</string> + </property> + </widget> + <widget class="QLabel" name="labelInfoLeftHand"> + <property name="geometry"> + <rect> + <x>9</x> + <y>9</y> + <width>85</width> + <height>17</height> + </rect> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>20</height> + </size> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string><Info Here></string> + </property> + </widget> + <widget class="Line" name="line"> + <property name="geometry"> + <rect> + <x>310</x> + <y>0</y> + <width>20</width> + <height>401</height> + </rect> + </property> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + <widget class="QPushButton" name="buttonCloseLeftHand"> + <property name="geometry"> + <rect> + <x>209</x> + <y>35</y> + <width>50</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string>Close</string> + </property> + </widget> + <widget class="QPushButton" name="buttonRelaxLeftHand"> + <property name="geometry"> + <rect> + <x>261</x> + <y>35</y> + <width>50</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string>Relax</string> + </property> + </widget> + <widget class="QComboBox" name="comboRightHandPreshapes"> + <property name="geometry"> + <rect> + <x>330</x> + <y>35</y> + <width>60</width> + <height>25</height> + </rect> + </property> + </widget> + <widget class="QPushButton" name="buttonOpenRightHand"> + <property name="geometry"> + <rect> + <x>478</x> + <y>35</y> + <width>50</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string>Open</string> + </property> + </widget> + <widget class="QPushButton" name="buttonPreshapeRightHand"> + <property name="geometry"> + <rect> + <x>392</x> + <y>35</y> + <width>80</width> + <height>25</height> + </rect> + </property> + <property name="maximumSize"> + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>Preshape</string> + </property> + </widget> + <widget class="QPushButton" name="buttonCloseRightHand"> + <property name="geometry"> + <rect> + <x>530</x> + <y>35</y> + <width>50</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string>Close</string> + </property> + </widget> + <widget class="QPushButton" name="buttonRelaxRightHand"> + <property name="geometry"> + <rect> + <x>582</x> + <y>35</y> + <width>50</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string>Relax</string> + </property> + </widget> + <widget class="QLabel" name="labelInfoRightHand"> + <property name="geometry"> + <rect> + <x>330</x> + <y>9</y> + <width>85</width> + <height>17</height> + </rect> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>20</height> + </size> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string><Info Here></string> + </property> + </widget> + <widget class="Line" name="lineRightHand"> + <property name="geometry"> + <rect> + <x>467</x> + <y>35</y> + <width>16</width> + <height>25</height> + </rect> + </property> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + <widget class="QLabel" name="labelSelectLeftHandJoint"> + <property name="geometry"> + <rect> + <x>10</x> + <y>80</y> + <width>81</width> + <height>17</height> + </rect> + </property> + <property name="text"> + <string>Select Joint</string> + </property> + </widget> + <widget class="QComboBox" name="comboLeftHandJoints"> + <property name="geometry"> + <rect> + <x>100</x> + <y>75</y> + <width>150</width> + <height>25</height> + </rect> + </property> + </widget> + <widget class="QLCDNumber" name="lcdNumberLeftHandJointValue"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>117</y> + <width>64</width> + <height>26</height> + </rect> + </property> + <property name="maximumSize"> + <size> + <width>80</width> + <height>100</height> + </size> + </property> + <property name="toolTip"> + <string/> + </property> + <property name="smallDecimalPoint"> + <bool>false</bool> + </property> + </widget> + <widget class="QSlider" name="horizontalSliderLeftHandJointPos"> + <property name="geometry"> + <rect> + <x>90</x> + <y>120</y> + <width>221</width> + <height>16</height> + </rect> + </property> + <property name="maximum"> + <number>100</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + <widget class="QLCDNumber" name="lcdNumberRightHandJointValue"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>330</x> + <y>117</y> + <width>64</width> + <height>26</height> + </rect> + </property> + <property name="maximumSize"> + <size> + <width>80</width> + <height>100</height> + </size> + </property> + <property name="toolTip"> + <string/> + </property> + <property name="smallDecimalPoint"> + <bool>false</bool> + </property> + </widget> + <widget class="QLabel" name="labelSelectRightHandJoint"> + <property name="geometry"> + <rect> + <x>330</x> + <y>80</y> + <width>81</width> + <height>17</height> + </rect> + </property> + <property name="text"> + <string>Select Joint</string> + </property> + </widget> + <widget class="QFrame" name="frameRightHand"> + <property name="geometry"> + <rect> + <x>329</x> + <y>156</y> + <width>301</width> + <height>231</height> + </rect> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> + <widget class="QTableWidget" name="tableWidgetRightHand"/> + </item> + </layout> + </widget> + <widget class="QComboBox" name="comboRightHandJoints"> + <property name="geometry"> + <rect> + <x>420</x> + <y>75</y> + <width>150</width> + <height>25</height> + </rect> + </property> + </widget> + <widget class="QSlider" name="horizontalSliderRightHandJointPos"> + <property name="geometry"> + <rect> + <x>410</x> + <y>120</y> + <width>221</width> + <height>16</height> + </rect> + </property> + <property name="maximum"> + <number>100</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> </widget> <resources/> <connections/>