シーケンスモジュールが出来た

シーケンスモジュールがロボットで問題なく動いた。意外と早く出来てしまった(笑)

シーケンススクリプトを実行する。シーケンスとは、多様なポーズを時間的につなげて、一つのモーションを作ることだ。(私の作った言葉。Choregraphe のタイムラインに似ているかな)

上の動画は、サリーちゃんに昔流行ったギャグ「だっちゅーの」をやってもらった。シーケンスファイルは、次のような感じのスクリプトになっている。これを指定場所に置いておく。私の場合は、ロボットのコンピュータのフォルダ、/home/nao/ibot/user/sequence だ。ここに同時に、Choregrapheで作った様々なポーズがファイル化してある、xapファイルも置いておく。

# ------------------------------------------------------------
#
# msweq だちゅーのポーズ(サリーちゃん用)
#
# #から始まる行、空白行はスキップ
# コマンド、スピード制御、ポーズ名、スピード(最速を1とした割合)
# 時間は全て、ミリ秒であらわす
# ------------------------------------------------------------

# ゆっくり立ち上がる(スピード制御、数字は1.0が最大)
execpose,speed,Stand,0.2
# 1秒立った姿勢を維持する
sleep,1000
# ゆっくり「だっちゅー」のポーズをとる
execpose,speed,Dachuno,0.2
# そのポーズを3秒維持する
sleep,3000
# ポーズを時間制御に変更する
# 4秒かけてスタンドゼロのポーズを取る
#execpose,time,StandZero,4000
# 4秒かけてStandinitのポーズを取る
execpose,time,StandInit,4000
sleep,1000
# 3秒かけて座るポーズにはいる
execpose,time,Sitdown,3000
# 座ると、自動的にstiffnessが0.0にセットされる:モータの加熱回避で必要
#sleep,1000

このスクリプトは、ロボットの内部モジュールwsmotionライブラリによって読み取られ実行される。呼び出すためには、まず、qichatのスクリプトの良きところで、$motion_getposes_1="sally_pose.xap"という、メモリイベントを発生させる。=の右側に、Choregrapheのポーズリストファイルを指定する。全てのポーズが名前と、関節角度付きで入っている。これを実行したのち、$motion_sequence_1="dachuno.mseq" というシーケンスファイル(=の右側)の実行のためのメモリイベントを発生させる。どちらも、変数は、これで確定していて、変更は不可である。

テストに次のようなトピックファイルを用意した。

topic: ~wsmotion-181224 ()
language: jpj

# モーションテスト

u:({サリーちゃん} やってください) はいわかりました $motion_getposes_1="sally_pose.xap" データ読み込みました $motion_sequence_1="dachuno.mseq" \pau=7000\ だっちゅーの 

「だっちゅーの」の前の\pau=7000\(7秒停止)が気になる。呼び出しているNAOQIのAPIには、ブロッキングコールと書いているので、実行終えるまでは次に進まないと思っていたら、どんどん次を読んで実行してしまうので、だっちゅーのという言葉とギャグがかみ合わなくなってしまっているので、つけたが、いやに長く必要になっている。

Choregrapheで作成したポーズをC++モジュールで実行する

ポーズや動作を作成するのは、Choregrapheが優れている。動作は、ポーズの時間的なつながりであるとも考えるので(本当は違うが)、同じものとして考えよう。

Choregrapheでポーズを作ると、xapファイルとして出力できる。これについては、別の投稿に書いた。このファイルからポーズデータを読み込んで、NAOQIのAPIのALMotionのangleInterpolationWithSpeedメソッドで実行させる。

xapファイルは、xmlファイルなので、これを読み取らなければならない。これについては、wsibotでも使用している、tinyxml2というのを使う。これは、ヘッダーファイルとcppファイルなので、とても軽いし使いやすい。実行ライブラリ化していると組み込みがまた面倒になるから、数年前には、ほぼ、これ以外の選択肢はないように思えた。(今は、別にいいのがあるかもしれないが調べる気はない)

読み込んで、そのポーズを実行させるところまではほぼできた。その際、xapファイルに書かれている角度について少し困った。StandやStandInit、StandZeroのサーボ角度は度で書かれているのだが、新たに作った、あるいは登録した角度はラディアンで書かれているようなのだ。同じ、positionエレメント内に入っているのに、この違いは面倒臭い。両者を区別することはできないかと思ったら、どうも、version要素が2の時はラディアンと考えて問題が起きなさそうなのである。正しい回答かどうかはわからないが、まあ、これで当面矛盾は起きそうにないので、position要素の中でversionの値が2になっていたら、そのまま、angleInterpolationWithSpeedに食わせて、そうでなければ度からラディアンに変更するというようにしている。

ここまで終わったので、次は、ポーズを連続して動作させることと、それを変数のイベント化して、会話の中で呼び出せるようにしたい。

関節と動作関係のC++モジュール

ロボットの動きのボケのために、関節操作と動作関係のモジュールをメインモジュールから独立させようとしている。

そのために、久しぶりに、モジュールの新規作成を試みた。基本、NAOのV25までは32ビットで動いているので、32ビットのlinuxminiで動かすことにしている。これまでのシステムでは、既存のモジュールのqibuildを用いた再コンパイルは難なくできているのだが、新たにインストールしたlinuxでうまく行かない。

なんどもnaoqiとqibuildはインストールしているので、難なく行くはずだがと思っていたら、g++が入っていなかった(笑)

動作関係の新しいモジュール

今までは、基本言葉の部分で芸ロボットの可能性を探ってきた。動作は、言葉とリンクさせたり、言葉に動機付けられて立つ座る、歩く、回転するなどの基本操作しか制御するようにしていただけだった。

この動作でも、芸ロボットらしくボケたりできるように、動作関係のモジュールを作り直したいと思う。

今までは、wsibotというモジュールの中にmotion関係のクラスを作って動かしていたが、独立したwsmotionというモジュールを作成しようと思う。

複雑な動作はポーズの時間的な推移として表現できることがわかっている。このポーズは、基本choregrapheで作成する。Choregrapheのポーズは .xap というXMLファイルに保存される。.xapファイルの形は以下のようなものである。

NAOに五郎丸ポーズを取らせた時のものである。

<?xml version="1.0" encoding="UTF-8" ?>
<ChoregraphePositionLibrary xmlns="http://www.aldebaran-robotics.com/schema/choregraphe/position.xsd">
    <folder>
        <folded>yes</folded>
        <title>Basics</title>
        <position>
            <Motors>
                <Motor>
                    <name>HeadPitch</name>
                    <value>0</value>
                </Motor>
                <Motor>
                    <name>HeadYaw</name>
                    <value>0</value>
                </Motor>
...........全てのモーターのリスト..........
.....................
.....................
            </Motors>
            <name>StandZero</name>
            <description>All motors to 0</description>
            <bitmap>media/images/positions/StandZero.png</bitmap>
        </position>
        <position>
            <Motors>
                <Motor>
                    <name>HeadPitch</name>
                    <value>0</value>
                </Motor>
                <Motor>
                    <name>HeadYaw</name>
                    <value>0</value>
                </Motor>
                <Motor>
                    <name>RShoulderPitch</name>
                    <value>80</value>
                </Motor>
...........全てのモーターのリスト..........
.....................
.....................
            </Motors>
            <name>StandInit</name>
            <description>Nao is ready to do anything from this position !</description>
            <bitmap>media/images/positions/StandInit.png</bitmap>
        </position>
        <position>
            <Motors>
                <Motor>
                    <name>HeadPitch</name>
                    <value>-10.7252</value>
                </Motor>
                <Motor>
                    <name>HeadYaw</name>
                    <value>-0.266079</value>
                </Motor>
                <Motor>
                    <name>LAnklePitch</name>
                    <value>4.04062</value>
                </Motor>
...........全てのモーターのリスト..........
.....................
.....................
            </Motors>
            <name>Stand</name>
            <description>Standing position with low power consumption. </description>
            <bitmap>media/images/positions/Stand.png</bitmap>
        </position>
    </folder>
    <position>
        <Motors>
            <Motor>
                <name>HeadPitch</name>
                <value>0.00916195</value>
            </Motor>
            <Motor>
                <name>HeadYaw</name>
                <value>-0.00464392</value>
            </Motor>
            <Motor>
                <name>LAnklePitch</name>
                <value>-0.349794</value>
            </Motor>
            <Motor>
                <name>LAnkleRoll</name>
                <value>4.19617e-05</value>
            </Motor>
            <Motor>
                <name>LElbowRoll</name>
                <value>-1.51862</value>
            </Motor>
...........全てのモーターのリスト..........
.....................
.....................
        </Motors>
        <version>2</version>
        <name>goromarupose</name>
        <description>吾郎丸ポーズ</description>
        <bitmap>/Users/washida/.local/share/choregraphe/goromarupose_1.png</bitmap>
    </position>
</ChoregraphePositionLibrary>

 

四つのポーズがセットされている。最初は、StandZeroで、これは全てのモーターの角度をゼロポジションに置くということである。スッと立って、手をまっすぐ前に出したポーズである。次が、StandInitで、手を下ろして普通に立っているポジションである。三番目が、Standで、最もモーターの負荷を減らして、立っている状態という解説がついている。最後のものが五郎丸ポーズである。

モーターの角度は、度で記載されているのでラディアンに変更する必要がある。

このファイルを直接咥え込むAPIがNaoqiにあれば一番いい。が、それは探しても今の所見当たらない。

四つのの

短文の要約のアイデア

一つの文章をさらに短くすること、ここをもう一つ高いレベルでクリアしたい。知識は言葉の定義で与えられるとして、それはなんとか使える。が、舞台でしゃべる言葉はごく短くなければならない。一応、そのシステムは作ってあるが、短くした後の言葉が、理解のしやすいものに必ずしもなっていない。

私が目標とするところからして、今、芸ロボットの到達点は50%くらいだと思っている。もし、短文要約が大きな問題なく、人と同じくらいのレベルでできるようになれば、この到達点は70%くらいまでいくだろう。

ではどうすれば良いのか。一つ頭に浮かんでいるのが、ようやく対象が含む語の主要なものが含まれている、より短い文章の用例を探すことだ。ただ、全く同じ語については、あるかもしれないが、探すのが大変すぎる。

そこで、言葉をグループ化する。例えば、りんごとバナナは、果物というグループに属するので、「デザートには〇〇が出た」という文章の〇〇には、等しく使える、置き換えられる。他の「ラーメン」という言葉は、この〇〇にはめることはできない。また、さらに広く、食べ物というグループにも属しているので「彼は〇〇を食べた」の〇〇にも同じように使える。この場合は、ラーメンという言葉もはめることができる。

適用可能な言葉は、ある種の階層性を持っているのである。

このグループ化、階層性を表現するために、類語辞典を使うことができる。類語辞典のコード番号を用いて、日本語ウィキペディアの前文章を用例化する。

そして、ある長い文章が与えられ、そこで使われている用語の重要性について、指標が与えられているとして、コード化した同じ語のグループが使われている用例を拾い出す。ただし、短くする程度に応じて、元の語のいくつかを削ったものにしていく。

コード化した語で、短い用例があれば、それで文章を再構成すれば、単文が要約できることになる。

というアイデアである。

アイボット株式会社決算と納税申告

このサイトのURLは、http://www.ibot.co.jp/wpibot/で、ibot.co.jpはアイボット株式会社が取得しているドメインだ。この会社は、私が2014年にロボット関係サービスと関連商品の販売のために設立した会社で、現在は妻が社長で、私は単なる出資者だ。大学の兼業との関係でそうしている。実質、何も事業活動していない。

ただ、事業活動をしていなくても、都税の均等割分7万円を毎年払っていた。が、こう完全に何もしていないのに7万円は負担だ。もう、私も大学を辞める時期が近づいているので、こんな余計な金を払うくらいなら、廃業しようと、昨夜布団に入りながら考えていた。

こう思うのは、決算書を書かなければいけない時期だからでもある。この10月31日で、第4決算期が終了するので、2ヶ月以内に決算をして、税申告を国と東京都に対してしなければならない。何もしていないので、減価償却処理などをすれば簡単に決算書はかけるのだが、お金の負担が痛い。

解散すると、多分、このibot.co.jpも返上しなくてはならなくなる。それは大したことはないのだが、残念であることは変わりない。

それでも、今朝、法人解散を考えて、ネットを調べていると、株式会社の解散もそう簡単ではない。法務局に二回手続きをして、自分でやっても7万円くらいのコストがかかる。ましてや、業者にやってもらうと、その倍以上の手数料がかかってくる。

ネットで調べているうちに、会社を休業して、手続きすれば、均等割分を回避できる可能性があることを知った。早速、今朝、都税事務所に電話して、どうすれば良いかを教えてもらった。

(1)国税の申告書を出して別表の1というのをもらう。これはいつも控えとしてもらえるものだ。
(2)都税事務所の提出書類の他に、決算書も提出する。
(3)と税の申告書のどこでもいいが「休業中」と記載する

これを活動していないときは、毎年手続きを取れば良いらしい。これで絶対課税を免れるわけではないようだが、もし課税されるときは、事前の電話連絡があるらしい。ただ、アイボット株式会社は、ほぼ完全な休眠会社なので、多分、課税手続きは行われないと思っている。

前から、この会社のことは頭痛の種だったが、これでとてもスッキリした。毎年申告しなければならないが、それは大した手間ではない。

またいつか、本当にこの会社を動かしたくなる時も来るだろう。その時まで、待機させていると考えることもできる。

よかったよかった。

サイトが極端に重たくなるので調整した

サーバーが重くなるので設定を変更した。

StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
MaxMemFree 1024

あまり効果がなかったので、さらに、

StartServers        4
MinSpareServers     2
MaxSpareServers    10
ServerLimit       128
MaxClients        128
MaxRequestsPerChild 30

と変更して、様子を見る。

Hikey970のlebuntuに日本語環境を入れる

オリジナルなHikey970のubuntu、つまりlebuntuは全く日本語環境が入っていないので、前の記事ではubuntu18.04を入れるとか言っていたが、実はそれはとても難しく、私にはできそうになかった。

そこで、lebuntuに追加で日本語環境をインストールすることにした。フォントなどをインストールしたら、日本語は表示できるようになったし、localeをLANGでja_JP.UTF-8にしたら、出力が日本語になって使いやすくなった。

しかし、日本語の入力はいまだにできない。悩ましい。

Hikey970にUbuntu (Lebuntu) をインストールする

ニューラルネットワーク処理ユニット(NPU)を持つシングルボードコンピュータを、スイッチサイエンス社から39,744円で購入した。アマゾンに出ている商品と同じものだが、ここが一番安かった。

ひたすら好奇心である。NPUというものは、どれほどのものだろうということである。ただし、UPUをのぞいでも、このコンピュータのスペックはとてもいい。

まだ、NPUをどうやって動かすのか、というか、プログラミングに組み込むのかということはわかっていないが、さしあたり、試しに、Ubuntu、LemakerのUbuntuという意味で、Lebuntuというらしい、を組み込んでみた。

最終的には上記のようにlebuntuがスタートする。最大の弱点は、日本語環境が出てこないことだ。

インストールの仕方をメモがわりに記載する。
(1)Linux を用意する。
(2)このサイトから、lebuntuのimgファイル類をダウンロードする。
(3)rarファイルを解凍する。(ubuntuの場合、unrarが必要だった)
(4)その中に、lebuntu-rfs_flashing_guide.txtというドキュメントがあるので、そこに書いてある通りのことを実行すれば、インストールできる。その通り実行しないと失敗する!!
以下注意点
(1)INSTALLING BINARIES(only new boards)とFLASHING Lebuntu 16.04 IMAGE ONLYの二回実行する。
(2)Hikey970のUSB-CとLinuxのUSB端子をつなぐ。
(3)MACのVirtualBoxに入れたLinuxでやったら失敗した。USBのつながりがダメなようだ。Linuxマシンを用意する。私の場合は、Intelのスティックコンピュータに入れたUbuntuにつないで実行した。

特にないか。要は、先のマニュアル通りのことができればOKなのだ。

ただ、Lebuntuでは、日本語が使えない(使い方があるのかもしれないがわからない)ので、今度、正式のUbuntu 18.04をインストールしようと思う。

NPUは、Hikey970 with pre-built Tensorflowというのがあるので、そちらのimgを焼くことで実現するのだと思う。