カテゴリー別アーカイブ: 研究開発・作品紹介

部員の研究・作品紹介

ModernなOpenGLを書きましょう

どうも、チョコです。
最近いろいろあってOpenGLについて調べた結果、その知見を共有したいと思います。

OpenGLは近年(最近とは言っていない)programmable pipeline(つまりシェーダが書ける)を導入し、v3.0以降にはfixed function(シェーダが書けない)関数をdeprecateしました。しかし、OpenGL context(初期化)を作るときにcoreじゃなくてcompatibleにすると古い関数はまだ使えます。これは落とし穴です。

なぜかというと、プラットフォーム(やハードウェア)によって動かなくなるからです。

Windows(OpenGL 4.5) ではうまく動いたり、
Android(OpenGL ES 3.0) では半分動いたり、
VM上のUbuntu(OpenGL 3.3) では全然動かなかったりします。<いまここ

なんでこんなつらい目に合ってるのでしょう?

答え:公式レファレンス(man pageなど)が古い(場合によっては間違っている)からです!!
(K〇大学のS〇工学科でも一番古いやり方を教えていることを最近分かったんですよね)

そもそも同じことをするにはいろんなやり方があり、どっちも(場合によって)動くのでこれといった答えはないが、やっぱり古いAPIは使いたくないですね。

そこで、新しい書き方についてちょっとだけ紹介したいと思います。

Programmable Pipelineでは、xxBeginやxxEndが使われないのが特徴です。また、データ集(頂点など)はバッファ(Array)で渡し(つまりあらかじめGPUに保存させる)、シェーディングは全部シェーダでやります(glShadeXXはダメ)。

従来のやり方を見てみましょう。

一番古い(のに未だによく見かける)書き方はこれでしょう。

glBegin(GL_LINES);
glVertex3f(...);
glVertex3f(...);
glEnd();

読んでるだけで目が痒くなりますね。

では、ちょっと新しい書き方だとどうなるのでしょう。

vec3 vertices[2];
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, &vertices[0]);
glDrawArrays(GL_LINES, 0, 2); //あるいはglDrawElements
glDisableClientState(GL_VERTEX_ARRAY);

バッファを使いましたね。ちょっときれいになりましたね。先週まではこれで書いていましたね(反省中)。

しかし、これでも動かないときもあって、なぜかというとこれも古い書き方だからです*!
*ソース

では、Modernな書き方*は何でしょう?

vec3 vertices[2];
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, &vertices[0]);
glDrawArrays(GL_LINES, 0, 2);
glDisableVertexAttribArray(0);

参考

*スペースがないので、実際に使ったコードはここを参照してください。

何が違ったというと、古いOpenGLでは頂点や法線などのバッファー位置が固定されていて、glVertexPointerなどで渡さないといけなく(VERTEX_POINTERやらCOLOR_POINTERやらで固定され)、自由度が減っています*。逆に、glVertexAttribPointerは、シェーダ内のパラメータ(uniform in vec3 position)などにデータを渡すので、関数が一般化されて自由度が上がります。
*ソース

さらに、頂点データは全部あらかじめGPUに保存させることになりますし、シェーダを使わない選択肢はありません(考えてみれば理解できます)。ある意味めんどくさいところもありますが、すごく一般化されたAPIになりますね。そして、初期化(vaoのセットアップ)は1回だけなので、繰り返し使うときのコードを短縮できますね。

OpenGLの仕様が変わるのそろそろ10年経ちますし、みなさんもModernなGPUを最大限に生かして、ModernなOpenGLを書きましょう!

では。

 

後書き
仕様を探るときにはいつも公式レファレンスを読んでいましたが、読みやすくて使用例が載っていてdeprecateされたものもはっきり書いてあるコミュニティ制レファレンスを今度読んでみましょう。

後後書き
古いものを読んでしまう可能性があるので公式しか読んでいないのに、公式自体が古いというのはちょっと刺さりますね。

後後後書き
glutを使っているとcontextがしょうがなく古くて(freeglutならglutInitContextVersionで)、glfwを使っているときにglfwWindowHintでcontextを指定できます。

後後後後書き
ここの教えている書き方はModernなのでいいです。

後後後後後書き
僕もこれが一番新しい書き方かの自信はそこまでないので、OpenGLに詳しい方がいらっしゃったら教えていただけるとありがたいです。

広告

世界を記述する、エッシャーのタイリング【C++とQtでGUIプログラミング】

この記事は慶應ロ技研 Advent Calendar 2017の24日目の記事です。

23日目:Listで遊ぶ||25日目:慶應義塾の4文字

 

こんにちは。日吉図書館の閲覧席にて大声でレストランの電話予約をする輩を見て、嗚呼彼は世界の思惑にまんまと乗せられてしまっているのだなぁと憐れみの念を覚えました運慶です。私を置き去りにして今年も経済は順調に回っているようですね、ふふふ…(暗黒微笑)(ダークマター)

概要

さて、私は去年のアドヴェントカレンダーで何の役にも立たないクソ記事を生成してしまったので、今年こそは技術的なお役立ち記事を書いてやるぞと考えていたのですが、今年のロ技研のアドヴェント記事には既にためになる技術系記事が沢山出ていて、完璧すぎてむしろ一日ぐらいクソみたいな記事を挟んでもいいのではないかと思われるので(勝手な判断)、私のロ技研部員としての秋学期の個人研究の成果について書こうかなと思います。去年と違ってちゃんと技術的な話もするのでどうか許して…。

私は秋学期中、個人研究と称してプログラミングをやっていました。ただ、コンピュータ部に所属していた中学生の頃に、(部なのにあまり教育してもらえなかったので)プログラミング言語を独学で文法からきちっと学ぼうとして挫折したことがあり、再び正攻法で学んでいくことに大きな不安があったので、言語の学習はそんなに真面目にやり直さずに、とにかく作りたい作品をいきなり作り始めることにしました。

目標にしたのは、「画家エッシャーのタイリング系の作品を楽に生成できるソフト」の製作です。「エッシャーのタイリング系の作品」とは、下記リンク先のページにあるような、平面を単一または複数種類のタイルで埋め尽くした感じの版画群です。

M.C. Escher – Image Categories – Symmetry

(本当はこの記事に直接画像を埋め込みたいのですが、エッシャーの作品はまだ権利が放棄されてないみたいなので出来ません。申し訳ありません。是非リンク先の画像を見てみて下さい)

結論から言うと、タイリングっぽく見える画像を生成するための最低限の機能を有するそれっぽいソフトが製作できました。この記事では、今回作ったソフトの話をします。途中何度も文法の不理解による大幅な停滞や課題や試験などによる中断があったりしたり、そもそも製作者自身のおつむがかなり弱かったりするので、ソフト自体のクオリティーは期待しないで下さい()

この記事ではエッシャーについての話もしたいとは思いますが、技術の話から遠ざかってしまうので、ソフトの話が終わった後の「おまけ」として少しだけつけることにします。エッシャーに興味を抱いてくれた方は「おまけ」も斜め読みして下されば幸いです。 続きを読む

深遠なるニッパーの世界

これは慶應ロ技研 Advent Calendar 2016 23日目の記事です。

←22日目:おいしい倒立振子 / 24日目→乞うご期待


挨拶

こんにちは。「冬はつとめて」とは言いますが、こう寒い朝が続くと起きるのがどんどん遅くなってしまうimhotep310です。昔の人は偉いですね。ブログどころかTwitterもやってない身としては慣れないブログ投稿にビクビクしています。果たして私は正しく投稿できるのでしょうか!? 続きを読む

ロギ犬をベクタ画像にしてみた

こんばんは,僕はロ技研のアイドルであるロギ犬のプロデューサーを自称し,ロギ犬に変わる新たなマスコットを擁立せんとする闇の組織と日々戦っているせきごんというものです.急遽アドベントカレンダー20日目に参加することにしましたが,運悪く2日連続ロギ犬ネタとなってしまいました.

ロギ犬は華やかさが欠片もないシンプルなデザインですが,シンプルであるからこそ,絵心がない人にも簡単に書けるという素晴らしい特徴を持っています.長方形を9個並べるだけで書けるマスコットキャラ.いいですね.

最近,長方形だけで書けるということはロギ犬をベクタ画像にしたら軽量になるに違いないということに気が付きました.デザインした人もそのあたりを考慮して作ったのかと思いましたが,部内のリソースにベクタロギ犬は見当たらなかったので作ってみました.とりあえずInkscapeでトレースして,svgoで最適化したところ,pngで7kBだったロギ犬がsvgで1kBになり85%軽量化しました.しかもベクタ画像なので幾らでも拡大できます.

残念ながらwordpressはデフォルトでsvgに対応していないようなので,リンクを貼っておきます.

https://drive.google.com/open?id=0BwvCu9TdNxuGQVlQRlhpMHZzOFE

作っている途中,実はロギ犬の右耳は長方形ではなく台形であるということに気づいてしまいましたが,まあ一箇所台形にしたところで対して容量は変化しないので台形にしておきました.

部内での地盤固めだけでなく,対外的にもロギ犬を押していくことで,マスコットとしての盤石の地位を確立していきたいです.

PythonでTwitterAPIをいじろう [Advent2016]

これは慶應ロ技研 Advent Calendar 2016 13日目の記事です。

←12日目の記事 / 14日目の記事→


ご挨拶

どうもこんにちは、tokkyo13です。こうやって、ブログとかを書くのは初めてなので緊張しています。今も、震える右手を左手で必死におさえながら文字を打っています。今回Advent Calendarに参加するにあたって、なんのネタもなかったので、1,2日かけてPythonでTwitterを操作する方法を模索していました。この記事はそれを2,3日前の僕に解説するつもりで書いたものです。未熟者ですが、どうぞ宜しくお願いいたします。


APIとは?

さて、タイトルから分かる通り、この記事のテーマはTwitterです。皆さんはTwitter 使ってますか?使ってる、あるいは使ったことがある人ならわかると思いますが、Twitter上にはbotなるものが存在しますね。定期的に同じことをつぶやいたりする、あれです。(ちなみに僕はバイオゴリラbotが好きです)

でもあれ、どういう仕組みでうごいてるのか気になりませんか? 気になれ!

結論から言うとbotの機能はTwitterが公開しているTwitterAPIを利用して実現しているんです。それだけじゃないです。botに限らず、(みなさんが一度くらいはしたことがあるであろう)アプリ認証を求めてくるサービス、さらにはみなさんのスマホにインストールされているTwitterアプリでさえ、すべてTwitterAPIを利用しています。

APIというのは、僕が理解できた範囲で言うと、ウェブサービス(Twitter、Youtube、Amazon…etc)が、外部向けに公開している、各サービスへアクセスする方法のようなものです(要出典)。APIが公開されているからこそ、botがTwitterにアクセスできるし、ウェブページにYoutubeの動画が埋め込めるし、アフィカスが稼げるというワケです。

ということは、このAPIなるものを利用すれば、Twitterでなにか楽しいことができるはず!!ということですね。


TwitterAPIをどう使うか

では具体的に、公開されているTwitterAPIとはどのような情報なのか。簡単に言うと、「このアドレスにこういうリクエストを送信すると、こういう情報が返ってくるよ。」のような情報です。これをどんな形で使うかは人それぞれで、いろんなプログラミング言語で使えます。(世に出回っている解説書ではPHPのサンプルコードが多かったです)

僕はPythonというプログラミング言語をつかってみたいなぁ、と前々から思っていたので、それを使うことにしました。(細かいこと言うと、今回使ったのはPython3です)

PythonでTwitterAPIを使う方法を調べると、TweepyというTwitterAPI用のライブラリが存在することがすぐにわかりました。ライブラリというのは、「汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの」(wikipedia) だそうです。

やるべきことがだんだん明確になってきましたね!


Tweepyのインストール

注:これ以降は環境によって多少違いがあると思います。僕の環境は、macにPython3がインストールされている状態です。(時間の都合上、Pythonのインストールについては解説しません。ググってください)

では早速Tweepyのインストールからやっていきます。以下の3ステップで終わります。

  • get-pip.pyをこのページからダウンロードする。(リンク先のページ内にある、get-pip.pyというリンクを右クリックして、保存を選びます。)
  • ダウンロードしたファイルをターミナルで実行する。(ファイルを保存したディレクトリに移動してからでないと実行されません。例えばデスクトップにファイルを保存した場合、以下のように入力します)
$ cd desktop
$ python3 get-pip.py
  • Tweepyをインストールする。以下のようにターミナルに入力します。
$ pip install tweepy

これで、Tweepyのインストールは完了です。


各種アクセスキーを入手する

Tweepyもインストールできたし、いよいよツイッターAPIをいじれる!……かと思いきや、まだです。まだやることがあるのです。それはアクセスキーの入手です。

TwitterはAPIを公開していますが、そのAPIを使うためには4つのカギ(暗証番号)が必要なのです。以下、その手順を説明します。

  • ツイッターアカウントを作る。(当然ですね)
  • ツイッターアカウントを電話番号と紐付ける。このページで設定ができます。
  • Twitterアプリを作成する。このページでCreate New Appと書いてあるボタンをクリックします。するとこのような画面が表示されると思います。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-11-14-33-57

Nameは作成するアプリの名前です。すでに存在する名前でなければなんでもいいです。32文字以内です。

Descriptionは作成するアプリの内容についての説明です。めんどくさいですが、10文字以上は何か書かなくてはいけないようです。適当に埋めときましょう。

Websiteは作成するアプリが存在するウェブサイトのURLを入力するところです。今回はまだWebアプリを作成するような段階まで進まないので、なんでもいいです。僕は、自分のブログページのURLを入力しておきました。

Callback URLは、詳しく調べていないのですが、作成するアプリがユーザーのアプリ認証を終えた後に自動的に移動する先のURLだと思います。今回はWebsiteで入力したURLと同じで問題ないです。

以上4つの項目を埋めたら、Developer Agreementに同意するにチェックを入れて、Create Your Twitter Applicationと書かれたボタンをクリックします。これでTwitterアプリの作成は完了です。

  • 4つの鍵をメモする。Twitterアプリの作成が終わると、アプリの管理ページが表示されると思います。管理ページはDetails、Settings、Keys and Access Tokens、Permissionsの4つのタブにわけられているので、Keys and Access Tokensを開きます。するとこのような画面が表示されると思います。(黒塗りで隠していますが、英数文字列が表示されているはずです)

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-11-15-40-56

ここに表示されているConsumer Key (API Key)Consumer Secret (API Secret)をメモします。

続いて、ページの下の方を見ると、Access Tokenを生成するボタンがあるので、それをクリックし、このような画面を表示させます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-11-15-41-42

同様にAccess TokenAccess Token Secretをメモします。

これで、4つの鍵が揃い、ようやくTwitterAPIを使う準備が整いました!疲れた…。


Tweepyの使い方

では、満を持してTwitterAPIをいじっていきましょう!Tweepyのドキュメンテーションを読むと、下のような基本形のPythonプログラムが紹介されています。

import tweepy

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

public_tweets = api.home_timeline()
for tweet in public_tweets:
    print tweet.text

これは何をするプログラムかというと、「自分のアカウントのタイムライン(TL)から、最新のツイート20件の情報を取得し、その文章をターミナル上に表示する」プログラムです。

7行あるプログラムのうち、上4行はTwitterAPIを使うためのインスタンスを作成するプログラムで、カッコの中のconsumer_key、consumer_secret、access_token、access_token_secretは、先程メモした英数文字列に置き換えます。この4行はTweepyを使うプログラムでは、必ず記述する必要があります。

下3行は、このプログラムが具体的に何をするかを決めています。そして、ピンク色の部分が、TwitterAPIを実際に利用しているコードです。

Tweepyが提供してくれる関数(要出典)は以下のような形で使います。

api.関数名(引数=値, 引数=値,...).取り出したいデータポイント

引数に何を入れればいいのかは、Tweepyのドキュメンテーションに書いてあります。

上のプログラムで使っている「home_timeline」は「自分のアカウントのTLから最新のツイートの情報を取得する」関数で、最後の行で「.text」が適用されて、文章内容が表示されています。実は、home_timelineが取得する情報は大量で、その一部として「text = ‘ツイート内容’」があるのです。

試しにデータポイントを何も指定せずに最初のプログラムを実行してみると、大量のデータがターミナル上に表示されるでしょう。送られてくるデータは、「text」や「statuses_count」などのデータポイントの名前と、数値、文字列、辞書などのデータがセットになっているので、それを見ながらどんな情報を取り出すことができるのか知ることができます。

Tweepyの使い方は大まかに言うとこれだけです。(これ以外の使い方には手を出していないのでわからない、と言った方が正確かもしれません)


idの罠

引数やデータポイントとして使われる変数の中に「id」があります。しかし一言でidと言っても指すものが複数あり、非常にわかりにくかったのでここで、わかったことをまとめます。

user_id:ユーザーが持つ固有の番号。途中で変更はできない。「@tokkyo13」のようなものは「screen_name」という別物だが、役割はほとんど同じ。

api.get_user(id='@tokkyo13').id   #@tokkyo13のユーザー情報を取得し、user_idを返す

status_id:各ツイートが持つ固有の番号。Twitter上でツイートの詳細を開くとアドレスバーに表示される。

api.home_timeline(count=1),id  #自分のTL上にある最新のツイートの情報を一件取得し、status_idを返す。

リツイートid:他人のツイートをリツイートしたときに、そのツイートが持つステータスidとは別に、新たに生成される番号。リツイート取り消しは、「ツイート削除の関数destroy_statusに、このリツイートidを引数として渡す」という仕様になっています。

api.user_timeline(id='@tokkyo13', count=1).id  #@tokkyo13の最新のツイート一つの情報を取得し、リツイートidを返す

api.home_timeline(count=1, include_my_retweet=1).current_user_retweet  #自分のTL上にある最新のツイート一つの情報を取得し、それが自分のリツイートであった場合、リツイートidを含む辞書データを返す

実践

やはり応用例として何か自分でも作らなければいけないな、と思ったので、自分のツイートを全部削除するプログラムを作ってみました。動機は、以前mt_caret君(Advent Calendar 2016 3日目担当)が、トラブルを避けるために定期的にツイートを全部消しているという話を聞いたことをふと思い出したからです。(彼も何かしらのプログラムで操作していたと思います)

作ったコードはこんな感じです。

import tweepy

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

#自分のアカウントの情報を取得
me = api.me()

#総ツイート数(リツイートを含める)を取り出す
count = me.statuses_count

#総ツイート数を表示
print('総ツイート数:',count)

#ツイートが0になるまで繰り返す
while count > 0:
          for tweet in api.user_timeline(id = me.id, count = 200): #一度に200のツイート情報を取得する
                   api.destroy_status( tweet.id ) #それぞれ削除していく
                   count -= 1 #総ツイート数を1減らす
                   print(count) #総ツイート数を表示する

print ('finish')

一度に200のツイート情報を取得する意味は、単に僕の環境では一度に200が限界だったからです。それ以上の数をcountに指定しても、意味がありませんでした。

そしてこれを実行すると…

img_3734

おお〜!どんどんツイが消えていく…!

そして数十分後、5500件ほどのツイートが全部消えました。しかし最後にAPI通信制限がかかり、エラーを吐いて終了したので少し後味が悪かったです。みなさんも気をつけましょう。

APIの中には、短時間の間にたくさん利用すると、一定期間使えなくなるものがあります。ファボ魔が「ファボ規制かかった〜」とか言ってるあれです。


おわりに

PythonでTwitterAPIを操作するための入口になるような記事を目指しました。よくよく考えると、全然ロ技研と関係なかったような気もしますが、もういまさら遅いので考えることはやめましょう。ここまで読んで下さった方には感謝しかないです。この記事が少しでも役に立ったり、興味を掻き立てたなら光栄です。では皆さん良いクリスマスとお正月を〜😌


おまけ

僕が今回、PythonでTwitterAPIをいじるにあたって、一番大きな壁となり、時間を取られた問題を紹介したいと思います。本文で紹介しなかったのは、その問題がPythonやTwitterとなんの関係もないことだったからです。その問題とは、macに標準でインストールされている「テキストエディタ」の「スマート引用符」という機能です。

スマート引用符とは、テキストエディタで引用符( ‘ ‘ )を入力すると自動で( ‘ ’ )に変換してくれるというApple様のお作りになられたなんともスマートな機能であります。しかし変換後の引用符をつかってPythonコードを書くとエラーが出るので、テキストエディタでプログラムを書いていた僕にはいい迷惑でした。スマート引用符がエラーの原因だと気づくまでの時間はかなり精神的に厳しく、カービィのアニメを2話ほど観ました。

解決方法はかんたんで、テキストエディタの環境設定で、スマート引用符のチェックを外せば完了です。ただし、一度スマート引用符が適用されてしまった過去の保存済みファイルは、依然としてスマートなままなので注意が必要です。

JSでmbed

この記事は慶應ロ技研 Advent Calendar 4日目/JavaScript Robotics Advent Calendar 5日目になります

←3日目:F^3RCの話|4日目:レーザー加工機の紹介→

あと10分程で誕生日を迎えます、Piroroです。百合ください。よろしくお願いします。

突然ですが皆さん、JavaScriptはお好きですか?私は大好きです。++[[]][+[]]+[+[]] == 10がtrueになる謎の多い言語仕様や、雨後の筍のように現れては消えていき諸行無常を感じさせる様々なフレームワークなどが大変魅力的ですね。
そんなJavaScriptですが、NodeJSでサーバーサイド、Electronでデスクトップアプリを作りスマホアプリはReactNative、とどんどん活躍の場を広げているものの、組み込み分野ではあまり活躍していません。そこで今回はmbedをJavaScriptで制御する話です。 続きを読む

かわロボの電装、特にPN混合型モータドライバについて

この記事は慶應ロ技研 Advent Calender 2日目になります
←1日目:今年の振り返りと3軸オムニロボ噺|3日目:F^3RCの話→

あと10日で酒が飲めますishtarmk2です。酔ったときに脳内を蠢く下ネタの群れが声帯から流出しないか不安です。さてついにAdvent Calenderが始まりました。1日目の記事は読んでいただけたでしょうか。今年のF^3RCでもステッピングモータを積んだ機体が猛威を奮っていたのでぜひ読んでみて下さい。というわけで今日はステッピングモータに続き思い通りにDCモータを回すためのお話です。
ロ技研とは関係ありませんが本題に入る前にお話しておきたいのが12月24日即ちクリスマス・イブはアニメ「魔法少女リリカルなのはA’s」(魔法少女リリカルなのはシリーズの2期にあたります)を見る日です(TV版でも劇場版でも可)。これは本作の最終決戦の日付がクリスマス・イブであることに由来します。来るべき24日に備えてまだ1期を見ていない人は視聴しておきましょう。
dsc_0481
さて寄り道はこれくらいにして本題に入ります。
続きを読む