Skip to content

Commit 90ff6ab

Browse files
authored
Support for Agent discovery in RMW (#79)
* Initial support for Agent discovery in RMW * Add locator check session init
1 parent 2aa4f9c commit 90ff6ab

4 files changed

Lines changed: 87 additions & 1 deletion

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ jobs:
2828

2929
- name: Test
3030
run: |
31-
. /opt/ros/foxy/setup.sh && . /uros_ws/install/local_setup.sh && ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888 -v6 &
31+
. /opt/ros/foxy/setup.sh && . /uros_ws/install/local_setup.sh && ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888 -d -v6 &
3232
sleep 1
3333
. /opt/ros/foxy/setup.sh && . install/local_setup.sh
3434
cd build/rmw_microxrcedds/test

rmw_microxrcedds_c/include/rmw_uros/options.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
#include <rmw/ret_types.h>
1919
#include <rmw/init_options.h>
2020

21+
#if defined(__cplusplus)
22+
extern "C"
23+
{
24+
#endif
25+
2126
/**
2227
* \brief Parses command line args and fills rmw implementation-specific options.
2328
* `rmw_init_options allocator` is used to allocate the specific rmw options.
@@ -55,6 +60,16 @@ rmw_ret_t rmw_uros_options_set_udp_address(
5560
const char * ip, const char * port,
5661
rmw_init_options_t * rmw_options);
5762

63+
/**
64+
* \brief Fills rmw implementation-specific options with the autodicovered address of an micro-ROS Agent.
65+
*
66+
* \param[in,out] rmw_options Updated options with rmw specifics.
67+
* \return RMW_RET_OK If arguments were valid and set in rmw_init_options.
68+
* \return RMW_RET_TIMEOUT If micro-ROS agent autodiscovery is timeout.
69+
* \return RMW_RET_INVALID_ARGUMENT If rmw_init_options is not valid or unexpected arguments.
70+
*/
71+
rmw_ret_t rmw_uros_discover_agent(rmw_init_options_t * rmw_options);
72+
5873
/**
5974
* \brief Fills rmw implementation-specific options with the given parameters.
6075
*
@@ -65,5 +80,8 @@ rmw_ret_t rmw_uros_options_set_udp_address(
6580
*/
6681
rmw_ret_t rmw_uros_options_set_client_key(uint32_t client_key, rmw_init_options_t * rmw_options);
6782

83+
#if defined(__cplusplus)
84+
}
85+
#endif
6886

6987
#endif // RMW_UROS__OPTIONS_H_

rmw_microxrcedds_c/src/rmw_uros_options.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include <rmw/ret_types.h>
2222
#include <rmw/error_handling.h>
2323

24+
// #include <uxr/client/client.h>
25+
2426
rmw_ret_t rmw_uros_init_options(
2527
int argc, const char * const argv[],
2628
rmw_init_options_t * rmw_options)
@@ -117,6 +119,58 @@ rmw_ret_t rmw_uros_options_set_udp_address(
117119
#endif
118120
}
119121

122+
bool on_agent_found(const TransportLocator* locator, void* args)
123+
{
124+
rmw_init_options_t * rmw_options = (rmw_init_options_t *) args;
125+
uxrIpProtocol ip_protocol;
126+
char ip[MAX_IP_LEN];
127+
char port_str[MAX_PORT_LEN];
128+
uint16_t port;
129+
130+
uxr_locator_to_ip(locator, ip, sizeof(ip), &port, &ip_protocol);
131+
sprintf(port_str, "%d", port);
132+
133+
uxrUDPTransport transport;
134+
uxrUDPPlatform udp_platform;
135+
if(uxr_init_udp_transport(&transport, &udp_platform, ip_protocol, ip, port_str))
136+
{
137+
uxrSession session;
138+
uxr_init_session(&session, &transport.comm, rmw_options->impl->connection_params.client_key);
139+
if(uxr_create_session_retries(&session, 1))
140+
{
141+
sprintf(rmw_options->impl->connection_params.agent_port, "%d", port);
142+
sprintf(rmw_options->impl->connection_params.agent_address, "%s", ip);
143+
uxr_delete_session(&session);
144+
return true;
145+
}
146+
}
147+
return false;
148+
}
149+
150+
rmw_ret_t rmw_uros_discover_agent(rmw_init_options_t * rmw_options)
151+
{
152+
#if defined(MICRO_XRCEDDS_UDP) && defined(UCLIENT_PROFILE_DISCOVERY)
153+
if (NULL == rmw_options) {
154+
RMW_SET_ERROR_MSG("Uninitialised rmw_init_options.");
155+
return RMW_RET_INVALID_ARGUMENT;
156+
}
157+
158+
memset(rmw_options->impl->connection_params.agent_address, 0, MAX_IP_LEN);
159+
memset(rmw_options->impl->connection_params.agent_port, 0, MAX_PORT_LEN);
160+
161+
uxr_discovery_agents_default(1, 1000, on_agent_found, (void*) rmw_options);
162+
163+
return (strlen(rmw_options->impl->connection_params.agent_address) > 0 )? RMW_RET_OK : RMW_RET_TIMEOUT;
164+
#else
165+
(void) ip;
166+
(void) port;
167+
(void) rmw_options;
168+
169+
RMW_SET_ERROR_MSG("MICRO_XRCEDDS_UDP or UCLIENT_PROFILE_DISCOVERY not set.");
170+
return RMW_RET_INVALID_ARGUMENT;
171+
#endif
172+
}
173+
120174
rmw_ret_t rmw_uros_options_set_client_key(uint32_t client_key, rmw_init_options_t * rmw_options)
121175
{
122176
if (NULL == rmw_options) {

rmw_microxrcedds_c/test/test_rmw.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include <rmw/init_options.h>
1919
#include <rcutils/allocator.h>
2020

21+
#include <rmw_uros/options.h>
22+
2123
/*
2224
Testing rmw init and shutdown. htps://github.com/microROS/rmw-microxrcedds/issues/14
2325
*/
@@ -28,3 +30,15 @@ TEST(rmw_microxrcedds, init_shutdown) {
2830
ASSERT_EQ(rmw_init(&test_options, &test_context), RMW_RET_OK);
2931
ASSERT_EQ(rmw_shutdown(&test_context), RMW_RET_OK);
3032
}
33+
34+
/*
35+
Testing rmw agent autodiscovery.
36+
*/
37+
TEST(rmw_microxrcedds, autodiscover) {
38+
rmw_context_t test_context = rmw_get_zero_initialized_context();
39+
rmw_init_options_t test_options = rmw_get_zero_initialized_init_options();
40+
ASSERT_EQ(rmw_init_options_init(&test_options, rcutils_get_default_allocator()), RMW_RET_OK);
41+
ASSERT_EQ(rmw_uros_discover_agent(&test_options), RMW_RET_OK);
42+
ASSERT_EQ(rmw_init(&test_options, &test_context), RMW_RET_OK);
43+
ASSERT_EQ(rmw_shutdown(&test_context), RMW_RET_OK);
44+
}

0 commit comments

Comments
 (0)