From 639a4dc965b434cbd7072debfd2c2713db328c72 Mon Sep 17 00:00:00 2001 From: Gennaro Raiola <gennaro.raiola@gmail.com> Date: Wed, 18 Dec 2013 12:29:13 +0100 Subject: [PATCH] Include runPythonFile service This enables to directly launch a python file within any roslaunch file Adapted by F.Keith for the extraction of the messages. --- .../dynamic_graph_bridge/ros_interpreter.hh | 15 +++++++++++++ scripts/run_command | 16 +++++++------- src/ros_interpreter.cpp | 21 ++++++++++++++++++- srv/RunPythonFile.srv | 3 +++ 4 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 srv/RunPythonFile.srv diff --git a/include/dynamic_graph_bridge/ros_interpreter.hh b/include/dynamic_graph_bridge/ros_interpreter.hh index b2877ee..df1047a 100644 --- a/include/dynamic_graph_bridge/ros_interpreter.hh +++ b/include/dynamic_graph_bridge/ros_interpreter.hh @@ -2,6 +2,7 @@ # define DYNAMIC_GRAPH_BRIDGE_INTERPRETER_HH # include <ros/ros.h> # include <dynamic_graph_bridge_msgs/RunCommand.h> +# include <dynamic_graph_bridge_msgs/RunPythonFile.h> # include <dynamic-graph/python/interpreter.hh> namespace dynamicgraph @@ -20,6 +21,11 @@ namespace dynamicgraph dynamic_graph_bridge_msgs::RunCommand::Response&)> runCommandCallback_t; + typedef boost::function< + bool (dynamic_graph_bridge_msgs::RunPythonFile::Request&, + dynamic_graph_bridge_msgs::RunPythonFile::Response&)> + runPythonFileCallback_t; + explicit Interpreter (ros::NodeHandle& nodeHandle); /// \brief Run a command and return result. @@ -29,6 +35,10 @@ namespace dynamicgraph void runCommand(const std::string & command, std::string &result, std::string &out, std::string &err); + /// \brief Method to parse python scripts. + /// \param Input file name to parse. + void runPythonFile(std::string ifilename); + /// Initialize service run_command void startRosService (); @@ -37,10 +47,15 @@ namespace dynamicgraph bool runCommandCallback (dynamic_graph_bridge_msgs::RunCommand::Request& req, dynamic_graph_bridge_msgs::RunCommand::Response& res); + /// \brief Run a Python file. + bool runPythonFileCallback (dynamic_graph_bridge_msgs::RunPythonFile::Request& req, + dynamic_graph_bridge_msgs::RunPythonFile::Response& res); + private: python::Interpreter interpreter_; ros::NodeHandle& nodeHandle_; ros::ServiceServer runCommandSrv_; + ros::ServiceServer runPythonFileSrv_; }; } // end of namespace dynamicgraph. diff --git a/scripts/run_command b/scripts/run_command index f06cf1c..9615adc 100755 --- a/scripts/run_command +++ b/scripts/run_command @@ -19,7 +19,9 @@ class RosShell(InteractiveConsole): rospy.wait_for_service('run_command') self.client = rospy.ServiceProxy( 'run_command', dynamic_graph_bridge_msgs.srv.RunCommand, True) - + rospy.wait_for_service('run_script') + self.scriptClient = rospy.ServiceProxy( + 'run_script', dynamic_graph_bridge_msgs.srv.RunPythonFile, True) def runcode(self, code, retry = True): source = self.cache[:-1] @@ -69,6 +71,8 @@ class RosShell(InteractiveConsole): if __name__ == '__main__': import optparse manifest = roslib.manifest.load_manifest('dynamic_graph_bridge') + rospy.init_node('run_command', argv=sys.argv) + sys.argv = rospy.myargv(argv=None) parser = optparse.OptionParser( usage='\n\t%prog [options]', version='%%prog %s' % manifest.version) @@ -82,12 +86,8 @@ if __name__ == '__main__': if not sh.client: print("Connection to remote server has been lost.") sys.exit(1) - response = sh.client(str(source)) - if response.stdout != "": - print response.stdout[:-1] - if response.stderr != "": - print response.stderr[:-1] - elif response.result != "None": - print response.result + response = sh.scriptClient(infile) + if not response: + print("Error while file parsing ") else: sh.interact("Interacting with remote server.") diff --git a/src/ros_interpreter.cpp b/src/ros_interpreter.cpp index 4b5c528..edd13b5 100644 --- a/src/ros_interpreter.cpp +++ b/src/ros_interpreter.cpp @@ -7,7 +7,8 @@ namespace dynamicgraph Interpreter::Interpreter (ros::NodeHandle& nodeHandle) : interpreter_ (), nodeHandle_ (nodeHandle), - runCommandSrv_ () + runCommandSrv_ (), + runPythonFileSrv_ () { } @@ -17,6 +18,11 @@ namespace dynamicgraph boost::bind (&Interpreter::runCommandCallback, this, _1, _2); runCommandSrv_ = nodeHandle_.advertiseService ("run_command", runCommandCb); + + runPythonFileCallback_t runPythonFileCb = + boost::bind (&Interpreter::runPythonFileCallback, this, _1, _2); + runPythonFileSrv_ = + nodeHandle_.advertiseService ("run_script", runPythonFileCb); } bool @@ -28,6 +34,15 @@ namespace dynamicgraph return true; } + bool + Interpreter::runPythonFileCallback (dynamic_graph_bridge_msgs::RunPythonFile::Request& req, + dynamic_graph_bridge_msgs::RunPythonFile::Response& res) + { + interpreter_.runPythonFile(req.input); + res.result = "File parsed"; // FIX: It is just an echo, is there a way to have a feedback? + return true; + } + std::string Interpreter::runCommand (const std::string& command) @@ -44,5 +59,9 @@ namespace dynamicgraph interpreter_.python(command, result, out, err); } + void Interpreter::runPythonFile( std::string ifilename ){ + interpreter_.runPythonFile(ifilename); + } + } // end of namespace dynamicgraph. diff --git a/srv/RunPythonFile.srv b/srv/RunPythonFile.srv new file mode 100644 index 0000000..fa49f81 --- /dev/null +++ b/srv/RunPythonFile.srv @@ -0,0 +1,3 @@ +string input +--- +string result -- GitLab