diff --git a/urdf/CMakeLists.txt b/urdf/CMakeLists.txt index 64d4b42..96355f2 100644 --- a/urdf/CMakeLists.txt +++ b/urdf/CMakeLists.txt @@ -21,6 +21,12 @@ set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) rosbuild_gensrv() +# necessary for collada reader to create the temporary dae files due to limitations in the URDF geometry +check_function_exists(mkstemps HAVE_MKSTEMPS) +if( HAVE_MKSTEMPS ) + add_definitions("-DHAVE_MKSTEMPS") +endif() + #common commands for building c++ executables and libraries rosbuild_add_library(${PROJECT_NAME} src/link.cpp src/joint.cpp src/model.cpp src/collada_model_reader.cpp) #target_link_libraries(${PROJECT_NAME} another_library) diff --git a/urdf/src/collada_model_reader.cpp b/urdf/src/collada_model_reader.cpp index c5cc462..8778559 100644 --- a/urdf/src/collada_model_reader.cpp +++ b/urdf/src/collada_model_reader.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -55,6 +56,11 @@ #include #include +#ifndef HAVE_MKSTEMPS +#include +#include +#endif + #define FOREACH(it, v) for(typeof((v).begin()) it = (v).begin(); it != (v).end(); (it)++) #define FOREACHC FOREACH @@ -1110,9 +1116,19 @@ protected: \n\ ")%name%name); - //= str(boost::format("%s/models/%s.dae")%_resourcedir%name); +#ifdef HAVE_MKSTEMPS geometry->filename = str(boost::format("/tmp/collada_model_reader_%s_XXXXXX.dae")%name); int fd = mkstemps(&geometry->filename[0],4); +#else + do { + geometry->filename = str(boost::format("/tmp/collada_model_reader_%s_%d.dae")%name%rand()); + } while(!!std::ifstream(geometry->filename.c_str())); + int fd = open(geometry->filename.c_str(),O_WRONLY|O_CREAT|O_EXCL); + if( fd == -1 ) { + ROS_ERROR("failed to open geometry dae file %s",geometry->filename.c_str()); + return geometry; + } +#endif //ROS_INFO("temp file: %s",geometry->filename.c_str()); std::string daedatastr = daedata.str(); if( (size_t)write(fd,daedatastr.c_str(),daedatastr.size()) != daedatastr.size() ) {