Asynchronouse Publisherを使用してTopicを周期的に発行したいときのタイミング調整について

1 post / 0 new
Offline
Last seen: 5 years 3 weeks ago
Joined: 06/26/2013
Posts: 15
Asynchronouse Publisherを使用してTopicを周期的に発行したいときのタイミング調整について

通常、Topicの発行はwrite()実行時となります。(write()を呼ぶと、直接socket bufferに書き込み、書き込みが終わるとreturnします。)

しかし、Asynchronous Publisherを使用する(Large Data Topic発行時を含む)と、Topicはpublisher thread に渡され、FlowControllerのscheduling_
policyに従って発行されます。この時、write()はpublisher threadにTopicを渡し次第すぐにreturnします。(publisher thread はAsynchronous Publisher の使用時にのみ生成されます。)

FlowControllerのQosは以下の三種類があります。
DDS_RR_FLOW_CONTROLLER_SCHED_POLICY: ラウンドロビン
DDS_EDF_FLOW_CONTROLLER_SCHED_POLICY: デッドライン順
DDS_HPF_FLOW_CONTROLLER_SCHED_POLICY: プライオリティ順

これらのQoSでは、Topicの発行タイミングはConnextが内部で設定します。

このため、もし特定の時間を起点とした定周期発行を行いたい場合には、QoSの発行間隔token_bucket.period.sec, token_bucket.period.nanosecを無限大に設定し、任意の発行タイミングに合わせてtrigger_flow()を呼び出していただく必要があります。

例1: 10秒周期でTopicを発行したい場合は、以下の様にQoSにてDDS_RR_FLOW_CONTROLLER_SCHED_POLICYを設定し、間隔を10秒に設定します。
<datawriter_qos>
    <publish_mode>
        <kind>ASYNCHRONOUS_PUBLISH_MODE_QOS</kind>
        <flow_controller_name>Your_Flow_Controller_Name</flow_controller_name>
    </publish_mode>
         (中略)
</datawriter_qos>

<participant_qos>
  <participant_name>
    <name>Your Profile Name</name>
  </participant_name>
  <property>
    <value>
      <element>
        <name>Your_Flow_Controller_Name.scheduling_policy</name>
        <value>DDS_RR_FLOW_CONTROLLER_SCHED_POLICY</value>
      </element>
      <element>
        <name>Your_Flow_Controller_Name.token_bucket.period.sec</name>
        <value>10</value>
      </element>
      <element>
        <name>Your_Flow_Controller_Name.token_bucket.period.nanosec</name>
        <value>0</value>
      </element>
         (後略)

例2: 毎分0秒、10秒、20秒、30秒、40秒、50秒にTopicを発行したい場合は、以下の様にQoSを設定し、時間に合わせてtrigger_flow()を呼び出します。
(.token_bucket.period.sec, .token_bucket.period.nanosec を "DDS_DURATION_INFINITE" にしました。)
<datawriter_qos>
    <publish_mode>
        <kind>ASYNCHRONOUS_PUBLISH_MODE_QOS</kind>
        <flow_controller_name>Your_Flow_Controller_Name</flow_controller_name>
    </publish_mode>
         (中略)
</datawriter_qos>

<participant_qos>
  <participant_name>
    <name>Your Profile Name</name>
  </participant_name>
  <property>
    <value>
      <element>
        <name>Your_Flow_Controller_Name.scheduling_policy</name>
        <value>DDS_RR_FLOW_CONTROLLER_SCHED_POLICY</value>
      </element>
      <element>
        <name>Your_Flow_Controller_Name.token_bucket.period.sec</name>
        <value>DDS_DURATION_INFINITE</value>
      </element>
      <element>
        <name>Your_Flow_Controller_Name.token_bucket.period.nanosec</name>
        <value>DDS_DURATION_INFINITE</value>
      </element>
         (後略)

注意事項: いずれの場合も、時間精度はOSがもつ時間精度に依存します。