00001 /*************************************************************************** 00002 tag: Ruben Smits Tue Nov 16 09:19:02 CET 2010 ros_plugin.cpp 00003 00004 ros_plugin.cpp - description 00005 ------------------- 00006 begin : Tue November 16 2010 00007 copyright : (C) 2010 Ruben Smits 00008 email : first.last@mech.kuleuven.be 00009 00010 *************************************************************************** 00011 * This library is free software; you can redistribute it and/or * 00012 * modify it under the terms of the GNU Lesser General Public * 00013 * License as published by the Free Software Foundation; either * 00014 * version 2.1 of the License, or (at your option) any later version. * 00015 * * 00016 * This library is distributed in the hope that it will be useful, * 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 00019 * Lesser General Public License for more details. * 00020 * * 00021 * You should have received a copy of the GNU Lesser General Public * 00022 * License along with this library; if not, write to the Free Software * 00023 * Foundation, Inc., 59 Temple Place, * 00024 * Suite 330, Boston, MA 02111-1307 USA * 00025 * * 00026 ***************************************************************************/ 00027 00028 00029 #include <rtt/plugin/Plugin.hpp> 00030 #include <rtt/TaskContext.hpp> 00031 #include <rtt/Activity.hpp> 00032 #include <rtt/Logger.hpp> 00033 #include <rtt/os/startstop.h> 00034 #include <ros/ros.h> 00035 00036 using namespace RTT; 00037 extern "C" { 00038 bool loadRTTPlugin(RTT::TaskContext* c){ 00039 00040 // Initialize ROS if necessary 00041 if(!ros::isInitialized()){ 00042 log(Info)<<"Initializing ROS node in Orocos plugin..."<<endlog(); 00043 00044 int argc = __os_main_argc(); 00045 char ** argv = __os_main_argv(); 00046 00047 ros::init(argc,argv,"rtt",ros::init_options::AnonymousName); 00048 00049 if(ros::master::check()) 00050 ros::start(); 00051 else{ 00052 log(Warning)<<"'roscore' is not running: no ROS functions will be available."<<endlog(); 00053 ros::shutdown(); 00054 return true; 00055 } 00056 } 00057 00058 // get number of spinners from parameter server, if available 00059 int thread_count = 1; 00060 ros::param::get("~spinner_threads", thread_count); 00061 00062 // Create an asynchronous spinner to handle the default callback queue 00063 static ros::AsyncSpinner spinner(thread_count); // Use thread_count threads 00064 00065 // TODO: Check spinner.canStart() to suppress errors / warnings once it's incorporated into ROS 00066 spinner.start(); 00067 log(Info)<<"ROS node spinner started (" << thread_count << " " << (thread_count > 1 ? "threads" : "thread") << ")."<<endlog(); 00068 00069 return true; 00070 } 00071 std::string getRTTPluginName (){ 00072 return "rosnode"; 00073 } 00074 std::string getRTTTargetName (){ 00075 return OROCOS_TARGET_NAME; 00076 } 00077 } 00078