1

csvファイルからデータセットを取得し、それらを使用してゲームエンジンでロボットアームと人間のモデルを回転させるBlenderコードがあります。このコードは正常に機能しますが、ワイヤレス接続を介してBlenderにデータを送信したいと思います。

Blender(Python 3で実行)でサーバーコードを設定しています

# Server Program
# Make sure the client is being run on the data generation computer

SERVER_LOOP = True

import socket
import sys
import json
import bge

cont = bge.logic.getCurrentController()
owner = cont.owner

print ('INFO: Starting up')


# Create a TCP/IP socket to listen on
print ('INFO: Creating TCP/IP Socket')
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Prevent from 'ADDRESS ALREADY IN USE' upon restart
print ('INFO: Housekeeping...')
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Bind the socket to port 8081 on all interfaces
server_address = ('localhost', 8081)
print ('INFO: Binding and starting up on %s port %s' % server_address)
server.bind(server_address)
print ('INFO: Server bound')

def send_welcome(cont):
    cont.send('SERVER: Welcome'.encode('utf8'))

# Listen for connectons for 5 seconds
server.listen(5)

# Connection is the SOCKET OBJECT for the connection
# Client_address is the connected peer(the client)
connection, client_address = server.accept()
print ('INFO: Connection from', connection.getpeername())
print ('INFO: Sending welcome msg')
send_welcome(connection)
print ()

while SERVER_LOOP:

    # Receive data
    try:
        data = connection.recv(10000)

    # Unless there's an error
    except OSError:
        print (connection)

    # Decode the data into usable lists
    if type(data) != type(''): 
        data = data.decode()

    # If we want to end the client stream but keep the server running    
    if data=='end' or data=='End' or data=='END':
        print ('INFO: Closing connection with ',connection.getpeername())
        connection.shutdown(socket.SHUT_RD | socket.SHUT_WR)
        print ()
        connection.close()
        connection, client_address = server.accept()
        print ('INFO: Connection from', connection.getpeername())
        print ('INFO: Sending welcome msg')
        send_welcome(connection)
        print ()

    # If we want to stop running the server
    elif data=='end server' or data=='End server' or data=='End Server':
        print ()
        print ('SERVER SHUT DOWN')
        SERVER_LOOP = False

    # Display when data is loaded back on the client side
    else:
            # gives feedback in server command line
            data = json.loads(data)
            owner['test'] = data
            print ('CLIENT: %s' % data)
            message = 'ping'
            connection.send(('SERVER: %s' % message).encode('utf-8'))
            print ('SERVER: %s' % message)

そしてそれで実行するクライアントコード(これはPython 2.7で実行されます)

# Client Program
# Make sure the server is being run in Blender

import socket
import time
import json

print 'INFO: Creating Socket'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

ip_addr = raw_input('IP: ')
port_addr = raw_input('PORT: ')

# Type 'localhost' in the IP field
# Type '8081' in the PORT field

print 'INFO: Connecting to server'
s.settimeout(5) # Times out if 5 seconds without connecting to client
s.connect((ip_addr, int(port_addr)))

# Listen for welcome
data = s.recv(10000)
print data
print ''
while 1:
    message = raw_input('CLIENT: ')
    if message=='end' or message=='End' or message=='END':
            print ''
            print 'SHUTTING DOWN CLIENT, SERVER STILL RUNNING'
            s.send(message)
            break
    elif message=='end server' or message=='End server' or message=='End Server':
            print ''
            print 'SHUTTING DOWN SERVER'
            s.send(message)
            break
    else:
            s.send(message)
            data = s.recv(10000)
            print data

print 'INFO: Closing socket'
s.close()
print 'INFO: Quitting'

さて、明らかにこれは回転を行いません。これは、2つの間のデータ転送が機能することを確認するための単なるテストスクリプトです。そして、それはそうです-Blenderのシステムコンソールでは、データは私が望むように表示されます。しかし、私はBlenderに「test」というタイトルの文字列デバッグプロパティを持っています。これは、クライアントに入力したばかりの現在の数値を表示することになっています。プログラム全体を閉じるまでは表示されません。

例えば:

  • Blenderでサーバースクリプトを実行します
  • IDLEでクライアントスクリプトを実行します
  • クライアント側で数字を入力します
  • サーバー側のシステムコンソールには表示されますが、ゲームエンジンには表示されません
  • クライアント側からサーバーを閉じます
  • これで、最後に入力した番号が最終的にサーバー側に表示されます

したがって、問題は、Blenderがスクリプトを実行し、実行後にゲームエンジンを実行することですが、それらを同時に実行する必要があります。

私の説明が意味をなさない場合はお知らせください。必要に応じて、自分のものにダウンロードを提供できます。

4

1 に答える 1

1

これがまだ問題であるかどうかはわかりません.2月に投稿し、現在は8月ですが、同様の問題の答えを探していました. 問題は、スクリプトの実行が完了するまで Blender がフレームを更新しないことです。フレームがヒットするとすぐにスクリプトが開始され、スクリプトの性質上、ゲームが終了することはないため、ゲームは文字通り最初のフレームで停止します。

現在、server.listen(5) を使用して 5 秒間リッスンすることを意味しますが、その関数の数字 5 は時間の長さではなくバックログを指します[source]。socket.listen() は、無限ループと同じように (私が理解している限り) ゲームを無期限に停止します。

これはあなたが探していた答えではないかもしれませんが、間違いなく答えです。

于 2013-08-14T17:55:50.853 に答える