@takasehideki
QoS Control
for
@takasehideki
­ 京都⼤学 情報学研究科 准教授
­ JSTさきがけ 兼任研究者
­ SWEST ステアリング委員
­ IPSJ-SIGEMB 運営幹事
­ TOPPERSプロジェクト 特別会員
­ ROS Japan Users Group
ü 関⻄勉強会 主催
ü ROSCon JP 実⾏委員
­ IoT ALGYAN (あるじゃん) 運営委員
­ Elixir: NervesJP kyoto.ex
主な研究開発プロジェクト
­ mROS: 組込み向けROS軽量実⾏環境
­ Cockatrice: Elixir for HLS
⾃⼰紹介
2
Cockatrice
RclEx
coming soon,,,
RclEx
coming soon,,,
2020年9⽉8⽇(⽕)
国際ファッションセンタービル
(東京都墨⽥区)
3
ROSCon JP 2020
• 講演申込開始︓2020年4⽉ 3⽇
• 講演申込締切︓2020年5⽉22⽇
• 講演採択発表︓2020年6⽉12⽇
• 参加登録開始︓2020年6⽉19⽇
• 早期登録締切︓2020年7⽉27⽇
• 事前登録締切︓2020年8⽉31⽇
https://rosjp.connpass.com/event/167746/
4
関⻄勉強会 開催︕︕
2020/03/28(⼟) 13:30-17:30
会場︓株式会社Rist
(京都五条河原町)
ROS 2な皆さん
QoS
してますよね︖︖
QoS Control
• 通信経路の品質を指定する
­ Pub/Sub node間で互換性が必要
(SubのQoSプロファイルのほうが厳しい必要がある)
• 指定できるパラメータの例 (下線はデフォルト設定)
­ History (履歴): Keep last (任意の値数を保持) or Keep all
­ Depth (深さ): Size of the queue (Keep lastの個数 10)
­ Reliability (信頼性): Best effort or Reliable (リトライ試⾏)
­ Durability (耐久性): Transient local or Volatile (遅延⾮許容)
6https://index.ros.org/doc/ros2/Concepts/About-Quality-of-Service-Settings/
Profile History policy Reliability Durability
Default Keep last 10 Reliable Volatile
Services Keep last 10 Reliable Volatile
Sensor data keep last 5 Best effort Volatile
Parameters keep last 1000 Reliable Volatile
詳細︓rmw_qos_profile_t
• メンバ (⻘字はDashingより・下線はデフォルト設定)
­ history (履歴): Keep last (任意の値数を保持) or Keep all
­ depth (深さ): Size of the queue (Keep lastの個数 10)
­ reliability (信頼性): Best effort or Reliable (リトライ試⾏)
­ durability (耐久性): Transient local or Volatile (遅延⾮許容)
­ deadline (許容更新周期): Period ({0, 0})
­ lifespan (存在期間): Age ({0, 0})
­ liveliness (⽣存確認): Default, Automatic or Manual
­ liveliness_lease_duration (保証時間): Time ({0, 0})
­ avoid_ros_namespace_conventions:
ROS固有の名前空間をDDSのものに変換するか true or false
7http://docs.ros2.org/dashing/api/rmw/structrmw__qos__profile__t.html
詳細︓QoSプロファイルの互換性
• Reliability (信頼性)
• Durability (信頼性)
8https://index.ros.org/doc/ros2/Concepts/About-Quality-of-Service-Settings/
Publisher Subscriber Connection Result
Best effort Best effort Yes Best effort
Best effort Reliable No --
Reliable Best effort Yes Best effort
Reliable Reliable Yes Reliable
Publisher Subscriber Connection Result
Volatile Volatile Yes Volatile
Volatile Transient local No --
Transient local Volatile Yes Volatile
Transient local Transient local Yes Transient local
9
10
11
auto sub = n->create_subscription<std_msgs::msg::String>(
"chatter", chatterCallback);
12
OK!
Warning?
[-Wdeprecated-declarations]
Error!!
no match function for call to
auto sub = n->create_subscription<std_msgs::msg::String>(
"chatter", chatterCallback, 1000);
13
OK!
Warning?
[-Wdeprecated-declarations]
Error!!
no match function for call to
auto sub = n->create_subscription<std_msgs::msg::String>(
"chatter", 1000, chatterCallback);
14
OK!
OK!
Error!!
no match function for call to
auto sub = n->create_subscription<std_msgs::msg::String>(
"chatter", chatterCallback, rmw_qos_profile_sensor_data);
15
OK!
Warning
[-Wdeprecated-declarations]
Error!!
no match function for call to
rmw_qos_profile_t custom_qos = rmw_qos_profile_sensor_data;
custom_qos.depth = 7;
auto sub = n->create_subscription<std_msgs::msg::String>(
"chatter", chatterCallback, custom_qos);
16
OK!
Warning
[-Wdeprecated-declarations]
Error!!
no match function for call to
auto sub = n->create_subscription<std_msgs::msg::String>(
"chatter", rclcpp::SensorDataQoS(), chatterCallback);
17
OK!
OK!
rclcpp::QoS custom_qos(rclcpp::KeepLast(10), rmw_qos_profile_sensor_data);
auto sub = n->create_subscription<std_msgs::msg::String>(
"chatter", custom_qos, chatterCallback);
18
OK!
OK!
auto custom_qos = rclcpp::QoS(
rclcpp::QoSInitialization(
RMW_QOS_POLICY_HISTORY_KEEP_ALL,
1000
),
rmw_qos_profile_sensor_data);
auto sub = n->create_subscription<std_msgs::msg::String>(
"chatter", custom_qos, chatterCallback);
19
OK!
OK!
今わかってるQoSの実装例
20
// historyサイズを指定(残りのプロファイルはデフォルト)
pub = node->create_publisher<MsgT>("chatter", 10);
sub = node->create_subscription<MsgT>("chatter", 10, chatterCallback);
pub = node->create_publisher<MsgT>("chatter", rclcpp::QoS(10));
// 定義済みプロファイルを使⽤
pub = node->create_publisher<MsgT>("chatter", rclcpp::ServicesQoS());
sub = node->create_subscription<MsgT>("chatter",
rclcpp::SensorDataQoS(), chatterCallback);
// 定義済みプロファイルをカスタマイズ
rclcpp::QoS qos(rclcpp::KeepLast(10), rmw_qos_profile_sensor_data);
pub = node->create_publisher<MsgT>("chatter", qos, auto);
qos
今の雑感
• APIの破壊的変更つらい
• けっきょく有効なのはHistory, Reliabilityだけ︖
­ 設定⽅法を知っていたら/違ってたら
教えてくださいm(_ _)m
• というかQoSの使いこなし,まるでわからん
­ いいユースケース教えてくださいm(_ _)m
21
詳しい話しは,,,
• https://roscon.ros.org/2019/talks/roscon2019_qos.pdf
• https://vimeo.com/379127762
22
ちゃんと追試してからQiitaにまとめます,,,
関⻄勉強会でも披露するかも︖︖

QoS for ROS 2 Dashing/Eloquent