rcl
beta1
C API providing common ROS client library functionality.
|
#include "rosidl_generator_c/service_type_support.h"
#include "rcl/macros.h"
#include "rcl/node.h"
#include "rcl/visibility_control.h"
Go to the source code of this file.
Classes | |
struct | rcl_client_t |
Structure which encapsulates a ROS Client. More... | |
struct | rcl_client_options_t |
Options available for a rcl_client_t. More... | |
Typedefs | |
typedef struct rcl_client_t | rcl_client_t |
Structure which encapsulates a ROS Client. More... | |
typedef struct rcl_client_options_t | rcl_client_options_t |
Options available for a rcl_client_t. More... | |
Functions | |
rcl_client_t | rcl_get_zero_initialized_client (void) |
Return a rcl_client_t struct with members set to NULL . More... | |
rcl_ret_t | rcl_client_init (rcl_client_t *client, const rcl_node_t *node, const rosidl_service_type_support_t *type_support, const char *service_name, const rcl_client_options_t *options) |
Initialize a rcl client. More... | |
rcl_ret_t | rcl_client_fini (rcl_client_t *client, rcl_node_t *node) |
Finalize a rcl_client_t. More... | |
rcl_client_options_t | rcl_client_get_default_options (void) |
Return the default client options in a rcl_client_options_t. More... | |
rcl_ret_t | rcl_send_request (const rcl_client_t *client, const void *ros_request, int64_t *sequence_number) |
Send a ROS request using a client. More... | |
rcl_ret_t | rcl_take_response (const rcl_client_t *client, rmw_request_id_t *request_header, void *ros_response) |
Take a ROS response using a client. More... | |
const char * | rcl_client_get_service_name (const rcl_client_t *client) |
Get the name of the service that this client will request a response from. More... | |
const rcl_client_options_t * | rcl_client_get_options (const rcl_client_t *client) |
Return the rcl client options. More... | |
rmw_client_t * | rcl_client_get_rmw_handle (const rcl_client_t *client) |
Return the rmw client handle. More... | |
typedef struct rcl_client_t rcl_client_t |
Structure which encapsulates a ROS Client.
typedef struct rcl_client_options_t rcl_client_options_t |
Options available for a rcl_client_t.
rcl_client_t rcl_get_zero_initialized_client | ( | void | ) |
Return a rcl_client_t struct with members set to NULL
.
Should be called to get a null rcl_client_t before passing to rcl_client_init().
rcl_ret_t rcl_client_init | ( | rcl_client_t * | client, |
const rcl_node_t * | node, | ||
const rosidl_service_type_support_t * | type_support, | ||
const char * | service_name, | ||
const rcl_client_options_t * | options | ||
) |
Initialize a rcl client.
After calling this function on a rcl_client_t, it can be used to send requests of the given type by calling rcl_send_request(). If the request is received by a (possibly remote) service and if the service sends a response, the client can access the response through rcl_take_response() once the response is available to the client.
The given rcl_node_t must be valid and the resulting rcl_client_t is only valid as long as the given rcl_node_t remains valid.
The rosidl_service_type_support_t is obtained on a per .srv
type basis. When the user defines a ROS service, code is generated which provides the required rosidl_service_type_support_t object. This object can be obtained using a language appropriate mechanism.
example_interfaces/AddTwoInts
):For C++ a template function is used:
The rosidl_service_type_support_t object contains service type specific information used to send or take requests and responses.
The options struct allows the user to set the quality of service settings as well as a custom allocator which is used when initializing/finalizing the client to allocate space for incidentals, e.g. the service name string.
Expected usage (for C services):
Attribute | Adherence |
---|---|
Allocates Memory | Yes |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in,out] | client | preallocated rcl_client_t structure |
[in] | node | valid rcl_node_t |
[in] | type_support | type support object for the service's type |
[in] | service_name | the name of the service to request |
[in] | options | client options, including quality of service settings |
RCL_RET_OK
if the client was initialized successfully, or RCL_RET_NODE_INVALID
if the node is invalid, or RCL_RET_ALREADY_INIT
if the client is already initialized, or RCL_RET_INVALID_ARGUMENT
if any arguments are invalid, or RCL_RET_BAD_ALLOC
if allocating memory fails, or RCL_RET_ERROR
if an unspecified error occurs. rcl_ret_t rcl_client_fini | ( | rcl_client_t * | client, |
rcl_node_t * | node | ||
) |
Finalize a rcl_client_t.
After calling this function, calls to rcl_send_request() and rcl_take_response() will fail when using this client. However, the given node handle is still valid.
Attribute | Adherence |
---|---|
Allocates Memory | Yes |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in,out] | client | handle to the client to be finalized |
[in] | node | handle to the node used to create the client |
RCL_RET_OK
if client was finalized successfully, or RCL_RET_INVALID_ARGUMENT
if any arguments are invalid, or RCL_RET_ERROR
if an unspecified error occurs. rcl_client_options_t rcl_client_get_default_options | ( | void | ) |
Return the default client options in a rcl_client_options_t.
The defaults are:
rcl_ret_t rcl_send_request | ( | const rcl_client_t * | client, |
const void * | ros_request, | ||
int64_t * | sequence_number | ||
) |
Send a ROS request using a client.
It is the job of the caller to ensure that the type of the ros_request
parameter and the type associate with the client (via the type support) match. Passing a different type to send_request
produces undefined behavior and cannot be checked by this function and therefore no deliberate error will occur.
rcl_send_request() is an non-blocking call.
The ROS request message given by the ros_request
void pointer is always owned by the calling code, but should remain constant during send_request
.
This function is thread safe so long as access to both the client and the ros_request
is synchronized. That means that calling rcl_send_request() from multiple threads is allowed, but calling rcl_send_request() at the same time as non-thread safe client functions is not, e.g. calling rcl_send_request() and rcl_client_fini() concurrently is not allowed. Before calling rcl_send_request() the message can change and after calling rcl_send_request() the message can change, but it cannot be changed during the send_request
call. The same ros_request
, however, can be passed to multiple calls of rcl_send_request() simultaneously, even if the clients differ. The ros_request
is unmodified by rcl_send_request().
Attribute | Adherence |
---|---|
Allocates Memory | No |
Thread-Safe | Yes [1] |
Uses Atomics | No |
Lock-Free | Yes |
[1] for unique pairs of clients and requests, see above for more
[in] | client | handle to the client which will make the response |
[in] | ros_request | type-erased pointer to the ROS request message |
[out] | sequence_number | the sequence number |
RCL_RET_OK
if the request was sent successfully, or RCL_RET_INVALID_ARGUMENT
if any arguments are invalid, or RCL_RET_CLIENT_INVALID
if the client is invalid, or RCL_RET_ERROR
if an unspecified error occurs. rcl_ret_t rcl_take_response | ( | const rcl_client_t * | client, |
rmw_request_id_t * | request_header, | ||
void * | ros_response | ||
) |
Take a ROS response using a client.
It is the job of the caller to ensure that the type of the ros_response
parameter and the type associate with the client (via the type support) match. Passing a different type to take_response produces undefined behavior and cannot be checked by this function and therefore no deliberate error will occur. The request_header is an rmw struct for meta-information about the request sent (e.g. the sequence number). ros_response
should point to an already allocated ROS response message struct of the correct type, into which the response from the service will be copied.
Attribute | Adherence |
---|---|
Allocates Memory | Maybe [1] |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[1] only if required when filling the message, avoided for fixed sizes
[in] | client | handle to the client which will take the response |
[in,out] | request_header | pointer to the request header |
[in,out] | ros_response | type-erased pointer to the ROS response message |
RCL_RET_OK
if the response was taken successfully, or RCL_RET_INVALID_ARGUMENT
if any arguments are invalid, or RCL_RET_CLIENT_INVALID
if the client is invalid, or RCL_RET_ERROR
if an unspecified error occurs. const char* rcl_client_get_service_name | ( | const rcl_client_t * | client | ) |
Get the name of the service that this client will request a response from.
This function returns the client's internal service name string. This function can fail, and therefore return NULL
, if the:
NULL
The returned string is only valid as long as the rcl_client_t is valid. The value of the string may change if the service name changes, and therefore copying the string is recommended if this is a concern.
Attribute | Adherence |
---|---|
Allocates Memory | Yes |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in] | client | pointer to the client |
NULL
const rcl_client_options_t* rcl_client_get_options | ( | const rcl_client_t * | client | ) |
Return the rcl client options.
This function returns the client's internal options struct. This function can fail, and therefore return NULL
, if the:
NULL
The returned struct is only valid as long as the rcl_client_t is valid. The values in the struct may change if the options of the client change, and therefore copying the struct is recommended if this is a concern.
Attribute | Adherence |
---|---|
Allocates Memory | Yes |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in] | client | pointer to the client |
NULL
rmw_client_t* rcl_client_get_rmw_handle | ( | const rcl_client_t * | client | ) |
Return the rmw client handle.
The handle returned is a pointer to the internally held rmw handle. This function can fail, and therefore return NULL
, if the:
NULL
The returned handle is made invalid if the client is finalized or if rcl_shutdown() is called. The returned handle is not guaranteed to be valid for the life time of the client as it may be finalized and recreated itself. Therefore it is recommended to get the handle from the client using this function each time it is needed and avoid use of the handle concurrently with functions that might change it.
Attribute | Adherence |
---|---|
Allocates Memory | Yes |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in] | client | pointer to the rcl client |
NULL