Perl日記

PerlとかRubyとかPHPとかPythonとか

エラー string argument should contain only ASCII characters

AWS Lambda を aws コマンドで実行したら、以下のエラーが出た。

$ aws lambda invoke --function-name myfunction:V1 --invocation-type RequestResponse --payload '{"foo":"あいうえお"}' /dev/stdout
string argument should contain only ASCII characters

どうやら日本語を payload に含めているとだめなようだった。

aws コマンドの共通引数の --cli-binary-format に raw-in-base64-out を指定するとうまくいった。

$ aws --cli-binary-format raw-in-base64-out lambda invoke --function-name myfunction:V1 --invocation-type RequestResponse --payload '{"foo":"あいうえお"}' /dev/stdout
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}


参考:

qiita.com
docs.aws.amazon.com

HTC VIVE CE から VIVE Cosmos Elite に買い替えたメモ

2018年初めの方に買った HTC VIVE CE を VIVE Cosmos Elite に変えた。

www.vive.com

Rift とか Index とか、新しい VR 機器が出るたびにいいなと思っていたけど、ちょうど最近出た VIVE Cosmos Elite が HMD (ヘッドマウントディスプレイ)だけ単品で売るということで思い切って買ってしまった。VIVE Cosmos とかのインサイドアウトの無線の方が動きやすいのはわかるけど、自分はベースステーションと有線の方がなんか改造されてる感があって良さみが深い。

HMD 以外のコントローラとベースステーションは最初の VIVE に同梱されていたやつが使えるとのことで助かった。

そんな感じだったので、セッティングについても PC につける HMD をそのまま変えるだけでいいのかなと思いやってみたけど、SteamVR 上では変更前の VIVE として認識されてしまって映像が表示されなかった。単に PC に接続するインターフェースが HDMI から Display Port に変わったからかもしれないが。

VIVE の公式ページからセットアップの exe をダウンロードして実行、そのまま指示に従って進めると、ちゃんと HMD に映像が出るようになった。よかった。

セットアップの exe がダウンロードできるページ
www.vive.com

コントローラは HMD とペアリングしているらしく、上記のセットアップ中にペアリングすることはできなかったので、いったんスキップして完了までいってから、SteamVR 上のコントローラのペアリング設定でちゃんとペアリングできた。(コントローラの電源ボタンとメニューボタンを同時に押し続けるやつ)

変わったところ
  • 額を中心にして、画面の本体部分が持ち上がるようになった。今まで、取ってつけて取ってつけてがめちゃくちゃ面倒くさかったので、これはとてもよかった。特に Unity で VR アプリの開発するとき、何か変更・実行・装着・確認・取るのプロセスが辛すぎたので、カパッと上げるだけで済むのはマジで助かる
  • 若干目の周りの空間が広くなったのか、メガネをつけての HMD 装着を余裕をもってできるようになった
  • 付属の両耳のスピーカは自分の頭の形のせいなのかめちゃくちゃ扱いづらくて、PC からイヤホン伸ばして聞く方が断然楽だった
  • 解像度が上がって綺麗に見えるようになった分、アプリによってはたまに処理落ちするようになった。GPU の方がボトルネックになったのかもしれない
  • 自分で Unity で作ってた VR アプリがめちゃくちゃ綺麗に見えるようになったのが、正直一番感動した

Unity で Rotation の Z を動かさずに回転する

メモ。

入力に応じてオブジェクトを回転させたいときは、Transform.Rotate() を使う。
しかし、二次元的にそれをそのまま x と y に当てはめていろいろ動かすと、どんどん斜めになってしまう。

カメラ用のスクリプト CameraController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    void Update()
    {
        float x = Input.GetAxis("Vertical");
        float y = Input.GetAxis("Horizontal");

        if (x != 0 || y != 0)
        {
            x = -1 * x * Time.deltaTime * 50f;
            y = y * Time.deltaTime * 50f;

            this.transform.Rotate(new Vector3(x, y, 0));
        }
    }
}

f:id:rightgo09:20191112233958j:plain
最初はまっすぐになってる
f:id:rightgo09:20191112233110j:plain
斜めになった

一度オイラー角に変換してから x と y を加算減算して、またクオータニオンに変換して transform.rotation に代入するといいようだ。
(正直完全に理解してない)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    void Update()
    {
        float x = Input.GetAxis("Vertical");
        float y = Input.GetAxis("Horizontal");

        if (x != 0 || y != 0)
        {
            x = x * Time.deltaTime * 50f;
            y = y * Time.deltaTime * 50f;

            Quaternion rotation = this.transform.rotation;
            Vector3 rotationAngles = rotation.eulerAngles;

            rotationAngles.x = rotationAngles.x - x;
            rotationAngles.y = rotationAngles.y + y;

            rotation = Quaternion.Euler(rotationAngles);
            this.transform.rotation = rotation;
        }
    }
}

f:id:rightgo09:20191112234144j:plain
Z は 0 のまま


これをカメラにアタッチして、写真を撮るカメラにくっつけて、カメラっぽく動かせるようにして遊んでみてた。

f:id:rightgo09:20191112235341g:plain


参考:
bluebirdofoz.hatenablog.com