水彩(仮)

NULLPointerExceptionガッ

入る研究室がない?お金で決めちゃえば?

タイトルがやばいやつ。

さてそろそろ学部生3回生の皆様はそろそろ研究室やゼミどこにしようかなーとか考えていることと思います。

まあ、2回生に入る方などもいらしゃいますが...。 学部でご卒業される方は1年、院まで考えている方は3年または5年 お世話になることになります。

就職ほどではないにしても大事な選択であることは間違い無いでしょう。

どの研究室、ゼミにするか、なんてのは中々決め手にかけるもので、 様々な判断基準が存在します。

他の判断基準は他の方にお任せするとして、今回私が提案したい手法は 「研究室のお金で決めるのもいいんじゃね?」 です。

「それはちょっと...」という方、気持ちはわかります。 しかし考えてみてください。 研究室選びより重要な就活でも

「お金で決めればいいんじゃない?」

という意見もあり、一定の賛成を得ています。

とはいえ就職の場合は自分がもらえる給料の話をする文脈で出てくる意見ですが、研究室の場合はちょっと違う観点になります。

どちらかというと就職する会社の財務を見るのに近い意味になります。

ここで一つ質問です。 教授が持っている研究室はどうやって運営しているのでしょうか? 営利企業では無いため、売り上げなどは当然ありません。

主に3つから成ると考えられます(あまり自信が無いため他にある場合は教えてください)。 まずは大学全体から配布されるお金ですね。

主に運営交付金 (私立大学の場合は経常費補助)や学費から賄われるものです。

これは大学を移動するならともかく、それほど交付される金額は研究室ごとには異ならないでしょう。

運営費交付金文部科学省の予算案から見ることができます。

次に共同研究で企業からもらうお金です。 企業から「こういう研究したいんで、知恵貸してくださいませんか?あ、お金は払うんで」というお金ですね。

こちらは企業対研究室のお金になるのではっきりとした金額は出ないでしょう (まあそれでも上場している企業なら概算ぐらいはできるでしょうが)。

最後にこれが一番大きいお金で科研費という奴です。

正式名称は「科学研究費補助金」。まんまですね。 さてこれは一般に競争的資金と呼ばれるもので共同研究同様、研究室によって異なるお金となります。

共同研究が多くて、科研費が多いなら潤沢な研究室となります。 資金が潤沢な研究室であれば、設備が多くある種研究しやすい研究室となるでしょう (あくまで資金の面では)。

さて、ここでもう一度整理しておきますと ある教授が研究室を運営するためのお金は

  1. 運営費交付金
  2. 共同研究のお金
  3. 科研費

ということになります。

具体例を出そうと思いましたが、面倒臭くなったので

見るべきページだけ

www.mext.go.jp

運営費交付金に関するURLです。

kaken.nii.ac.jp

科研費に関するURLです。

共同研究に関しては基本的に表に出す情報ではないので 希望の研究室のページを見るなどをするのが良いと思います (たまに書いてる)。

インドビザ(カンファレンスビザ)をなんとか取る方法

はい。この時期(2018年8月初旬)ならINTERSPEECH2018 (http://interspeech2018.org/)しかないですね。

なんとか手に入れたので情報を共有をします。

なるべくカンファレンスビザ全体の話をしますが、INTERSPEECH2018の話も入るかも。

まず、INTERSPEECH2018組の方でまだビザの準備なんてしてないぜ、なんて皆様にはこのアドバイスをまず送りましょう。

今すぐカンファレンス運営にメールを送り招聘状の原本をもらいましょう。

それでは詳しく見ていきましょう。

参考したページ

https://5star-traveler.com/2017/09/21/indianvisa-guide
https://around-india.com/1711-tourist-evisa/#i

短くまとめると

必要物

  • onlineフォームで作ったビザ申請書
    onlineでの写真は登録する必要はありません!! ビザの機関は申請日からカンファレンス日程を含む長さにしましょう
  • 5cm x 5cmの白背景の写真
  • 自分の所属する機関からの推薦状(自己推薦状)
  • カンファレンスから発行される招聘状
    必ず原本にしよう!!
  • 政府から用意されるなんやかんや(5枚くらい)
    原本である必要なし。カンファレンス運営がくれるはず

GazeboのSDFをできるだけ試してみる

地味オブ地味.

ROSとかで基本的な動作はできたけどここにGazebo上で机とか置てえな…って時ございますよね?

GUIから置けばいいんですが自動生成されるコードはあんまり美しくない…

ので私はXMLを一から書きます.

ロボットの制御で採用(Gazeboで採用)されているのはSDFという方式です.

というわけで需要があるかは知りませんが,SDFの属性を試せるだけ試してみましょう.

まずが最も上にあります.versionによってちょいちょい異なります. 今回はversionは1.5にします.

まず基本はこのような感じになります.これをGazeboで起動してもなんにも起こりません.

<?xml version="1.0"?>
<sdf version="1.5">
</sdf>

子属性は, , , に分かれます.

続きはどんどん書いていきます.

Gazebo8.0リリース記念

リリースされました. というわけで所感をまとめていきます.

ハイライトは以下の通りです

  • Plotting Utility
  • Video Recording
  • QT5 support
  • Visual markers
  • Improved quadcopter simulation
  • Import OBJ files
  • Generalization of Actor animations
  • Migration to Ignition-math

ちょいちょい前と書いてたことと変わってますね.

GUI

まずは見た目を見てみましょう.

Gazebo7.5.0

f:id:syoamakase:20170216170543p:plain

Gazebo8.0.0

f:id:syoamakase:20170216170730p:plain

まあ,あんまり変わってないです.ボタンが増えたかな?

というわけで次

Plotting Utility

モデルの状態などをプロットして逐次見ることができる機能.

[window] → [plot] または 右上にあるグラフのアイコンをクリック. または Ctrl+p

で起動します.

f:id:syoamakase:20170216171419p:plain

こんな感じの画面が出てきます.

デフォルトではx軸がsim_time(シミュレーション内の時間)で,y軸が空です.

ではなんか適当に動かしてみましょう.

turtlebot君を等速直線運動させました

f:id:syoamakase:20170216172651p:plain

前に進んでいる様子が見れますね.

このグラフをpdfにしたり,移動をcsvにできるみたいですが今表示されている範囲しか値がとれず 逐次更新される形式でもないみたいです.

逐次にできれば結構使えそうですけどねぇ.

Video Recoding

ほぼ,文字通り. 右上のほうのビデオボタンをクリックして録画を開始,停止する.

mp4,ogv,v4lに対応.

mp4以外よく知らない.

Qt5 Support

QtとはGUIのツールキットです. Qt5への以降が行われています.

私はQtに詳しくないので(教えて偉い人) GUI自体に現れているかは分からないですが

APIを作成する際のC++のヘッダファイルには違いがありました. インストール方法にもよりますが

/usr/include/gazebo-<version>/gazebo/gui/qt.h

を見比べますと

gazebo7.5.0

#include <QtGui>
#include <QX11Info>
#include <QWidget>
...

gazebo8.0.0

#include <QtCore/QtCore>
#include <QtCore/QPoint>
#include <QtCore/QPointF>
#include <QtCore/QSignalMapper>

#include <QtGui/QBitmap>
#include <QtGui/QDrag>
#include <QtGui/QPainter>
#include <QtGui/QResizeEvent>
#include <QtGui/QStandardItem>
#include <QtGui/QVector3D>
#include <QtGui/QWindow>

#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QColorDialog>
#include <QtWidgets/QComboBox>
...

定義の仕方に違いがあり,どうも調べるとちゃんとQt4からQt5の書き方に変わっているみたいです.

詳しくないので間違っていたらごめんなさい.

Visual markers

シミュレーションに影響しない(衝突したりしない)マーカーの作成できるそうです.

C++APIを書くかgz marker <command>でできるそうです.

Gazeboを起動後

gz marker -m 'action: ADD_MODIFY',type: TEXT, text:"Hello World!!", id: 2, scale: {x:1.2, y:1, z:2.1}

をするとこんな感じ.

f:id:syoamakase:20170216181915p:plain

なぜか位置調整ができなくて裏側から見てますが.

残りは次回にします.

Gazebo 8.xリリースして何が変わるのか

さて,OSRFからGazebo8.0が2017年1月25日にリリースされます(予定).

何が変わるのかちょっと見てみましょう.

変更点

  • GUI plotting utility and system instrospection
  • GUI model editor
  • Generalization of Actor animations
  • QT 5 support
  • Import OBJ files
  • Support for Wind
  • Quadcopter simulation
  • Built-in video recording

Windowsのサポートがまた消えているでござる…. ちなみにもともとGazebo7.0のときに予定に書いてありましたけどね…繰越しまくりである.

何も言わずに変えてくるのでこれももしかすると確定ではないかも.

軽い説明

  • GUI plotting utility and system instrospection
  • GUI model editor

基本的にはGUIを強化してくるみたいです.ある種基本的な部分は成熟したと言えるのかな?

  • Generalization of Actor animations

行動の一般化とのことですが,何をどのように一般化するんでしょうか? API系の変更の可能性が高いですね.

  • QT 5 support

QTとはGUI開発のためのライブラリ群です. これもAPI中のgui.hh辺りの変更であると思われます.

  • Import OBJ files

objファイルとは3dモデルデータの保存形式の一つです. 現状(7.4)ではdaeファイルのみのサポートなので増やしたということだと思われます.

  • Support for Wind

風のシミュレーションです.それよりも球に対しての摩擦をサポートしてほしい感.

  • Quadcopter simulation

ドローンのシミュレーションができるようになります. もともとなかったかな?

  • Built-in video recording

スクリーンショットと同様にビデオキャプチャができるようになると思われます.

諸注意

ROSを入れている方はおそらく時間がたたないと使えないと思います. 後,サポートが2019年と7.xより短い(7.xは2021年)ため,9.0への布石感が強いですね.

またリリース後に変更点を追ってみようと思います.

Gazebo入門4

さて,今回はせっかくなので,ちょっと実戦向きなことをしてみましょう.

今回行うことは

メインはプラグインの作成になります.プラグインの作成については

gazebosim.org

を参考にしています.

さて、まずはプラグインの作成ということで,Cameraのプラグインを作りましょう.

ソースコードは以下となります.

以下に表示されるCameraPlugin.cc, CameraPlugin.hhはApache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) の元で公開されています.

CameraPlugin.cc

/*
 * Copyright (C) 2012-2016 Open Source Robotics Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/
#ifdef _WIN32
  // Ensure that Winsock2.h is included before Windows.h, which can get
  // pulled in by anybody (e.g., Boost).
#include <Winsock2.h>
#endif

#include "gazebo/sensors/DepthCameraSensor.hh"
#include "CameraPlugin.hh"

using namespace gazebo;
GZ_REGISTER_SENSOR_PLUGIN(CameraPlugin)

/////////////////////////////////////////////////
CameraPlugin::CameraPlugin()
: SensorPlugin(), width(0), height(0), depth(0)
{
}

/////////////////////////////////////////////////
CameraPlugin::~CameraPlugin()
{
  this->parentSensor.reset();
  this->camera.reset();
}

/////////////////////////////////////////////////
void CameraPlugin::Load(sensors::SensorPtr _sensor, sdf::ElementPtr /*_sdf*/)
{
  if (!_sensor)
    gzerr << "Invalid sensor pointer.\n";

  this->parentSensor =
    std::dynamic_pointer_cast<sensors::CameraSensor>(_sensor);

  if (!this->parentSensor)
  {
    gzerr << "CameraPlugin requires a CameraSensor.\n";
    if (std::dynamic_pointer_cast<sensors::DepthCameraSensor>(_sensor))
      gzmsg << "It is a depth camera sensor\n";
  }

  this->camera = this->parentSensor->Camera();

  if (!this->parentSensor)
  {
    gzerr << "CameraPlugin not attached to a camera sensor\n";
    return;
  }

  this->width = this->camera->ImageWidth();
  this->height = this->camera->ImageHeight();
  this->depth = this->camera->ImageDepth();
  this->format = this->camera->ImageFormat();

  this->newFrameConnection = this->camera->ConnectNewImageFrame(
      std::bind(&CameraPlugin::OnNewFrame, this,
        std::placeholders::_1, std::placeholders::_2, std::placeholders::_3,
        std::placeholders::_4, std::placeholders::_5));

  this->parentSensor->SetActive(true);
}

/////////////////////////////////////////////////
void CameraPlugin::OnNewFrame(const unsigned char * _image,
                              unsigned int /*width*/,
                              unsigned int /*_height*/,
                              unsigned int /*_depth*/,
                              const std::string &/*_format*/)
{
  rendering::Camera::SaveFrame(_image, this->width,
    this->height, this->depth, this->format,
    "me.jpg");

}

CameraPlugin.hh

/*
 * Copyright (C) 2012-2016 Open Source Robotics Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/
#ifndef _GAZEBO_CAMERA_PLUGIN_HH_
#define _GAZEBO_CAMERA_PLUGIN_HH_

#include <string>

#include "gazebo/common/Plugin.hh"
#include "gazebo/sensors/CameraSensor.hh"
#include "gazebo/rendering/Camera.hh"
#include "gazebo/util/system.hh"

namespace gazebo
{
  class GAZEBO_VISIBLE CameraPlugin : public SensorPlugin
  {
    public: CameraPlugin();

    /// \brief Destructor
    public: virtual ~CameraPlugin();

    public: virtual void Load(sensors::SensorPtr _sensor, sdf::ElementPtr _sdf);

    public: virtual void OnNewFrame(const unsigned char *_image,
                              unsigned int _width, unsigned int _height,
                              unsigned int _depth, const std::string &_format);

    protected: unsigned int width, height, depth;
    protected: std::string format;

    protected: sensors::CameraSensorPtr parentSensor;
    protected: rendering::CameraPtr camera;

    private: event::ConnectionPtr newFrameConnection;
  };
}
#endif

さて,このプログラムはxml(あるいはworld)で定義されたCameraのフレームごとにカメラが見ている画像をカレントディレクトリにme.jpgとして保存します.

ソースコードの解説の前に動かしてみましょう.

コンパイルするために以下のCMakeLists.txtを用意してください.

CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

find_package(gazebo REQUIRED)
include_directories(${GAZEBO_INCLUDE_DIRS})
link_directories(${GAZEBO_LIBRARY_DIRS})
list(APPEND CMAKE_CXX_FLAGS "${GAZEBO_CXX_FLAGS}")

add_library(CameraPlugin SHARED CameraPlugin.cc)
target_link_libraries(CameraPlugin ${GAZEBO_LIBRARIES})

そして次に以下のコマンドでコンパイルをします.

mkdir build
cd build
cmake ../
make

コンパイルに成功するとbuildの中にlibCameraPlugin.soファイルが出来上がっていると思います.

そして次のxmlファイルを用意します.名前は何でも良いです.

<sdf version='1.6'>
  <world name='default'>
    <include>
        <uri>model://ground_plane</uri>
    </include>
    <include>
        <uri>model://sun</uri>
    </include>
    <model name="camera">
    <link name="link">
      <gravity>false</gravity>
      <pose>0.05 0.05 0.05 0 0 0</pose>
      <inertial>
        <mass>0.1</mass>
      </inertial>
      <visual name="visual">
        <geometry>
          <box>
            <size>0.1 0.1 0.1</size>
          </box>
        </geometry>
      </visual>
      <sensor name="camera" type="camera">
        <camera>
          <horizontal_fov>1.047</horizontal_fov>
          <image>
            <width>320</width>
            <height>240</height>
          </image>
          <clip>
            <near>0.1</near>
            <far>100</far>
          </clip>
        </camera>
        <always_on>1</always_on>
        <update_rate>30</update_rate>
        <visualize>true</visualize>
        <!-- プラグインの挿入 -->
        <plugin name="CameraPlugin" filename="libCameraPlugin.so"/>
      </sensor>
    </link>
    </model>
  </world>
</sdf>

ここまで用意をして,GAZEBO_PLUGIN_PATHの環境変数をlibCameraPlugin.soがあるディレクトリに設定をして,

gazebo <world file name> --verbose

そうすると

f:id:syoamakase:20160823140019p:plain

こんな感じの画面が起動します.

カレントディレクトリを見てみるとme.jpgというのがあると思います.

カメラの前にモデルを置くと画像も変わるかと思います.

ソースコードばかりでなかなかわかりにくいかと思いますが,以上でカメラのプラグインの作成ができます.

Gazebo入門3

さて,前回は結構複雑というか,「使わねーよ.」なんて声が聞こえてきそうなちょっとニッチな感じでしたが,

話を少し戻しまして,起動した後のお話をしましょう.

まあ,GUI部分はなんとなく直感的にわかるとは思うので,ショートカットキー関連を.

このページにあります.また,Help -> HotKey Chartでも参照することが出来ます.

ではその中からいくつか紹介します.

  • ESC

通常モードです.起動時のモードとなります.

  • r

回転モード(Rotate mode).選択したモデルを回転させることが出来ます.

f:id:syoamakase:20160620124848p:plain

  • t

移動モード(Translation mode).選択したモデルを移動させることが出来ます.地面とかに埋めるとどっかに飛んでいったりするので注意.

f:id:syoamakase:20160620124800p:plain

  • s

拡大縮小モード(Scale mode)です.引き伸ばしたり,縮めたり出来ます.Shiftを押しながら拡大縮小にすると大きさの比率を一定にしつつ出来ます.

f:id:syoamakase:20160620130450p:plain

  • n

Snap mode らしいですが,これは何でしょうか?テクスチャが見えるのかな?ちょっとわからないのでわかる人がいたら教えてください.

f:id:syoamakase:20160620125114p:plain

  • Ctrl + r

worldをリセットします.モデルは初期位置に(新規に置かれた場合は置かれた位置に)行きます. シミュレーター内の時間も0秒になります.

  • Ctrl +Shift + r

モデルの位置をリセットします.こちらはCtrl + rと異なり,時間は巻き戻りません.

また,端末上から

gz world -r : ワールドリセット

gz world -t : 時間リセット(モデルはリセットされない)

gz world -o : モデルリセット(時間はリセットされない)

でも出来ます

これぐらいでしょうか.さっと使えるといい感じだと思います.