読者です 読者をやめる 読者になる 読者になる

プログラミングライダー

プログラミングや趣味のバイクをメモします

WebRTCではまった件について

ブラウザアプリでのWebRTCの実装をした際にはまったのでメモします。

発生した事象は以下

  • getUserMediaでエラーが発生してカメラとマイクが有効にならない
  • Webサーバーから開くとPeerに失敗してIDが取得できない
  • このどちらもlocalhostでは正しく動く

 

半日くらい悩みなんとか解決できたのでメモしておきます。

実施した対策は以下

 

原因は以下

■ Chrome M47 以降は getUserMedia が HTTPS しかつかえない!

 つまり新しいChromeではSSL証明書のあるサイトしかカメラやマイクは使えないよってこと

 ただしlocalhostでは動くらしい

 

■SkyWayのAPIキーの許可ドメインlocalhostしか設定してなかった!

 それはつながりません、当たり前でした(*´ω`*)

 Webサーバーのドメインを追加したらちゃんと動きました。

 

スマホでも動くかと試しました。

 

以上、ハマると辛いですが時に大きく飛躍することもあるので恐れずハマりましょう!

WebアプリとArduinoでシリアル通信させるメモ

仕事で調べたので急遽メモします。

使えそうなサイト

tech-sketch.jp

yume-build.com

Webシステムからシリアル通信でハードウェアを制御する方法 | システム開発のノウハウ

spicy-space.hatenablog.com

橋本商会 » HTML+JavaScriptをArduinoに直結できるシリアルポートサーバーを作った

ics.media

 

実際にやってみたらまたメモします(*´ω`*)

デジタルサイネージジャパン2016に行ってきました

 仕事の関係もあって今年は行ってきました、実はそんなに期待もしてなかったのですが実際はとても有意義な展示会でした!

 

f:id:Gigunasu:20160610102541j:plain

f:id:Gigunasu:20160610102553j:plain

f:id:Gigunasu:20160610102604j:plain

透過型液晶やタワー型のマルチディスプレイこれはかなり迫力がありましたね。

写真は無いですが透過型の55インチ有機ELディスプレイはすごかったです、ぜひ使いたい!

 

 ここまではDSJぽい感じでしたがなんと今の自分に最もホットな方々が偶然いらっしゃった! 

NTT CommunicationsさんのSkyWay

nttcom.github.io

f:id:Gigunasu:20160610102529j:plain

f:id:Gigunasu:20160610102614j:plain

なんと楽しそうな事をしてらっしゃる・・・

いろいろ疑問な事やサービス体制やら聞けてSkyWay使ってみる気になりました!

f:id:Gigunasu:20160610104440j:plain

SkyWayステッカー大量にいただきました(*´ω`*)

 

 

Visual Studio Tools for Unityではまった話

ある日のコーディング中・・・

「さて、入力候補をだすんごVSは最高だぜ(*´ω`*) ポチ!」

デン...

f:id:Gigunasu:20160608155308p:plainメンバー表示とパラメータヒントが同時に出てきやがった、しかも操作はメンバー表示側先にパラメータ選ばないとダメだって、勝手にパラメータ決めないで!

 

VS2015のバグかと思いましたがいままでこんなことは無く通常のWin32開発では発生しないと判明とりあえずVisual Studio Tools for Unity 2015版だけの現象だと思う。

 

解決方法はわからず素直にVS2013ですすめることにしました(´・ω・`)

物欲管理リスト(バイク編)

今回はバイク関連の物欲を管理しましょう。

僕はあまりバイク自体のパーツと言うよりはウェアや流用できそうなパーツばかりとなっています、どうしても限られた予算の中でやりくりしているので専用パーツを買う気にならないのです(^_^;)

続きを読む

openFrameworksでRealSenseSDKを使ったフェイストラッキングをやってみた件

まずは環境の説明から

OS:Win7 x64
IDE:VS2013 ※VS2012推奨
SDK:RSSDK

初期化の方法は以下
カメラのキャプチャイメージも必要なので一緒に取得しています。

// セッションハンドラ
PXCSession* session;
// カメラデバイス
vector<PXCCapture::DeviceInfo> cam_dev;
// マネージャ
PXCSenseManager* pxc_mag;
// フェイスアウトプット
PXCFaceData* mOutput;

// トラッキングポイントのカウンタ
int point_count;
// トラッキングポイント配列
PXCFaceData::LandmarkPoint* landmarkdata;

// 取得するイメージのサイズ
int width, height;
width = 1280;
height = 720;

// センサー取得
session = PXCSession::CreateInstance();

// デバイスの取得
{
	PXCSession::ImplDesc desc;
	memset( &desc, 0, sizeof(desc) ); 
	desc.group = PXCSession::IMPL_GROUP_SENSOR;
	desc.subgroup = PXCSession::IMPL_SUBGROUP_VIDEO_CAPTURE;

	PXCSession::ImplDesc desc1;
	if( session->QueryImpl(&desc, 0, &desc1) < PXC_STATUS_NO_ERROR ) return;

	PXCCapture *capture;
	if( session->CreateImpl<PXCCapture>(&desc1, &capture) < PXC_STATUS_NO_ERROR ) return;

	cam_dev.clear();
	for( int j = 0; ; ++j ) 
	{
		PXCCapture::DeviceInfo deviceInfo;
		if (capture->QueryDeviceInfo(j, &deviceInfo) < PXC_STATUS_NO_ERROR) 
			break;

		cam_dev.push_back( deviceInfo );
	}
	capture->Release();
}

// センサーマネージャのインスタンスを取得
pxc_mag = PXCSenseManager::CreateInstance();

// キャプチャマネージャの取得
PXCCaptureManager* cap = pxc_mag->QueryCaptureManager();

// カメラが複数個存在する場合
// とりあえず0番目を設定
if( cam_dev.size() > 1 )
{
	cap->FilterByDeviceInfo( &cam_dev[0] );
}
	
// フェイストラッキングの有効化
pxc_mag->EnableFace();

// フェイスモジュールの取得
PXCFaceModule* face = pxc_mag->QueryFace();

// フェイスコンフィグパラメータの取得
PXCFaceConfiguration* config = face->CreateActiveConfiguration();

// コンフィグ設定
{
	config->SetTrackingMode( PXCFaceConfiguration::TrackingModeType::FACE_MODE_COLOR );
	config->detection.isEnabled = true;
	config->landmarks.isEnabled = true;
	config->pose.isEnabled = true;
	config->QueryExpressions()->DisableAllExpressions();
	config->QueryExpressions()->Disable();
	config->ApplyChanges();

	point_count = config->landmarks.numLandmarks;
	landmarkdata = new PXCFaceData::LandmarkPoint[point_count];
}

// キャプチャ設定
{
	PXCCapture::Device::StreamProfileSet set;
	memset(&set, 0, sizeof(set));
	set.color.imageInfo.width = width;
	set.color.imageInfo.height = height;
	cap->FilterByStreamProfiles(&set);
}

// カラーストリームの設定
if( !(pxc_mag->EnableStream(PXCCapture::STREAM_TYPE_COLOR, width, height, 30) >= PXC_STATUS_NO_ERROR) ) return;

// マネージャ初期化
pxc_mag->Init();

// フェイスアウトプットを取得
mOutput = face->CreateOutput();

次に更新処理

// ビデオテクスチャ
ofTexture video_tex;
ofPixels video_pix;

// トラッキング情報
bool isTracking;
ofRectangle face_rect;

int landmaerk_err_count;

// 画像の更新
if( pxc_mag->AcquireFrame( true ) >= PXC_STATUS_NO_ERROR )
{
	PXCCapture::Sample *cSample = pxc_mag->QuerySample();

	if (!cSample)
		return;

	PXCImage *cRgbImage = cSample->color;
	if (cRgbImage)
	{
		PXCImage::ImageData cRgbData;
		if( cRgbImage->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB32, &cRgbData) >= PXC_STATUS_NO_ERROR )
		{
			// フェイスの更新
			mOutput->Update();

			uint8_t *cBuffer = cRgbData.planes[0];
			video_pix.setFromPixels(cBuffer, width, height, 4);

			cRgbImage->ReleaseAccess(&cRgbData);
		}
	}

	pxc_mag->ReleaseFrame();
}

// ピクセル情報をテクスチャにコピー
video_tex.loadData( video_pix.getPixels(), width, height, GL_BGRA );

// フェイスデータを取得
isTracking = false;
int numFaces = mOutput->QueryNumberOfDetectedFaces();
if( numFaces > 0 )
{
	PXCFaceData::Face* tracked = mOutput->QueryFaceByIndex( 0 );

	// フェイスの座標を取得
	{
		PXCFaceData::DetectionData* detection = tracked->QueryDetection();
		PXCRectI32 rect;
		detection->QueryBoundingRect( &rect );
		face_rect.x = rect.x; face_rect.y = rect.y; face_rect.width = rect.w; face_rect.height = rect.h;
	}

	// ランドマークポイントの取得
	{
		PXCFaceData::LandmarksData* landmark = tracked->QueryLandmarks();
		pxcI32 numPoints = landmark->QueryNumPoints();
		if( landmark != NULL )
		{
			// トラッキングの有効化
			isTracking = true;
			landmark->QueryPoints( landmarkdata );

			bool err = false;
			for (int i = 0; i < numPoints; ++i) 
			{
				// >>>>ここにランドマーク情報を取得する記述をする<<<<

				if( !err && !landmarkdata[i].confidenceImage )
				{
					err = true;
				}
			}

			if( err ) landmaerk_err_count++;
			else landmaerk_err_count = 0;
		}
	}
}
else
{
	// フェイスを識別できてない場合エラーカウントをリセット
	landmaerk_err_count = 0;
}

// エラーが3秒以上持続する場合
if( landmaerk_err_count > 90 )
{
	// デバイスを閉じる
	pxc_mag->Close();
	pxc_mag->Release();

	// デバイスの再起動
	// 上記の初期化メソッドを呼び出している
	setupdev();

	landmaerk_err_count = 0;
}	

キャプチャしたイメージの更新とトラッキング情報の更新ともう一つ
ラッキング情報が外れた際に再認識ができなくなってしまう時がある
そのためlandmaerk_err_countが一定以上になった時システムを再起動するように
細工をしておいた。

以上の処理でフェイストラッキングを行うことができるはずです。
フェイストラッキングは普段使っているWebカメラでも大丈夫でした!

物欲管理リスト(キャンプ編)

私は物欲が止まりません、ですが家庭の事情もあり前の様に好き勝手お金を使うわけにも行きません。なので物欲を書き出す事で管理できればと思いたちました。

主にバイク、キャンプ用品が中心となってます(*´ω`*)

 

以下が僕の物欲リスト

www.naturum.co.jp

このシェラフの魅力的なのはセンターZIPなのと生地がオーロラTexであること

オーロラTexのダウンジャケットを持っていますが軽くて蒸れない風も通さないということでそれが悪かろうはずもなく物欲をくすぐります。

前回の白馬は明け方に5℃前後まで気温が下がったため、持って行ったバンドックの羽毛シェラフではやはり寒くてしかも異常に蒸れたため熟睡できず次の日の運転に若干の支障がでてしまった。やはり寝具は重要だと実感しました。

 

今つかってるシェラフ5000円くらい

BUNDOK(バンドック) 寝袋 ラップ型 羽毛シュラフ

 

しかしこのバンドックの羽毛シェラフが悪いという訳ではなくインナーや服装によってはちゃんと快適に寝れたと思う、それとレビューに一度洗うとロフトが立つとの評価がありとりあえず羽毛用洗剤で洗ってからもう一度評価してもイイかもしれない・・・

イスカ(ISUKA) ライナーサイドジッパー スーパーライト

シェラフと併用で快適性と保温性を底上げできるとりあえずコイツをかってバンドックと合わせてもう一度キャンプしてもいいかもしれない。

Amazon | タナックス(TANAX)モトフィズ ツアーシェルケース /ブラック MFK-195 容量40ℓ 片側20ℓ | 車&バイク | 車&バイク

今の積載

f:id:Gigunasu:20160606105720j:plain

TTPLの40Lにインフレータマット、あぐらイス、ケルマランドライト、そのほか防寒着を括りつけているしかしコレでも積載は足りず途中での買い出しは不可、着替えを削ったため3日も同じ服を着ることになってしまった。できればバッグの上部は途中での買い出し用に開けておきたいと考えている。

ツアーシェルケースを採用すればTTPL40L+サイド40Lで余裕をもった積載ができるはず

プラック アルミペグ抜きハンマー(ブルー) M-3221

praise テント ペグ 18cm

ランドライトに付属のペグは全て破棄してしまったので購入を検討それと前回のキャンプでは100均のゴムハンマーを使用したが打つのはいいけど抜けないという事態に必要性を感じてペグハンマーも検討。

どちらも値ははらないけど高原キャンプの多い自分は風が強いこともあるので次のキャンプまでには揃えたい、鹿番長のハンマーはみんな使ってるので目印が必要かも。

 サーモスソフトクーラーバッグ 15L パープル RDR-015 PL

買い出しした食材はできれば保冷しておきたい、特にこれからの時期は必須でしょう

キャンプ場で食あたりなんてのは笑えない!

僕はお酒は飲まないので5Lか15L程度で良いはず。

 Second step(セカンドステップ) リラックスチェア

某有名メーカーのパクリだと思われるが8000円ほどでヘドレストまであるしかも小さく軽いすごく魅力的ではあるが問題は耐久性でしょうね。

あぐらイスは割りと気に入っていますが収納時が意外と大きいのと着席時の体制がかなり低いので調理時なんかは起きて作業することになるので買い替えを検討。

BUNDOK(バンドック) ハンディー テーブル M BD-215

鹿番長のアレでもいいのですがもう少し物が置ける場所がほしいため検討

収納サイスが長すぎるかもしれないとの懸念もある。

 

物欲管理リスト(キャンプ編)はとりあえずこんなもんです。

ボーナスでシェラフかシェルケースをどちらかを買いたい・・・

 

以上/(^o^)\