私はロボットオペレーティングシステム(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))。
うーん、よろしくお願いします。私が達成しようとしているものと同様のアプローチを使用して、ノードをリモートで初期化する方法を知っていますか? –
私は同じトラップに陥るので、私はあなたの質問を見つけました。私はその記事http://wiki.ros.org/ROS/Tutorials/Roslaunch%20tips%20for%20larger%20projectsのような大規模なlaunchfilesはgerneal良い解決策であると思うか、解決策についてDiscourse.ros.orgに尋ねるでしょう。申し訳ありませんが実際にわからない – user3732793
問題はありません。私はフィードバックに感謝します! –