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に書き換えて下さい.
責任持ちませんが,とりあえず動いたから良としよう(´-ω-`)
コメントを残す