diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a314f8abac10e11aba8f4c428e199715ce0a146..b3d0966e4b74d645ce60c4f6294e56fb57f5bc3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ set(CUSTOM_HEADER_DIR dynamic_graph_bridge) set(${PROJECT_NAME}_HEADERS include/dynamic_graph_bridge/ros_init.hh include/dynamic_graph_bridge/ros_interpreter.hh + include/dynamic_graph_bridge/sot_loader.hh ) SEARCH_FOR_EIGEN() SEARCH_FOR_BOOST() @@ -98,9 +99,7 @@ set_target_properties(ros_bridge PROPERTIES BUILD_WITH_INSTALL_RPATH True macro(compile_plugin NAME) message(lib path ${LIBRARY_OUTPUT_PATH}) file(MAKE_DIRECTORY "${LIBRARY_OUTPUT_PATH}/dynamic_graph/ros/${NAME}") - add_library(${NAME} src/${NAME}.cpp src/${NAME}.hh) - #pkg_config_use_dependency(${NAME} jrl-mal) - #kg_config_use_dependency(${NAME} eigen3) + add_library(${NAME} SHARED src/${NAME}.cpp src/${NAME}.hh) pkg_config_use_dependency(${NAME} dynamic-graph) pkg_config_use_dependency(${NAME} sot-core) #pkg_config_use_dependency(${NAME} jrl-dynamics-urdf) @@ -108,7 +107,8 @@ macro(compile_plugin NAME) add_dependencies(${NAME} ros_bridge) target_link_libraries(${NAME} ros_bridge) set_target_properties(${NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH True) - install(TARGETS ${NAME} DESTINATION lib) + set_target_properties(${NAME} PROPERTIES PREFIX "") + install(TARGETS ${NAME} DESTINATION lib/plugin) dynamic_graph_python_module("ros/${NAME}" @@ -165,7 +165,14 @@ pkg_config_use_dependency(interpreter dynamic_graph_bridge_msgs) # Stand alone embedded intepreter with a robot controller. add_executable(geometric_simu src/geometric_simu.cpp src/sot_loader.cpp) pkg_config_use_dependency(geometric_simu roscpp) -target_link_libraries(geometric_simu ros_bridge ${Boost_LIBRARIES} dl tf) +target_link_libraries(geometric_simu ros_bridge ${Boost_LIBRARIES} ${CMAKE_DL_LIBS}) + +# Sot loader library +add_library(sot_loader src/sot_loader.cpp) +pkg_config_use_dependency(sot_loader dynamic-graph) +pkg_config_use_dependency(sot_loader sot-core) +target_link_libraries(sot_loader ${Boost_LIBRARIES}) +install(TARGETS sot_loader DESTINATION lib) add_subdirectory(src) diff --git a/src/sot_loader.hh b/include/dynamic_graph_bridge/sot_loader.hh similarity index 94% rename from src/sot_loader.hh rename to include/dynamic_graph_bridge/sot_loader.hh index c57f4731e20c224bea4cfbd77ca6280d131fe411..fe5b5b7dd9b4a39bf5d37688290ab3cca019364c 100644 --- a/src/sot_loader.hh +++ b/include/dynamic_graph_bridge/sot_loader.hh @@ -98,6 +98,9 @@ protected: // Joint state to be published. sensor_msgs::JointState joint_state_; + // \brief Start control loop + virtual void startControlLoop(); + // Number of DOFs according to KDL. int nbOfJoints_; parallel_joints_to_state_vector_t::size_type nbOfParallelJoints_; @@ -117,6 +120,9 @@ public: // \brief Load the SoT void Initialization(); + // \brief Create a thread for ROS. + void initializeRosNode(int argc, char *argv[]); + // \brief Compute one iteration of control. // Basically calls fillSensors, the SoT and the readControl. void oneIteration(); @@ -149,5 +155,9 @@ public: // \brief Get Status of dg. bool isDynamicGraphStopped() { return dynamic_graph_stopped_; } + + // \brief Specify the name of the dynamic library. + void setDynamicLibraryName(std::string &afilename); + }; diff --git a/src/converter.hh b/src/converter.hh index 79282bab6145b76e99e83b47a8bb8cffce6ae45d..d3d910a57b5a2b3b9165d383ae95584aa37d757a 100644 --- a/src/converter.hh +++ b/src/converter.hh @@ -117,8 +117,8 @@ namespace dynamicgraph ROS_TO_SOT_IMPL(Matrix) { - //TODO: Confirm Ros Matrix Storage order. - dst.resize (src.width, src.data.size () / src.width); + dst.resize (src.width, (unsigned int) src.data.size () / + (unsigned int)src.width); for (unsigned i = 0; i < src.data.size (); ++i) dst.data()[i] = src.data[i]; } @@ -126,6 +126,7 @@ namespace dynamicgraph // Homogeneous matrix. SOT_TO_ROS_IMPL(sot::MatrixHomogeneous) { + sot::VectorQuaternion q(src.linear()); dst.translation.x = src.translation()(0); dst.translation.y = src.translation()(1); @@ -135,6 +136,7 @@ namespace dynamicgraph dst.rotation.y = q.y(); dst.rotation.z = q.z(); dst.rotation.w = q.w(); + } ROS_TO_SOT_IMPL(sot::MatrixHomogeneous) @@ -297,8 +299,9 @@ namespace dynamicgraph static ptime timeStart(date(1970,1,1)); time_duration diff = time - timeStart; - uint32_t sec = diff.ticks ()/time_duration::rep_type::res_adjust (); - uint32_t nsec = diff.fractional_seconds(); + uint32_t sec = (unsigned int)diff.ticks ()/ + (unsigned int)time_duration::rep_type::res_adjust (); + uint32_t nsec = (unsigned int)diff.fractional_seconds(); return ros::Time (sec, nsec); } diff --git a/src/geometric_simu.cpp b/src/geometric_simu.cpp index 5a6a1ff581c50eae42a6315dc54b2b92dd7e2069..e622377aae6087e6def9b37c53749ec4e5cbc1de 100644 --- a/src/geometric_simu.cpp +++ b/src/geometric_simu.cpp @@ -20,28 +20,7 @@ #include <boost/thread/thread.hpp> #include <boost/thread/condition.hpp> -#include "sot_loader.hh" - -boost::condition_variable cond; -boost::mutex mut; - -void workThread(SotLoader *aSotLoader) -{ - { - boost::lock_guard<boost::mutex> lock(mut); - } - while(aSotLoader->isDynamicGraphStopped()) - { - usleep(5000); - } - while(!aSotLoader->isDynamicGraphStopped()) - { - aSotLoader->oneIteration(); - usleep(5000); - } - cond.notify_all(); - ros::waitForShutdown(); -} +#include <dynamic_graph_bridge/sot_loader.hh> int main(int argc, char *argv[]) @@ -50,13 +29,11 @@ int main(int argc, char *argv[]) SotLoader aSotLoader; if (aSotLoader.parseOptions(argc,argv)<0) return -1; - ros::NodeHandle n; - ros::ServiceServer service = n.advertiseService("start_dynamic_graph", - &SotLoader::start_dg, - &aSotLoader); - ROS_INFO("Ready to start dynamic graph."); - boost::thread thr(workThread,&aSotLoader); - boost::unique_lock<boost::mutex> lock(mut); - cond.wait(lock); - ros::spin(); + + aSotLoader.initializeRosNode(argc,argv); + + while(true){ + usleep(5000); + } + } diff --git a/src/ros_joint_state.cpp b/src/ros_joint_state.cpp index df04d8c4e5ff54b8922f577775a68868e0f3e0b4..c12655b136f7960b9389b9c191b4543c709d8fc9 100644 --- a/src/ros_joint_state.cpp +++ b/src/ros_joint_state.cpp @@ -165,7 +165,7 @@ namespace dynamicgraph // Fill position. jointState_.position.resize (s); for (std::size_t i = 0; i < s; ++i) - jointState_.position[i] = state_.access (t) (i); + jointState_.position[i] = state_.access (t) ((unsigned int)i); publisher_.msg_ = jointState_; publisher_.unlockAndPublish (); diff --git a/src/ros_publish.hxx b/src/ros_publish.hxx index deff4cf4a78847abb8d7f1e3f3c7655124ded856..4ff1d0154e90cc9d6c48aa57ee41043ee8d1f4df 100644 --- a/src/ros_publish.hxx +++ b/src/ros_publish.hxx @@ -56,7 +56,6 @@ namespace dynamicgraph template <typename T> void RosPublish::add (const std::string& signal, const std::string& topic) { - typedef typename SotToRos<T>::sot_t sot_t; typedef typename SotToRos<T>::ros_t ros_t; typedef typename SotToRos<T>::signalIn_t signal_t; diff --git a/src/ros_time.cpp b/src/ros_time.cpp index 50a23671b71ebdae4d8f2378fc59f2ef5e5274d7..0d50559a74509f4f326390c344aacf82a4a659ab 100644 --- a/src/ros_time.cpp +++ b/src/ros_time.cpp @@ -32,7 +32,7 @@ namespace dynamicgraph { } ptime& - RosTime::update (ptime& time, const int& t) + RosTime::update (ptime& time, const int& ) { time = rosTimeToPtime (ros::Time::now ()); return time; diff --git a/src/sot_loader.cpp b/src/sot_loader.cpp index 10706aa28af0b2f1009ecaa8359abe141348eb68..a850624b4c135df67ff6ebea7a98f1fe85a4c8d4 100644 --- a/src/sot_loader.cpp +++ b/src/sot_loader.cpp @@ -20,15 +20,55 @@ /* --- INCLUDES ------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ -#include "sot_loader.hh" +#include <dynamic_graph_bridge/sot_loader.hh> +#include "dynamic_graph_bridge/ros_init.hh" // POSIX.1-2001 #include <dlfcn.h> +#include <boost/thread/thread.hpp> +#include <boost/thread/condition.hpp> + +boost::condition_variable cond; +boost::mutex mut; + using namespace std; using namespace dynamicgraph::sot; namespace po = boost::program_options; +void createRosSpin(SotLoader *aSotLoader) +{ + ROS_INFO("createRosSpin started\n"); + ros::NodeHandle n; + + ros::ServiceServer service = n.advertiseService("start_dynamic_graph", + &SotLoader::start_dg, + aSotLoader); + + ros::ServiceServer service2 = n.advertiseService("stop_dynamic_graph", + &SotLoader::stop_dg, + aSotLoader); + + + ros::waitForShutdown(); +} + +void workThreadLoader(SotLoader *aSotLoader) +{ + while(aSotLoader->isDynamicGraphStopped()) + { + usleep(5000); + } + + while(!aSotLoader->isDynamicGraphStopped()) + { + aSotLoader->oneIteration(); + usleep(5000); + } + cond.notify_all(); + ros::waitForShutdown(); +} + SotLoader::SotLoader(): dynamic_graph_stopped_(true), sensorsIn_ (), @@ -47,8 +87,8 @@ SotLoader::SotLoader(): int SotLoader::initPublication() { - ros::NodeHandle n; - + ros::NodeHandle & n = dynamicgraph::rosInit(false); + // Prepare message to be published joint_pub_ = n.advertise<sensor_msgs::JointState>("joint_states", 1); @@ -56,6 +96,26 @@ int SotLoader::initPublication() return 0; } +void SotLoader::startControlLoop() +{ + boost::thread thr(workThreadLoader, this); +} + +void SotLoader::initializeRosNode(int , char *[]) +{ + ROS_INFO("Ready to start dynamic graph."); + boost::unique_lock<boost::mutex> lock(mut); + boost::thread thr2(createRosSpin,this); + + startControlLoop(); +} + + +void SotLoader::setDynamicLibraryName(std::string &afilename) +{ + dynamicLibraryName_ = afilename; +} + int SotLoader::readSotVectorStateParam() { std::map<std::string,int> from_state_name_to_state_vector;