Pepper NAO Choregraphe Naoqi wiki - ALMemory

このページについて

NAOqi Core - 概要 | API | チュートリアル




利用

ALMemoryはロボットに関するあらゆる情報を格納するためのメモリです。
特にALMemoryはアクチュエータ及びセンサの状態に関する情報を提供します。

カスタマイズ

ALMemoryは名前のついた値を格納することもでき、イベントを通知するハブとしてもふるまいます。

動作

ALMemoryはALValueを同時に格納したミューテックスでランダムに並んだブーストマップです。

ミューテックスはパフォーマンスのためのリードライトミューテックスで、以下のものを保護可能です。
  • マップ
  • イベントにおける値の履歴

例えば:
  • あらゆるデータブロックの削除
  • 既存のデータブロックのみ変更されたデータを格納
  • 読み込んだデータの書き込みデータブロックの読み込み
ローカルではスレッドプール、リモートではunique notification threadより通知されます。

イベントとマイクロイベント


イベントは履歴を全てALMemoryに格納するようなマイクロイベントです。
通常同じように扱われますが、マイクロイベントの方が早いです。

ALMemoryProxy::getEventHistoryを用いることで、イベント履歴にアクセスすることが可能です。
加えて、誰かがイベントにサブスクライブすることで自動起動させることが可能です。
この特徴はALMEmorrProxy::declareEventと2つのパラメータによって動作します。

パフォーマンスと制限

ALMemoryは通常動作ではスレッドセーフです。
ALMemoryProxy::getDataPtrを使っていないときに限り、書き込みと読み込みは同時に変数にアクセスできます。

ALMemoryはALValueを格納したり取り出したりできます。:
typeC++PythonJava
integerintPython integerint
booleanboolPython booleanBoolean
floatfloatPython floatFloat
Listvector<ALValue>[]Java array []
Stringstd::stringPython stringString
BinaryALValueStringbyte[]
VariantALValueUse python typejnaoqi Variant

注意
ALMemory only stores 4-byte integers and 4-byte floats.
This is not a problem for C++ as it uses the same representation,
but Python integers and floats are 8 bytes (or more for big ints).
This may lead to a loss of precision when storing values.

では始めましょう

ALMemoryに格納されている値にアクセス
関数 ...機能 ...
ALMemoryProxy::getDataPtr素早い、ポインタへのアクセス
注意: スレッドセーフでもアトミックでもありません
ALMemoryProxy::getDataスレッドセーフなアクセス
モジュールがリモートでもローカルでも使えます

カスタマイズ

メモリの中に値を格納するときはALMemoryProxy::insertDataを使ってください。

イベントを監視したい場合

関数 ...監視する対象 ...
ALMemoryProxy::subscribeToEventイベント
ALMemoryProxy::subscribeToMicroEventマイクロイベント

詳細は、以下の例を参照してください。Creating events(非推奨)

イベントを発生させるには以下の関数を利用してください。
関数 ...利用法 ...
ALMemoryProxy::raiseMicroEvent値の格納と通知.
ALMemoryProxy::raiseEvent値の格納と通知、値の履歴とタイムスタンプの格納
ALMemoryProxy::declareEventモジュールと変数のリンク
モジュールが変数を監視している場合、モジュールはプロセスを一度だけ実行します。
例えば、FaceDetectedを監視すると、自動的にALFaceDetectionモジュールを実行します。監視を止めるとモジュールは止まります。