fawkes-robotino.2016のfvfountainについて
fawkes-robotino.2016の使い方では,
gazeboと,robotino3での動作を確認しましたが,
laptop上で動かすと,以下のエラーが出ます.
wataru@fedoraMini:~/fawkes-robotino/bin$ ./fawkes -p m-fv 16:56:57.298104 PluginManager: Loading plugins fvbase,fvfountain for meta plugin m-fv 16:56:57.685347 stderr: =================================================== BEGIN OF EXCEPTION ===== 16:56:57.685386 stderr: Invalid socket address family, wrong constructor called? 16:56:57.685401 stderr: =================================================== END OF EXCEPTION ======= 16:56:57.685466 FawkesMainThread: Failed to load plugins m-fv, exception follows 16:56:57.685485 FawkesMainThread: [EXCEPTION] Plugin >>> fvfountain <<< could not be initialized, unloading 16:56:57.685485 FawkesMainThread: [EXCEPTION] Could not initialize thread 'FountainThread' 16:56:57.685485 FawkesMainThread: [EXCEPTION] Invalid socket address family, wrong constructor called? 16:56:57.685485 FawkesMainThread: [EXCEPTION] Could not initialize meta plugin m-fv, aborting loading. 16:56:57.685555 FawkesMainThread: Fawkes 1.0.0 startup complete
fvfountainの読み込み時にネットワークのソケットの部分で失敗しているっぽいのですが,
fvfountainのソースも,設定ファイルも,特に変更していないんですよねぇ.
IPアドレスの指定の部分がおかしいっぽいので,もう少し調べてみます.
■調べ中■
エラーを出しているのは,~/fawkes-robotino/fawkes/src/plugins/perception/fountain/fountain_thread.cpp の以下の部分.
void FountainThread::init() { // Start FUSE server unsigned int port = 0; try { port = config->get_uint("/firevision/fountain/tcp_port"); if ( port > 0xFFFF ) { throw OutOfBoundsException("Network port out of bounds", port, 0, 0xFFFF); } __fuse_server = new FuseServer(port, thread_collector); thread_collector->add(__fuse_server); } catch (Exception &e) { e.print_trace(); throw; }
上記のnew FuseServer(port, thread_collector) の部分でsocket address familyに対して怒られています.
thread_collector は,
~/fawkes-robotino/fawkes/src/libs/fvutils/net/fuse_server.cpp の以下の部分.
FuseServer::FuseServer(unsigned short int port, ThreadCollector *collector) : Thread("FuseServer", Thread::OPMODE_WAITFORWAKEUP) { __thread_collector = collector; __acceptor_thread = new NetworkAcceptorThread(this, port, "FuseNetworkAcceptorThread"); if (__thread_collector) { __thread_collector->add(__acceptor_thread); } else { __acceptor_thread->start(); } }
上記の,new NetworkAcceptorThread(this, port, “FuseNetworkAcceptorThread”); で失敗しているっぽいです.
NetworkAcceptorThread は,~/fawkes-robotino/fawkes/src/libs/netcomm/utils/acceptor_thread.cpp のようです.
NetworkAcceptorThread::NetworkAcceptorThread(NetworkIncomingConnectionHandler *handler, unsigned short int port, const char *thread_name) : Thread(thread_name) { __handler = handler; __port = port; set_prepfin_conc_loop(true); try { __socket = new StreamSocket(); __socket->bind(__port); __socket->listen(); } catch (SocketException &e) { throw; } }
上記の __socket->bind(__port); でエラーを起こしているようです.
StreamSockst は,~/fawkes-robotino/fawkes/src/libs/netcomm/socket/stread.cpp のようです.
void Socket::create() { if (sock_fd != -1) return; if (socket_addr_family_ == -1) { throw UnknownTypeException("Invalid socket address family, wrong constructor called?"); } ... }
エラーをはき出しているのは,上記のところです.
言うまでも無く,socket_addr_family_ が -1になっているからエラーになっているようです.
で,そいつは,Socket::Socket(Socket &socket) にて,初期化時に代入しています.
Socket::Socket(Socket &socket) { ... timeout = socket.timeout; sock_fd = socket.sock_fd; socket_addr_family_ = socket.socket_addr_family_; socket_type_ = socket.socket_type_; socket_protocol_ = socket.socket_protocol_; }
って,この代入部分を実行していないような….
昨年のfawkes-robotino (2015) と比較してみると,どうやらIPv6へも対応するようになったみたいです.
ただ,それゆえ,V6の設定ができていないのにv6を使おうとしてエラーになっているのかなぁという感じがします.
というわけで,強引にIPv4で進めちゃうように変更.
2つ上のSocket::creat() のところのエラーの部分を以下のようにして,設定を上書きしちゃいました.
void Socket::create() { if (sock_fd != -1) return; if (socket_addr_family_ == -1) { socket_addr_family_ = AF_INET; addr_type = IPv4; // throw UnknownTypeException("Invalid socket address family, wrong constructor called?"); } ...
もし,IPv6環境下で実行するのであれば,上記をAF_INET6と,IPv6に書き換えて下さい.
責任持ちませんが,とりあえず動いたから良としよう(´-ω-`)
コメントを残す