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に書き換えて下さい.

責任持ちませんが,とりあえず動いたから良としよう(´-ω-`)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*