Closed h-wata closed 1 month ago
@nabeshima 以下のような手順での簡易的な対策をしようとしていますが、想定されている利用方法と異なりますか?
current_floor_id
)を管理される何かしらの仕組みを用意する/adapter_lift_requests
トピックが/adapter_lift_requests_destination
トピックとして吐かれるようにremapする/adapter_lift_requests_destination
トピックを受け取って内容をcurrent_floor_id
と統合して/adapter_lift_requests
トピックとして投げてlci_rmf_adapter
に渡すノードを用意するWe're considering a simple countermeasure with the following steps. Does this differ from the intended usage?
@h-wata Thank you for your comment.
To support some backends API provided by lift vendors, the both origination
and destination
are required for each single session.
If RFM do not need to support them, it is easy to follow the original LiftRequest
format.
In this case,
LiftRequest.destination
of the 1st request (from the hall) shall indicate the origination
.LiftRequest.destination
of the 2nd request (from the inside of the car) shall indicate the destination
.Because I don't know the limitation of the RMF Core, I implemented the format as this code.
If you come up with any idea to solve it, please tell me!
@MikhailBertrand
RMF Coreから出てくる最初の LiftRequest.destination
は、current_floor_id
(origination; 出発階) を指しているのだと思うのですが、いかがでしょうか?
特定のエレベーター会社のバックエンドを使う場合、この段階で行先階の情報が必要なため、
そもそも LiftRequest
の仕様を解決しない限り難しいのかもしれません。
当座、RMF Coreをそのまま使う場合は、そのようなエレベーターは利用できない、と制約を設けてしまうのも手ではあります。
:
で区切られていない場合は、
LiftRequest.destination
(エレベーターホールからの呼び出し)は、LCIの origination
として扱うLiftRequest.destination
(エレベーターかご内からの呼び出し)は、LCIの destination
として扱うという実装は可能ですので。
ご意見頂けると幸いです。
lci-rmf-adapter now accepts the default format of LiftRequest.destination
of RMF Core.
Nevertheless, to use a lift whose backend API requires both of origination
and destination
at the 1st request, the "<origination>":"<destination>"
format is still needed.
RMF Coreから出てくる最初の LiftRequest.destination は、current_floor_id(origination; 出発階) を指しているのだと思うのですが、いかがでしょうか?
そうでしたね。では
Nevertheless, to use a lift whose backend API requires both of origination and destination at the 1st request, the "
":" " format is still needed.
を踏まえて、現在利用しているエレベーターについては呼び出し時に目的階も必要となるので、目的階を別で見ておく必要があるということですね。
1をどう実現するか未定ですが、RMF Coreは変更せず、以下のように修正した内容を実現できないか試してみたいと思います。
destination_floor_id
)を管理される何かしらの仕組みを用意する/adapter_lift_requests
トピックが/adapter_lift_requests_destination
トピックとして吐かれるようにremapする/adapter_lift_requests_destination
トピックを受け取って内容をcurrent_floor_id
と統合して/adapter_lift_requests
トピックとして投げてlci_rmf_adapter
に渡すノードを用意する@MikhailBertrand ご検討有難うございます。 まずはそのやり方をお試し頂ければ助かります。
試したところまで情報共有します。 結果としては、乗車まではうまく行くのですが、降車ができておりません。
/adapter_lift_requests
を/pre_adapter_lift_requests
にremappingpre_adapter_lift_reequest
と上記の目的階からadapter_lift_requests
にてdestination_floor: <origination>:<destination>
形式でrepublishし、フロア移動することは可能。destination_floor
は、下記のようになっているのが気になっています。
<origination> : <destination>
<destination> : <destination>
lci_rmf_adapter
がSubscribeするのはlift_requests
では無いのでしょうか?adapter_lift_requests
はlift_supervisorがSubscribeしてlift_requestsをPublishするのでは無いでしょうか?lift_states
のcurrent_floor
が変わらない。
current_floor
が変更されません。ただしdoor_state
はCloseからOpenに変更されます。lci_rmf_adapter周りのLogを添付いたします。参考になれば幸いです。
Logの内容としては、27F:29F
はうまく行っているのですが、29F:29F
でつまずいております。
log2.txt
adapter_lift_requests
が定期的(1Hz)に連続して投げています。そのたびにlci_clientからPublishが起きているようなのですがこれは抑止したほうが良いのでしょうか?情報共有有難うございます。
RMFの標準的な呼び方としてはELVの待機位置にて現在階、ELV内にて目的階を呼び出すためdestination_floorは、下記のようになっているのが気になっています。 ELV前 ->
: ELV内 -> :
こちらについては、LCIとしては受け付けていますので、問題はないかと思います。
問題は、
また、Logからもわかりますが、ELV待機位置につくとOpenRMFからadapter_lift_requestsが定期的(1Hz)に連続して投げています。そのたびにlci_clientからPublishが起きているようなのですがこれは抑止したほうが良いのでしょうか?
こちらです。 弊社でもログを確認していたのですが、エレベーターが呼び出し階に到着する前に、RobotStatusの乗車完了と2回目のCallElevatorが呼ばれており、首を捻っておりました。
RMFからは、LiftRequest を 1秒間隔で送ってくるのですね…
今のlci-rmf-adapterの実装では、「出発階への呼び出し時」と、「乗車後の行先階の登録時」の2回のみ、LiftRequestが来ることを想定していました。
この1Hzのrequestを受け入れるとすると、
LiftRequestに情報がほとんどなく、乗車完了を推定する方法があまりないので、
LiftRequest.destination
が変化したときを、「乗車後の行先階の登録時」と判定するほか無さそうです。
つまり、LiftRequest.destination
は、
ELV前 -> <origination>
ELV内 -> <destination>(!= <origination>)
または、
ELV前 -> <origination> : <destination>
ELV内 -> <destination>
である必要があります。
こちら、対応しようと思います。
ELV前 -> <origination> : <destination>
ELV内 -> <destination> : <destination>
でも、正しく動作するようにします。
lci_rmf_adapterがSubscribeするのはlift_requestsでは無いのでしょうか?adapter_lift_requestsはlift_supervisorがSubscribeしてlift_requestsをPublishするのでは無いでしょうか?
こちらですが、 https://osrf.github.io/ros2multirobotbook/integration_lifts.html を参照して決めました。
adapter_lift_requests
は以下のように説明されています。
Requests to be sent to the lift adapter/supervisor to request safe operation of lifts
lci-rmf-adapterは、複数のリフトとドア、複数のクライアント(LiftRequest, DoorRequestのpublisher)を扱っているため、 adapter_lift_requests
をSubscribeするようにしています。
lift_statesのcurrent_floorが変わらない。 ELV内での呼び出しが不自然になっているため、完了されないのかcurrent_floorが変更されません。ただしdoor_stateはCloseからOpenに変更されます
LCI のバックエンドによっては、current_floorが、出発階または目的階にエレベーターが到着して、ドアが開ききったタイミングで、ようやく更新されるものがありますので、その影響かと思います。
早速のご回答およびご対応ありがとうございます。再度試してみます。
またTopic名についても承知しました。理解が深まりました。
おかげさまでエレベータの乗降できました。 本件Closeさせていただきます。
Thank you for the great project.
I have a question regarding the format of destination_floor in the code found here: https://github.com/octarobotics/lci-rmf-adapter/blob/dd2c45c78f9a4e37db250e67177df7e52de87364/lci_rmf_adapter/lci_rmf_adapter/lci_rmf_adapter.py#L282-L283
Currently, the destination_floor is specified as
<origination>:<destination>
, but OpenRMF's rmf_lift_supervisor sends it in the format of<destination>
.Should we modify the way destination_floor is specified? Is there a standard method in OpenRMF to handle this, or should we adjust the code to match either format?
For example, it is
/adapter_lift_requests
in my case,Thanks for your help.