Skip to content

Commit 7e8de5e

Browse files
committed
uxrce_dds: support multi-instance uORB topics
Enable DDS bridge to handle multi-instance uORB topics by mapping multiple topic instances to a single DDS topic with instance field.
1 parent 3d71568 commit 7e8de5e

File tree

3 files changed

+65
-7
lines changed

3 files changed

+65
-7
lines changed

src/modules/uxrce_dds_client/dds_topics.h.em

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,21 @@ struct RcvTopicsPubs {
162162
uORB::Publication<@(sub['simple_base_type'])_s> @(sub['topic_simple'])_pub{ORB_ID(@(sub['topic_simple']))};
163163
@[ end for]@
164164

165-
@[ for sub in subscriptions_multi]@
166-
uORB::PublicationMulti<@(sub['simple_base_type'])_s> @(sub['topic_simple'])_pub{ORB_ID(@(sub['topic_simple']))};
165+
@# Group subscriptions_multi by topic to create arrays
166+
@{
167+
multi_topic_groups = {}
168+
for sub in subscriptions_multi:
169+
topic_simple = sub['topic_simple']
170+
if topic_simple not in multi_topic_groups:
171+
multi_topic_groups[topic_simple] = []
172+
multi_topic_groups[topic_simple].append(sub)
173+
}@
174+
@[ for topic_simple, subs in multi_topic_groups.items()]@
175+
uORB::PublicationMulti<@(subs[0]['simple_base_type'])_s> @(topic_simple)_pubs[@(len(subs))] {
176+
@[ for idx, sub in enumerate(subs)]@
177+
{ORB_ID(@(topic_simple))}@('' if idx == len(subs)-1 else ',')
178+
@[ end for]@
179+
};
167180
@[ end for]@
168181

169182
uint32_t num_payload_received{};
@@ -179,7 +192,7 @@ static void on_topic_update(uxrSession *session, uxrObjectId object_id, uint16_t
179192
pubs->num_payload_received += length;
180193

181194
switch (object_id.id) {
182-
@[ for idx, sub in enumerate(subscriptions + subscriptions_multi)]@
195+
@[ for idx, sub in enumerate(subscriptions)]@
183196
case @(idx)+ (65535U / 32U) + 1: {
184197
@(sub['simple_base_type'])_s data;
185198

@@ -190,6 +203,18 @@ static void on_topic_update(uxrSession *session, uxrObjectId object_id, uint16_t
190203
}
191204
break;
192205

206+
@[ end for]@
207+
@[ for idx, sub in enumerate(subscriptions_multi)]@
208+
case @(idx + len(subscriptions))+ (65535U / 32U) + 1: {
209+
@(sub['simple_base_type'])_s data;
210+
211+
if (ucdr_deserialize_@(sub['simple_base_type'])(*ub, data, time_offset_us)) {
212+
//print_message(ORB_ID(@(sub['simple_base_type'])), data);
213+
pubs->@(sub['topic_simple'])_pubs[@(sub['instance'])].publish(data);
214+
}
215+
}
216+
break;
217+
193218
@[ end for]@
194219

195220
default:
@@ -200,13 +225,20 @@ static void on_topic_update(uxrSession *session, uxrObjectId object_id, uint16_t
200225

201226
bool RcvTopicsPubs::init(uxrSession *session, uxrStreamId reliable_out_stream_id, uxrStreamId reliable_in_stream_id, uxrStreamId best_effort_in_stream_id, uxrObjectId participant_id, const char *client_namespace)
202227
{
203-
@[ for idx, sub in enumerate(subscriptions + subscriptions_multi)]@
228+
@[ for idx, sub in enumerate(subscriptions)]@
204229
{
205230
uint16_t queue_depth = orb_get_queue_size(ORB_ID(@(sub['simple_base_type']))) * 2; // use a bit larger queue size than internal
206231
uint32_t message_version = get_message_version<@(sub['simple_base_type'])_s>();
207232
create_data_reader(session, reliable_out_stream_id, best_effort_in_stream_id, participant_id, @(idx), client_namespace, "@(sub['topic'])", message_version, "@(sub['dds_type'])", queue_depth);
208233
}
209234
@[ end for]@
235+
@[ for idx, sub in enumerate(subscriptions_multi)]@
236+
{
237+
uint16_t queue_depth = orb_get_queue_size(ORB_ID(@(sub['topic_simple']))) * 2; // use a bit larger queue size than internal
238+
uint32_t message_version = get_message_version<@(sub['simple_base_type'])_s>();
239+
create_data_reader(session, reliable_out_stream_id, best_effort_in_stream_id, participant_id, @(idx + len(subscriptions)), client_namespace, "@(sub['topic'])", message_version, "@(sub['dds_type'])", queue_depth);
240+
}
241+
@[ end for]@
210242

211243
uxr_set_topic_callback(session, on_topic_update, this);
212244

src/modules/uxrce_dds_client/dds_topics.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,10 @@ subscriptions:
228228

229229
# Create uORB::PublicationMulti
230230
subscriptions_multi:
231+
- type: px4_msgs::msg::AuxGlobalPosition
232+
uorb_topic: aux_global_position
233+
ros_topics:
234+
- /fmu/in/aux_global_position_A
235+
- /fmu/in/aux_global_position_B
236+
- /fmu/in/aux_global_position_C
237+
- /fmu/in/aux_global_position_D

src/modules/uxrce_dds_client/generate_dds_topics.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,30 @@ def process_message_instance(msg_type):
131131
merged_em_globals['subscriptions'] = msg_map['subscriptions'] if subs_not_empty else []
132132

133133
subs_multi_not_empty = msg_map['subscriptions_multi'] is not None
134+
expanded_subs_multi = []
134135
if subs_multi_not_empty:
135136
for sm in msg_map['subscriptions_multi']:
136-
process_message_type(sm)
137-
138-
merged_em_globals['subscriptions_multi'] = msg_map['subscriptions_multi'] if subs_multi_not_empty else []
137+
if 'ros_topics' in sm and 'uorb_topic' in sm:
138+
# Expand each DDS topic into a separate entry
139+
# All entries for the same uorb_topic will use the same array
140+
uorb_topic_name = sm['uorb_topic']
141+
for idx, dds_topic in enumerate(sm['ros_topics']):
142+
expanded_entry = {
143+
'type': sm['type'],
144+
'topic': dds_topic,
145+
'uorb_topic': uorb_topic_name,
146+
'instance': idx
147+
}
148+
process_message_type(expanded_entry)
149+
expanded_entry['topic_simple'] = uorb_topic_name
150+
expanded_subs_multi.append(expanded_entry)
151+
else:
152+
# Fallback for old-style single topic entries
153+
process_message_type(sm)
154+
sm['instance'] = 0
155+
expanded_subs_multi.append(sm)
156+
157+
merged_em_globals['subscriptions_multi'] = expanded_subs_multi
139158

140159
merged_em_globals['type_includes'] = sorted(set(all_type_includes))
141160

0 commit comments

Comments
 (0)