diff --git a/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp b/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp index 508180247963def8b29e4555b1cb8420a0920303..7a0ca2e58fefad205fd3080a07f2c7b6a1cf7305 100644 --- a/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp +++ b/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp @@ -179,7 +179,7 @@ namespace armarx removeSelectionCallbacks(); selectionNode->deselectAll(); - for (auto& e : selectedElements) + for (auto & e : selectedElements) { SoNode* n = SoSelection::getByName((SELECTION_NAME_PREFIX + e).c_str()); if (n) @@ -210,7 +210,7 @@ namespace armarx name = name.substr(SELECTION_NAME_PREFIX.length()); // Check if selected element is 'selectable' - for (auto& layer : selectableLayers) + for (auto & layer : selectableLayers) { if (layers[layer].addedBoxVisualizations.find(name) != layers[layer].addedBoxVisualizations.end() || layers[layer].addedTextVisualizations.find(name) != layers[layer].addedTextVisualizations.end() @@ -1555,7 +1555,7 @@ namespace armarx d.layerName = layerName; d.name = robotName; - for (auto& it : configuration) + for (auto & it : configuration) { d.configuration[it.first] = it.second; } @@ -1602,7 +1602,7 @@ namespace armarx void DebugDrawerComponent::clearAll(const Ice::Current&) { - for (auto& i : layers) + for (auto & i : layers) { clearLayer(i.first); } @@ -1636,57 +1636,57 @@ namespace armarx auto& layer = layers.at(layerName); - for (const auto& i : layer.addedCoordVisualizations) + for (const auto & i : layer.addedCoordVisualizations) { removePoseVisu(layerName, i.first); } - for (const auto& i : layer.addedLineVisualizations) + for (const auto & i : layer.addedLineVisualizations) { removeLineVisu(layerName, i.first); } - for (const auto& i : layer.addedBoxVisualizations) + for (const auto & i : layer.addedBoxVisualizations) { removeBoxVisu(layerName, i.first); } - for (const auto& i : layer.addedTextVisualizations) + for (const auto & i : layer.addedTextVisualizations) { removeTextVisu(layerName, i.first); } - for (const auto& i : layer.addedSphereVisualizations) + for (const auto & i : layer.addedSphereVisualizations) { removeSphereVisu(layerName, i.first); } - for (const auto& i : layer.addedCylinderVisualizations) + for (const auto & i : layer.addedCylinderVisualizations) { removeCylinderVisu(layerName, i.first); } - for (const auto& i : layer.addedPointCloudVisualizations) + for (const auto & i : layer.addedPointCloudVisualizations) { removePointCloudVisu(layerName, i.first); } - for (const auto& i : layer.addedPolygonVisualizations) + for (const auto & i : layer.addedPolygonVisualizations) { removePolygonVisu(layerName, i.first); } - for (const auto& i : layer.addedArrowVisualizations) + for (const auto & i : layer.addedArrowVisualizations) { removeArrowVisu(layerName, i.first); } - for (const auto& i : layer.addedRobotVisualizations) + for (const auto & i : layer.addedRobotVisualizations) { removeRobotVisu(layerName, i.first); } - for (const auto& i : layer.addedCustomVisualizations) + for (const auto & i : layer.addedCustomVisualizations) { removeCustomVisu(layerName, i.first); } @@ -1835,6 +1835,13 @@ namespace armarx accumulatedUpdateData.coloredpointcloud.clear(); + for (auto i = accumulatedUpdateData.colored24Bitpointcloud.begin(); i != accumulatedUpdateData.colored24Bitpointcloud.end(); i++) + { + draw24BitColoredPointCloud(i->second); + } + + accumulatedUpdateData.colored24Bitpointcloud.clear(); + onUpdateVisualization(); } @@ -2063,7 +2070,7 @@ namespace armarx ScopedRecursiveLockPtr l = getScopedVisuLock(); StringSequence seq {}; - for (const auto& layer : layers) + for (const auto & layer : layers) { seq.push_back(layer.first); } @@ -2076,7 +2083,7 @@ namespace armarx ::armarx::LayerInformationSequence seq {}; ScopedRecursiveLockPtr l = getScopedVisuLock(); - for (const auto& layer : layers) + for (const auto & layer : layers) { int count = layer.second.addedCoordVisualizations.size() + layer.second.addedLineVisualizations.size() + @@ -2210,4 +2217,119 @@ namespace armarx removeColoredPointCloudVisu(DEBUG_LAYER_NAME, pointCloudName); } + void DebugDrawerComponent::draw24BitColoredPointCloud(const Colored24BitPointCloudData& d) + { + ScopedRecursiveLockPtr l = getScopedVisuLock(); + + auto& layer = requestLayer(d.layerName); + + remove24BitColoredPointCloud(d.layerName, d.name); + + if (!d.active) + { + return; + } + + const auto& pcl = d.pointCloud.points; + + SoSeparator* pclSep = new SoSeparator; + + SoMaterial* pclMat = new SoMaterial; + std::vector<SbColor> colors; + colors.reserve(pcl.size()); + std::transform( + pcl.begin(), pcl.end(), std::back_inserter(colors), + [](const DebugDrawer24BitColoredPointCloudElement & elem) + { + return SbColor {static_cast<float>(elem.color.r) / 255.f, static_cast<float>(elem.color.g) / 255.f, static_cast<float>(elem.color.b) / 255.f}; + } + ); + pclMat->diffuseColor.setValues(0, colors.size(), colors.data()); + pclMat->ambientColor.setValues(0, colors.size(), colors.data()); + pclSep->addChild(pclMat); + + SoMaterialBinding* pclMatBind = new SoMaterialBinding; + pclMatBind->value = SoMaterialBinding::PER_PART; + pclSep->addChild(pclMatBind); + + SoCoordinate3* pclCoords = new SoCoordinate3; + std::vector<SbVec3f> coords; + coords.reserve(pcl.size()); + std::transform( + pcl.begin(), pcl.end(), std::back_inserter(coords), + [](const DebugDrawer24BitColoredPointCloudElement & elem) + { + return SbVec3f {elem.x, elem.y, elem.z}; + } + ); + pclCoords->point.setValues(0, coords.size(), coords.data()); + pclSep->addChild(pclCoords); + + SoDrawStyle* pclStye = new SoDrawStyle; + pclStye->pointSize = d.pointCloud.pointSize; + pclSep->addChild(pclStye); + + pclSep->addChild(new SoPointSet); + + ARMARX_INFO << d.name << "PointCloud Update " << pcl.size(); + + layer.added24BitColoredPointCloudVisualizations[d.name] = pclSep; + layer.mainNode->addChild(pclSep); + } + + void DebugDrawerComponent::remove24BitColoredPointCloud(const std::string& layerName, const std::string& name) + { + ScopedRecursiveLockPtr l = getScopedVisuLock(); + + if (!hasLayer(layerName)) + { + return; + } + + auto& layer = layers.at(layerName); + + if (layer.added24BitColoredPointCloudVisualizations.find(name) == layer.added24BitColoredPointCloudVisualizations.end()) + { + return; + } + + layer.mainNode->removeChild(layer.added24BitColoredPointCloudVisualizations[name]); + layer.added24BitColoredPointCloudVisualizations.erase(name); + } + + void DebugDrawerComponent::set24BitColoredPointCloudVisu(const std::string& layerName, const std::string& pointCloudName, const DebugDrawer24BitColoredPointCloud& pointCloud, const Ice::Current&) + { + { + ScopedRecursiveLockPtr l = getScopedAccumulatedDataLock(); + std::string entryName = "__" + layerName + "__" + pointCloudName + "__"; + Colored24BitPointCloudData& d = accumulatedUpdateData.colored24Bitpointcloud[entryName]; + d.pointCloud = pointCloud; + d.layerName = layerName; + d.name = pointCloudName; + d.active = true; + } + } + + void DebugDrawerComponent::set24BitColoredPointCloudDebugLayerVisu(const std::string& pointCloudName, const DebugDrawer24BitColoredPointCloud& pointCloud, const Ice::Current&) + { + set24BitColoredPointCloudVisu(DEBUG_LAYER_NAME, pointCloudName, pointCloud); + } + + void DebugDrawerComponent::remove24BitColoredPointCloudVisu(const std::string& layerName, const std::string& pointCloudName, const Ice::Current&) + { + { + ScopedRecursiveLockPtr l = getScopedAccumulatedDataLock(); + std::string entryName = "__" + layerName + "__" + pointCloudName + "__"; + Colored24BitPointCloudData& d = accumulatedUpdateData.colored24Bitpointcloud[entryName]; + d.layerName = layerName; + d.name = pointCloudName; + d.active = false; + } + } + + void DebugDrawerComponent::remove24BitColoredPointCloudDebugLayerVisu(const std::string& pointCloudName, const Ice::Current&) + { + remove24BitColoredPointCloudVisu(DEBUG_LAYER_NAME, pointCloudName); + } + }//namespace armarx diff --git a/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.h b/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.h index bae49caa056a5aead0cd79525e30b5483a6bb521..6511755e5cc214ad43815005119aef02c107b140 100644 --- a/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.h +++ b/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.h @@ -187,6 +187,12 @@ namespace armarx virtual void removeColoredPointCloudVisu(const std::string& layerName, const std::string& pointCloudName, const ::Ice::Current& = ::Ice::Current()); virtual void removeColoredPointCloudDebugLayerVisu(const std::string& pointCloudName, const ::Ice::Current& = ::Ice::Current()); + virtual void set24BitColoredPointCloudDebugLayerVisu(const std::string& pointCloudName, const DebugDrawer24BitColoredPointCloud& pointCloud, const ::Ice::Current& = ::Ice::Current()); + virtual void set24BitColoredPointCloudVisu(const std::string& layerName, const std::string& pointCloudName, const DebugDrawer24BitColoredPointCloud& pointCloud, const ::Ice::Current& = ::Ice::Current()); + virtual void remove24BitColoredPointCloudVisu(const std::string& layerName, const std::string& pointCloudName, const ::Ice::Current& = ::Ice::Current()); + virtual void remove24BitColoredPointCloudDebugLayerVisu(const std::string& pointCloudName, const ::Ice::Current& = ::Ice::Current()); + + virtual void setPolygonVisu(const std::string& layerName, const std::string& polygonName, const std::vector< ::armarx::Vector3BasePtr >& polygonPoints, const DrawColor& colorInner, const DrawColor& colorBorder, float lineWidth, const ::Ice::Current& = ::Ice::Current()); virtual void setPolygonDebugLayerVisu(const std::string& polygonName, const std::vector< ::armarx::Vector3BasePtr >& polygonPoints, const DrawColor& colorInner, const DrawColor& colorBorder, float lineWidth, const ::Ice::Current& = ::Ice::Current()); virtual void removePolygonVisu(const std::string& layerName, const std::string& polygonName, const ::Ice::Current& = ::Ice::Current()); @@ -332,6 +338,10 @@ namespace armarx { DebugDrawerColoredPointCloud pointCloud; }; + struct Colored24BitPointCloudData : public DrawData + { + DebugDrawer24BitColoredPointCloud pointCloud; + }; struct PolygonData : public DrawData { std::vector< Eigen::Vector3f > points; @@ -380,6 +390,7 @@ namespace armarx std::map<std::string, CylinderData> cylinder; std::map<std::string, PointCloudData> pointcloud; std::map<std::string, ColoredPointCloudData> coloredpointcloud; + std::map<std::string, Colored24BitPointCloudData> colored24Bitpointcloud; std::map<std::string, PolygonData> polygons; std::map<std::string, ArrowData> arrows; std::map<std::string, RobotData> robots; @@ -406,6 +417,7 @@ namespace armarx void drawCylinder(const CylinderData& d); void drawPointCloud(const PointCloudData& d); void drawColoredPointCloud(const ColoredPointCloudData& d); + void draw24BitColoredPointCloud(const Colored24BitPointCloudData& d); void drawPolygon(const PolygonData& d); void drawArrow(const ArrowData& d); void drawRobot(const RobotData& d); @@ -418,6 +430,7 @@ namespace armarx void removeCylinder(const std::string& layerName, const std::string& name); void removePointCloud(const std::string& layerName, const std::string& name); void removeColoredPointCloud(const std::string& layerName, const std::string& name); + void remove24BitColoredPointCloud(const std::string& layerName, const std::string& name); void removePolygon(const std::string& layerName, const std::string& name); void removeArrow(const std::string& layerName, const std::string& name); void removeRobot(const std::string& layerName, const std::string& name); @@ -438,6 +451,7 @@ namespace armarx std::map<std::string, SoSeparator*> addedCylinderVisualizations; std::map<std::string, SoSeparator*> addedPointCloudVisualizations; std::map<std::string, SoSeparator*> addedColoredPointCloudVisualizations; + std::map<std::string, SoSeparator*> added24BitColoredPointCloudVisualizations; std::map<std::string, SoSeparator*> addedPolygonVisualizations; std::map<std::string, SoSeparator*> addedArrowVisualizations; std::map<std::string, SoSeparator*> addedRobotVisualizations; diff --git a/source/RobotAPI/interface/visualization/DebugDrawerInterface.ice b/source/RobotAPI/interface/visualization/DebugDrawerInterface.ice index 8e7e85c35ed7f8ab51738c5bcc6fb6e7b4c13ceb..198ff86013a71e0cf4c6131b53aaac18a90e8e3a 100644 --- a/source/RobotAPI/interface/visualization/DebugDrawerInterface.ice +++ b/source/RobotAPI/interface/visualization/DebugDrawerInterface.ice @@ -43,6 +43,13 @@ module armarx float a; }; + struct DrawColor24Bit + { + byte r; + byte g; + byte b; + }; + /*! * \brief Contains information about a layer. (name, visibility and number of elements) @@ -87,6 +94,21 @@ module armarx float pointSize = three; }; + struct DebugDrawer24BitColoredPointCloudElement + { + float x; + float y; + float z; + DrawColor24Bit color; + }; + sequence<DebugDrawer24BitColoredPointCloudElement> DebugDrawer24BitColoredPointCloudElementList; + + struct DebugDrawer24BitColoredPointCloud + { + DebugDrawer24BitColoredPointCloudElementList points; + float pointSize = three; + }; + sequence< Vector3Base > PolygonPointList; enum DrawStyle { FullModel, CollisionModel }; @@ -117,6 +139,7 @@ module armarx void setSphereVisu(string layerName, string sphereName, Vector3Base globalPosition, DrawColor color, float radius); void setPointCloudVisu(string layerName, string pointCloudName, DebugDrawerPointCloud pointCloud); void setColoredPointCloudVisu(string layerName, string pointCloudName, DebugDrawerColoredPointCloud pointCloud); + void set24BitColoredPointCloudVisu(string layerName, string pointCloudName, DebugDrawer24BitColoredPointCloud pointCloud); void setPolygonVisu(string layerName, string polygonName, PolygonPointList polygonPoints, DrawColor colorInner, DrawColor colorBorder, float lineWidth); void setArrowVisu(string layerName, string arrowName, Vector3Base position, Vector3Base direction, DrawColor color, float length, float width); void setCylinderVisu(string layerName, string cylinderName, Vector3Base globalPosition, Vector3Base direction, float length, float radius, DrawColor color); @@ -155,7 +178,7 @@ module armarx void setTextDebugLayerVisu(string textName, string text, Vector3Base globalPosition, DrawColor color, int size); void setSphereDebugLayerVisu(string sphereName, Vector3Base globalPosition, DrawColor color, float radius); void setPointCloudDebugLayerVisu(string pointCloudName, DebugDrawerPointCloud pointCloud); - void setColoredPointCloudDebugLayerVisu(string pointCloudName, DebugDrawerColoredPointCloud pointCloud); + void set24BitColoredPointCloudDebugLayerVisu(string pointCloudName, DebugDrawer24BitColoredPointCloud pointCloud); void setPolygonDebugLayerVisu(string polygonName, PolygonPointList polygonPoints, DrawColor colorInner, DrawColor colorBorder, float lineWidth); void setArrowDebugLayerVisu(string arrowName, Vector3Base position, Vector3Base direction, DrawColor color, float length, float width); void setCylinderDebugLayerVisu(string cylinderName, Vector3Base globalPosition, Vector3Base direction, float length, float radius, DrawColor color); @@ -171,6 +194,7 @@ module armarx void removeSphereVisu(string layerName, string sphereName); void removePointCloudVisu(string layerName, string pointCloudName); void removeColoredPointCloudVisu(string layerName, string pointCloudName); + void remove24BitColoredPointCloudVisu(string layerName, string pointCloudName); void removePolygonVisu(string layerName, string polygonName); void removeArrowVisu(string layerName, string arrowName); void removeCylinderVisu(string layerName, string cylinderName); @@ -186,6 +210,7 @@ module armarx void removeSphereDebugLayerVisu(string sphereName); void removePointCloudDebugLayerVisu(string pointCloudName); void removeColoredPointCloudDebugLayerVisu(string pointCloudName); + void remove24BitColoredPointCloudDebugLayerVisu(string pointCloudName); void removePolygonDebugLayerVisu(string polygonName); void removeArrowDebugLayerVisu(string arrowName); void removeCylinderDebugLayerVisu(string cylinderName);