2017-08-07 9 views
1

私はロボットオペレーティングシステム(ROS)で作業しており、クライアントが指定したROSノードをサーバーが起動するサーバー/クライアントを作成しようとしています。 "ブートアップ"を実行するには、ここにある推奨事項に基づいてroslaunchを使用しています。http://wiki.ros.org/roslaunch/API%20UsageROSエラー。 "エラー処理要求:シグナルはメインスレッドでのみ動作します"

私はウィンドウでroscoreを実行してから、うまく起動するサーバーを実行できます。しかし、できるだけ早く私は、クライアント経由で起動したいノード名を送信しようとして、私は次のエラーを取得する:

「エラー処理要求:信号のみをメインスレッドで動作する」

それ私はまだ追跡していない様々な領域のファイル束を指します。

起動したいノード(この場合はturtlesim_nodeとturtle_teleop_key)に対して個別に作った起動ファイルのそれぞれに対して、単純なroslaunch呼び出しを使用しようとしましたが、起動時にroslaunch [package] turtlesim_launch.launchなどの下

は私のサーバーのコードです:ここで

#!/usr/bin/env python 
#Filename: primary_server.py 

import rospy 
import roslaunch 
from robot_man.srv import * 

class StartUpServer(object): 
    def __init__(self): 
     self._nodes = [] 


    def handle_startup(self, names): 
     self._temp = names.nodes.split(",") #This reades in the 
     # information from the srv file sent by the client and 
     # separates each node/package pair 

     #This loop separates the input from pairs of 2 corresponding 
     # to the package and node names the user inputs 
     for i in range(len(self._temp)): 
      self._nodes.append(self._temp[i].split()) 

     #This loop will launch each node that the user has specified 
     for package, executable in self._nodes: 
      print('package is: {0}, executable is: {1}'.format(package, executable)) 
      node = roslaunch.core.Node(package, executable) 
      launch = roslaunch.scriptapi.ROSLaunch() 
      launch.start() 

      process = launch.launch(node) 
      print('running node: %s'%executable) 
     return StartUpResponse(self._nodes) #I will change this later 


if __name__ == '__main__': 
    rospy.init_node('startup_node') 
    server = StartUpServer() 
    rospy.Service('startup', StartUp, server.handle_startup) 
    print('The servers are up and running') 
    rospy.spin() 

は私のクライアントのためのコードです:

#!/usr/bin/env python 
#Filename: primary_client_startup.py 

import rospy 
from robot_man.srv import * 

def main(nodes): 
    rospy.wait_for_service('startup') 
    proxy = rospy.ServiceProxy('startup', StartUp) 
    response = proxy(nodes) 
    return response 

if __name__ == '__main__': 
    nodes = input('Please enter the node packages followed by \ 
    node names separated by spaces. \n To activate multiple nodes \ 
    separate entries with a comma > ') 
    main(nodes) 
#This should be a string of space/comma separated values 
string nodes 
--- 
#This should return "success" if node/s start up successfully, else "fail" 
string status 

そして最後に、ここで私は亀のシミュレータを起動するために作られた2つの起動ファイルです:は、ここに私のSRVファイルです

turtlesim_launch.launchが

<launch> 
    <node name="turtlesim_node" pkg="turtlesim" type="turtlesim_node" /> 
</launch> 

turtle_teleop_launch.launch

<launch> 
    <node name="turtle_teleop_key" pkg="turtlesim" type="turtle_teleop_key" /> 
</launch> 

私は少しのGoogle検索を行い、同様の問題は見つからなかったr ROS(Djangoなどのいくつかの同様のエラーがありますが、関係はありません)。

私は助けてくれてありがとう!

P.S.エラーが発生したときに34行目にすることに注意してください(process = launch.launch(node))。

答えて

0

は、実際には、あなたは、Pythonメインスレッドからinit_node()を呼び出していないドキュメント

に記載されています。 PythonはMainスレッドからシグナルを登録することしかできません。

ここをクリックrospyOverviewInitialization and Shutdown

+0

うーん、よろしくお願いします。私が達成しようとしているものと同様のアプローチを使用して、ノードをリモートで初期化する方法を知っていますか? –

+0

私は同じトラップに陥るので、私はあなたの質問を見つけました。私はその記事http://wiki.ros.org/ROS/Tutorials/Roslaunch%20tips%20for%20larger%20projectsのような大規模なlaunchfilesはgerneal良い解決策であると思うか、解決策についてDiscourse.ros.orgに尋ねるでしょう。申し訳ありませんが実際にわからない – user3732793

+0

問題はありません。私はフィードバックに感謝します! –

関連する問題