rcl
master
C API providing common ROS client library functionality.
|
#include "rosidl_runtime_c/message_type_support_struct.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_publisher_t |
Structure which encapsulates a ROS Publisher. More... | |
struct | rcl_publisher_options_t |
Options available for a rcl publisher. More... | |
Typedefs | |
typedef struct rcl_publisher_t | rcl_publisher_t |
Structure which encapsulates a ROS Publisher. | |
typedef struct rcl_publisher_options_t | rcl_publisher_options_t |
Options available for a rcl publisher. | |
Functions | |
rcl_publisher_t | rcl_get_zero_initialized_publisher (void) |
Return a rcl_publisher_t struct with members set to NULL . More... | |
rcl_ret_t | rcl_publisher_init (rcl_publisher_t *publisher, const rcl_node_t *node, const rosidl_message_type_support_t *type_support, const char *topic_name, const rcl_publisher_options_t *options) |
Initialize a rcl publisher. More... | |
rcl_ret_t | rcl_publisher_fini (rcl_publisher_t *publisher, rcl_node_t *node) |
Finalize a rcl_publisher_t. More... | |
rcl_publisher_options_t | rcl_publisher_get_default_options (void) |
Return the default publisher options in a rcl_publisher_options_t. More... | |
rcl_ret_t | rcl_borrow_loaned_message (const rcl_publisher_t *publisher, const rosidl_message_type_support_t *type_support, void **ros_message) |
Borrow a loaned message. More... | |
rcl_ret_t | rcl_return_loaned_message_from_publisher (const rcl_publisher_t *publisher, void *loaned_message) |
Return a loaned message previously borrowed from a publisher. More... | |
rcl_ret_t | rcl_publish (const rcl_publisher_t *publisher, const void *ros_message, rmw_publisher_allocation_t *allocation) |
Publish a ROS message on a topic using a publisher. More... | |
rcl_ret_t | rcl_publish_serialized_message (const rcl_publisher_t *publisher, const rcl_serialized_message_t *serialized_message, rmw_publisher_allocation_t *allocation) |
Publish a serialized message on a topic using a publisher. More... | |
rcl_ret_t | rcl_publish_loaned_message (const rcl_publisher_t *publisher, void *ros_message, rmw_publisher_allocation_t *allocation) |
Publish a loaned message on a topic using a publisher. More... | |
rcl_ret_t | rcl_publisher_assert_liveliness (const rcl_publisher_t *publisher) |
Manually assert that this Publisher is alive (for RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_TOPIC) More... | |
const char * | rcl_publisher_get_topic_name (const rcl_publisher_t *publisher) |
Get the topic name for the publisher. More... | |
const rcl_publisher_options_t * | rcl_publisher_get_options (const rcl_publisher_t *publisher) |
Return the rcl publisher options. More... | |
rmw_publisher_t * | rcl_publisher_get_rmw_handle (const rcl_publisher_t *publisher) |
Return the rmw publisher handle. More... | |
rcl_context_t * | rcl_publisher_get_context (const rcl_publisher_t *publisher) |
Return the context associated with this publisher. More... | |
bool | rcl_publisher_is_valid (const rcl_publisher_t *publisher) |
Return true if the publisher is valid, otherwise false. More... | |
bool | rcl_publisher_is_valid_except_context (const rcl_publisher_t *publisher) |
Return true if the publisher is valid except the context, otherwise false. More... | |
rcl_ret_t | rcl_publisher_get_subscription_count (const rcl_publisher_t *publisher, size_t *subscription_count) |
Get the number of subscriptions matched to a publisher. More... | |
const rmw_qos_profile_t * | rcl_publisher_get_actual_qos (const rcl_publisher_t *publisher) |
Get the actual qos settings of the publisher. More... | |
bool | rcl_publisher_can_loan_messages (const rcl_publisher_t *publisher) |
Check if publisher instance can loan messages. More... | |
rcl_publisher_t rcl_get_zero_initialized_publisher | ( | void | ) |
Return a rcl_publisher_t struct with members set to NULL
.
Should be called to get a null rcl_publisher_t before passing to rcl_publisher_init().
rcl_ret_t rcl_publisher_init | ( | rcl_publisher_t * | publisher, |
const rcl_node_t * | node, | ||
const rosidl_message_type_support_t * | type_support, | ||
const char * | topic_name, | ||
const rcl_publisher_options_t * | options | ||
) |
Initialize a rcl publisher.
After calling this function on a rcl_publisher_t, it can be used to publish messages of the given type to the given topic using rcl_publish().
The given rcl_node_t must be valid and the resulting rcl_publisher_t is only valid as long as the given rcl_node_t remains valid.
The rosidl_message_type_support_t is obtained on a per .msg type basis. When the user defines a ROS message, code is generated which provides the required rosidl_message_type_support_t object. This object can be obtained using a language appropriate mechanism.
For C, a macro can be used (for example std_msgs/String
):
For C++, a template function is used:
The rosidl_message_type_support_t object contains message type specific information used to publish messages.
The topic name must be a c string which follows the topic and service name format rules for unexpanded names, also known as non-fully qualified names:
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 publisher to allocate space for incidentals, e.g. the topic name string.
Expected usage (for C messages):
Attribute | Adherence |
---|---|
Allocates Memory | Yes |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in,out] | publisher | preallocated publisher structure |
[in] | node | valid rcl node handle |
[in] | type_support | type support object for the topic's type |
[in] | topic_name | the name of the topic to publish on |
[in] | options | publisher options, including quality of service settings |
rcl_ret_t rcl_publisher_fini | ( | rcl_publisher_t * | publisher, |
rcl_node_t * | node | ||
) |
Finalize a rcl_publisher_t.
After calling, the node will no longer be advertising that it is publishing on this topic (assuming this is the only publisher on this topic).
After calling, calls to rcl_publish will fail when using this publisher. However, the given node handle is still valid.
Attribute | Adherence |
---|---|
Allocates Memory | Yes |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in,out] | publisher | handle to the publisher to be finalized |
[in] | node | a valid (not finalized) handle to the node used to create the publisher |
rcl_publisher_options_t rcl_publisher_get_default_options | ( | void | ) |
Return the default publisher options in a rcl_publisher_options_t.
The defaults are:
rcl_ret_t rcl_borrow_loaned_message | ( | const rcl_publisher_t * | publisher, |
const rosidl_message_type_support_t * | type_support, | ||
void ** | ros_message | ||
) |
Borrow a loaned message.
The memory allocated for the ros message belongs to the middleware and must not be deallocated other than by a call to
Attribute | Adherence |
---|---|
Allocates Memory | No [0] |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[0] the underlying middleware might allocate new memory or returns an existing chunk form a pool. The function in rcl however does not allocate any additional memory.
[in] | publisher | Publisher to which the allocated message is associated. |
[in] | type_support | Typesupport to which the internal ros message is allocated. |
[out] | ros_message | The pointer to be filled to a valid ros message by the middleware. |
rcl_ret_t rcl_return_loaned_message_from_publisher | ( | const rcl_publisher_t * | publisher, |
void * | loaned_message | ||
) |
Return a loaned message previously borrowed from a publisher.
The ownership of the passed in ros message will be transferred back to the middleware. The middleware might deallocate and destroy the message so that the pointer is no longer guaranteed to be valid after that call.
Attribute | Adherence |
---|---|
Allocates Memory | No |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in] | publisher | Publisher to which the loaned message is associated. |
[in] | loaned_message | Loaned message to be deallocated and destroyed. |
rcl_ret_t rcl_publish | ( | const rcl_publisher_t * | publisher, |
const void * | ros_message, | ||
rmw_publisher_allocation_t * | allocation | ||
) |
Publish a ROS message on a topic using a publisher.
It is the job of the caller to ensure that the type of the ros_message parameter and the type associate with the publisher (via the type support) match. Passing a different type to publish produces undefined behavior and cannot be checked by this function and therefore no deliberate error will occur.
Calling rcl_publish() is a potentially blocking call. When called rcl_publish() will immediately do any publishing related work, including, but not limited to, converting the message into a different type, serializing the message, collecting publish statistics, etc. The last thing it will do is call the underlying middleware's publish function which may or may not block based on the quality of service settings given via the publisher options in rcl_publisher_init(). For example, if the reliability is set to reliable, then a publish may block until space in the publish queue is available, but if the reliability is set to best effort then it should not block.
The ROS message given by the ros_message
void pointer is always owned by the calling code, but should remain constant during publish.
This function is thread safe so long as access to both the publisher and the ros_message
is synchronized. That means that calling rcl_publish() from multiple threads is allowed, but calling rcl_publish() at the same time as non-thread safe publisher functions is not, e.g. calling rcl_publish() and rcl_publisher_fini() concurrently is not allowed. Before calling rcl_publish() the message can change and after calling rcl_publish() the message can change, but it cannot be changed during the publish call. The same ros_message
, however, can be passed to multiple calls of rcl_publish() simultaneously, even if the publishers differ. The ros_message
is unmodified by rcl_publish().
Attribute | Adherence |
---|---|
Allocates Memory | No |
Thread-Safe | Yes [1] |
Uses Atomics | No |
Lock-Free | Yes |
[1] for unique pairs of publishers and messages, see above for more
[in] | publisher | handle to the publisher which will do the publishing |
[in] | ros_message | type-erased pointer to the ROS message |
[in] | allocation | structure pointer, used for memory preallocation (may be NULL) |
rcl_ret_t rcl_publish_serialized_message | ( | const rcl_publisher_t * | publisher, |
const rcl_serialized_message_t * | serialized_message, | ||
rmw_publisher_allocation_t * | allocation | ||
) |
Publish a serialized message on a topic using a publisher.
It is the job of the caller to ensure that the type of the serialized message parameter and the type associate with the publisher (via the type support) match. Even though this call to publish takes an already serialized serialized message, the publisher has to register its type as a ROS known message type. Passing a serialized message from a different type leads to undefined behavior on the subscriber side. The publish call might be able to send any abitrary serialized message, it is however not garantueed that the subscriber side successfully deserializes this byte stream.
Apart from this, the publish_serialized
function has the same behavior as rcl_publish() expect that no serialization step is done.
Attribute | Adherence |
---|---|
Allocates Memory | No |
Thread-Safe | Yes [1] |
Uses Atomics | No |
Lock-Free | Yes |
[1] for unique pairs of publishers and messages, see above for more
[in] | publisher | handle to the publisher which will do the publishing |
[in] | serialized_message | pointer to the already serialized message in raw form |
[in] | allocation | structure pointer, used for memory preallocation (may be NULL) |
rcl_ret_t rcl_publish_loaned_message | ( | const rcl_publisher_t * | publisher, |
void * | ros_message, | ||
rmw_publisher_allocation_t * | allocation | ||
) |
Publish a loaned message on a topic using a publisher.
A previously borrowed loaned message can be sent via this call to rcl_publish_loaned_message(). By calling this function, the ownership of the loaned message is getting transferred back to the middleware. The pointer to the ros_message
is not guaranteed to be valid after as the middleware migth deallocate the memory for this message internally. It is thus recommended to call this function only in combination with
Apart from this, the publish_loaned_message
function has the same behavior as rcl_publish() except that no serialization step is done.
Attribute | Adherence |
---|---|
Allocates Memory | No [0] |
Thread-Safe | Yes [1] |
Uses Atomics | No |
Lock-Free | Yes |
[0] the middleware might deallocate the loaned message. The RCL function however does not allocate any memory. [1] for unique pairs of publishers and messages, see above for more
[in] | publisher | handle to the publisher which will do the publishing |
[in] | ros_message | pointer to the previously borrow loaned message |
[in] | allocation | structure pointer, used for memory preallocation (may be NULL) |
rcl_ret_t rcl_publisher_assert_liveliness | ( | const rcl_publisher_t * | publisher | ) |
Manually assert that this Publisher is alive (for RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_TOPIC)
If the rmw Liveliness policy is set to RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_TOPIC, the creator of this publisher may manually call assert_liveliness
at some point in time to signal to the rest of the system that this Node is still alive. This function must be called at least as often as the qos_profile's liveliness_lease_duration
Attribute | Adherence |
---|---|
Allocates Memory | No |
Thread-Safe | Yes |
Uses Atomics | No |
Lock-Free | Yes |
[in] | publisher | handle to the publisher that needs liveliness to be asserted |
const char* rcl_publisher_get_topic_name | ( | const rcl_publisher_t * | publisher | ) |
Get the topic name for the publisher.
This function returns the publisher's internal topic name string. This function can fail, and therefore return NULL
, if the:
NULL
The returned string is only valid as long as the rcl_publisher_t is valid. The value of the string may change if the topic name changes, and therefore copying the string is recommended if this is a concern.
Attribute | Adherence |
---|---|
Allocates Memory | No |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in] | publisher | pointer to the publisher |
NULL
const rcl_publisher_options_t* rcl_publisher_get_options | ( | const rcl_publisher_t * | publisher | ) |
Return the rcl publisher options.
This function returns the publisher'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_publisher_t is valid. The values in the struct may change if the options of the publisher change, and therefore copying the struct is recommended if this is a concern.
Attribute | Adherence |
---|---|
Allocates Memory | No |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in] | publisher | pointer to the publisher |
NULL
rmw_publisher_t* rcl_publisher_get_rmw_handle | ( | const rcl_publisher_t * | publisher | ) |
Return the rmw publisher 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 publisher is finalized or if rcl_shutdown() is called. The returned handle is not guaranteed to be valid for the life time of the publisher as it may be finalized and recreated itself. Therefore it is recommended to get the handle from the publisher 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 | No |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in] | publisher | pointer to the rcl publisher |
NULL
rcl_context_t* rcl_publisher_get_context | ( | const rcl_publisher_t * | publisher | ) |
Return the context associated with this publisher.
This function can fail, and therefore return NULL
, if the:
NULL
The returned context is made invalid if the publisher is finalized or if rcl_shutdown() is called. Therefore it is recommended to get the handle from the publisher 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 | No |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in] | publisher | pointer to the rcl publisher |
NULL
bool rcl_publisher_is_valid | ( | const rcl_publisher_t * | publisher | ) |
Return true if the publisher is valid, otherwise false.
The bool returned is false
if publisher
is invalid. The bool returned is true
otherwise. In the case where false
is to be returned, an error message is set. This function cannot fail.
Attribute | Adherence |
---|---|
Allocates Memory | No |
Thread-Safe | No |
Uses Atomics | No |
Lock-Free | Yes |
[in] | publisher | pointer to the rcl publisher |
true
if publisher
is valid, otherwise false
bool rcl_publisher_is_valid_except_context | ( | const rcl_publisher_t * | publisher | ) |
Return true if the publisher is valid except the context, otherwise false.
This is used in clean up functions that need to access the publisher, but do not need use any functions with the context.
It is identical to rcl_publisher_is_valid except it ignores the state of the context associated with the publisher.
rcl_ret_t rcl_publisher_get_subscription_count | ( | const rcl_publisher_t * | publisher, |
size_t * | subscription_count | ||
) |
Get the number of subscriptions matched to a publisher.
Used to get the internal count of subscriptions matched to a publisher.
Attribute | Adherence |
---|---|
Allocates Memory | No |
Thread-Safe | Yes |
Uses Atomics | Maybe [1] |
Lock-Free | Maybe [1] |
[1] only if the underlying rmw doesn't make use of this feature
[in] | publisher | pointer to the rcl publisher |
[out] | subscription_count | number of matched subscriptions |
const rmw_qos_profile_t* rcl_publisher_get_actual_qos | ( | const rcl_publisher_t * | publisher | ) |
Get the actual qos settings of the publisher.
Used to get the actual qos settings of the publisher. The actual configuration applied when using RMW_*_SYSTEM_DEFAULT can only be resolved after the creation of the publisher, and it depends on the underlying rmw implementation. If the underlying setting in use can't be represented in ROS terms, it will be set to RMW_*_UNKNOWN. The returned struct is only valid as long as the rcl_publisher_t is valid.
Attribute | Adherence |
---|---|
Allocates Memory | No |
Thread-Safe | Yes |
Uses Atomics | No |
Lock-Free | Yes |
[in] | publisher | pointer to the rcl publisher |
NULL
bool rcl_publisher_can_loan_messages | ( | const rcl_publisher_t * | publisher | ) |
Check if publisher instance can loan messages.
Depending on the middleware and the message type, this will return true if the middleware can allocate a ROS message instance.