Skip to content

Commit 7d11dc7

Browse files
luca-della-vedovajhdcsestevefawdlsttymxgrey
authored
Add preliminary support for parameters (#332)
* WIP Add minimal TimeSource implementation Signed-off-by: Luca Della Vedova <[email protected]> * Minor cleanup and code reorganization Signed-off-by: Luca Della Vedova <[email protected]> * Minor cleanups, add debug code Signed-off-by: Luca Della Vedova <[email protected]> * Minor cleanup Signed-off-by: Luca Della Vedova <[email protected]> * Change safety note to reflect get_now safety Signed-off-by: Luca Della Vedova <[email protected]> * Fix comment spelling Co-authored-by: jhdcs <[email protected]> * Cleanup and add some docs / tests Signed-off-by: Luca Della Vedova <[email protected]> * Avoid duplicated clocks in TimeSource Signed-off-by: Luca Della Vedova <[email protected]> * Change _rcl_clock to just Mutex Signed-off-by: Luca Della Vedova <[email protected]> * Remove Mutex from node clock Signed-off-by: Luca Della Vedova <[email protected]> * Change Mutex<bool> to AtomicBool Signed-off-by: Luca Della Vedova <[email protected]> * Avoid cloning message Signed-off-by: Luca Della Vedova <[email protected]> * Minor cleanup, add dependency Signed-off-by: Luca Della Vedova <[email protected]> * Remove hardcoded use_sim_time Signed-off-by: Luca Della Vedova <[email protected]> * Cleanup remaining warnings / clippy Signed-off-by: Luca Della Vedova <[email protected]> * Fix tests Signed-off-by: Luca Della Vedova <[email protected]> * Refactor API to use ClockSource Signed-off-by: Luca Della Vedova <[email protected]> * Fix Drop implementation, finish builder and add comments Signed-off-by: Luca Della Vedova <[email protected]> * Minor cleanups Signed-off-by: Luca Della Vedova <[email protected]> * Fix graph_tests Signed-off-by: Luca Della Vedova <[email protected]> * Remove Arc from time source Signed-off-by: Luca Della Vedova <[email protected]> * Remove Sync trait, format Signed-off-by: Luca Della Vedova <[email protected]> * Add comparison function for times, use reference to clock Signed-off-by: Luca Della Vedova <[email protected]> * Implement Add<Duration> and Sub<Duration> for Time Signed-off-by: Luca Della Vedova <[email protected]> * Make node pointer Weak to avoid memory leaks Signed-off-by: Luca Della Vedova <[email protected]> * Cleanups Signed-off-by: Luca Della Vedova <[email protected]> * WIP change clock type when use_sim_time parameter is changed Signed-off-by: Luca Della Vedova <[email protected]> * Remove need for mutex in node TimeSource Signed-off-by: Luca Della Vedova <[email protected]> * Change get_clock() to return cloned Clock object Signed-off-by: Luca Della Vedova <[email protected]> * Minor cleanup Signed-off-by: Luca Della Vedova <[email protected]> * Refactor spin and spin_once to mimic rclcpp's Executor API (#324) * Added rclcpp/rclpy-like executor * Fix comments * add serde big array support (fixed #327) (#328) * add serde big array support * Fixed an issue where cpu usage remained at 100% (#330) * Make get_parameter pub(crate) Signed-off-by: Luca Della Vedova <[email protected]> * Address review feedback Signed-off-by: Luca Della Vedova <[email protected]> * Make time_source pub(crate), remove unused APIs Signed-off-by: Luca Della Vedova <[email protected]> * WIP parameter interface implementation Signed-off-by: Luca Della Vedova <[email protected]> * Migrate to proposed API Signed-off-by: Luca Della Vedova <[email protected]> * Add API for mandatory and optional parameters Signed-off-by: Luca Della Vedova <[email protected]> * First round of unit tests for parameter API Signed-off-by: Luca Della Vedova <[email protected]> * Make complex parameter types Arc Signed-off-by: Luca Della Vedova <[email protected]> * First attempt at undeclared parameter API Signed-off-by: Luca Della Vedova <[email protected]> * First attempt at automatic parameter undeclaring Signed-off-by: Luca Della Vedova <[email protected]> * Change undeclared_parameter API to be more explicit Signed-off-by: Luca Della Vedova <[email protected]> * Minor cleanup, use atomic for undeclared params Signed-off-by: Luca Della Vedova <[email protected]> * Add docs Signed-off-by: Luca Della Vedova <[email protected]> * Add more tests Signed-off-by: Luca Della Vedova <[email protected]> * Update setter for optional parameters Signed-off-by: Luca Della Vedova <[email protected]> * Add unset api for optional parameters Signed-off-by: Luca Della Vedova <[email protected]> * Cleanup and add helper functions for arrays Signed-off-by: Luca Della Vedova <[email protected]> * Add type alias Signed-off-by: Luca Della Vedova <[email protected]> * Reduce number of generics, add more tests Signed-off-by: Luca Della Vedova <[email protected]> * Refactor to include parameter ranges and read_only Signed-off-by: Luca Della Vedova <[email protected]> * Refactor ranges Signed-off-by: Luca Della Vedova <[email protected]> * Revert API change for range builder Signed-off-by: Luca Della Vedova <[email protected]> * Add ParameterValueError variant Signed-off-by: Luca Della Vedova <[email protected]> * First implementation of tentative API Signed-off-by: Luca Della Vedova <[email protected]> * Rework API for unified declaration syntax Signed-off-by: Luca Della Vedova <[email protected]> * Add missing APIs Signed-off-by: Luca Della Vedova <[email protected]> * Add error variant for default out of range Signed-off-by: Luca Della Vedova <[email protected]> * Refactor and remove duplicated code Signed-off-by: Luca Della Vedova <[email protected]> * Revert change to parameter service file Signed-off-by: Luca Della Vedova <[email protected]> * Remove time related changes Signed-off-by: Luca Della Vedova <[email protected]> * Clarify doc for unset API Signed-off-by: Luca Della Vedova <[email protected]> * Fix comments / TODOs Signed-off-by: Luca Della Vedova <[email protected]> * Remove Arc<RwLock> wrapper from undeclared params Signed-off-by: Luca Della Vedova <[email protected]> * Add short description of deviations from other client libraries Signed-off-by: Luca Della Vedova <[email protected]> * Address minor feedback Signed-off-by: Luca Della Vedova <[email protected]> * Remove duplicated range Signed-off-by: Luca Della Vedova <[email protected]> * Change maybe_from to try_from Signed-off-by: Luca Della Vedova <[email protected]> * WIP converting to default value builder argument Signed-off-by: Luca Della Vedova <[email protected]> * Add type for test Signed-off-by: Luca Della Vedova <[email protected]> * Infer arrays and allow custom discriminators Signed-off-by: Michael X. Grey <[email protected]> * Fix CI Signed-off-by: Luca Della Vedova <[email protected]> * Fix some documentation Signed-off-by: Michael X. Grey <[email protected]> * Fix doc link Signed-off-by: Luca Della Vedova <[email protected]> * Minor cleanups and optimizations Signed-off-by: Luca Della Vedova <[email protected]> * Fix outdated docstrings Signed-off-by: Luca Della Vedova <[email protected]> * Add links in documentation / address clippy warnings Signed-off-by: Luca Della Vedova <[email protected]> --------- Signed-off-by: Luca Della Vedova <[email protected]> Signed-off-by: Michael X. Grey <[email protected]> Co-authored-by: jhdcs <[email protected]> Co-authored-by: Esteve Fernandez <[email protected]> Co-authored-by: Fawdlstty <[email protected]> Co-authored-by: Michael X. Grey <[email protected]>
1 parent fbcb17a commit 7d11dc7

File tree

4 files changed

+1740
-39
lines changed

4 files changed

+1740
-39
lines changed

rclrs/src/node.rs

+51-6
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ pub use self::builder::*;
1313
pub use self::graph::*;
1414
use crate::rcl_bindings::*;
1515
use crate::{
16-
Client, ClientBase, Context, GuardCondition, ParameterOverrideMap, Publisher, QoSProfile,
17-
RclrsError, Service, ServiceBase, Subscription, SubscriptionBase, SubscriptionCallback,
18-
ToResult,
16+
Client, ClientBase, Context, GuardCondition, ParameterBuilder, ParameterInterface,
17+
ParameterVariant, Parameters, Publisher, QoSProfile, RclrsError, Service, ServiceBase,
18+
Subscription, SubscriptionBase, SubscriptionCallback, ToResult,
1919
};
2020

2121
impl Drop for rcl_node_t {
@@ -71,7 +71,7 @@ pub struct Node {
7171
pub(crate) guard_conditions_mtx: Mutex<Vec<Weak<GuardCondition>>>,
7272
pub(crate) services_mtx: Mutex<Vec<Weak<dyn ServiceBase>>>,
7373
pub(crate) subscriptions_mtx: Mutex<Vec<Weak<dyn SubscriptionBase>>>,
74-
_parameter_map: ParameterOverrideMap,
74+
_parameter: ParameterInterface,
7575
}
7676

7777
impl Eq for Node {}
@@ -328,7 +328,7 @@ impl Node {
328328
}
329329

330330
/// Returns the ROS domain ID that the node is using.
331-
///
331+
///
332332
/// The domain ID controls which nodes can send messages to each other, see the [ROS 2 concept article][1].
333333
/// It can be set through the `ROS_DOMAIN_ID` environment variable.
334334
///
@@ -360,6 +360,51 @@ impl Node {
360360
domain_id
361361
}
362362

363+
/// Creates a [`ParameterBuilder`] that can be used to set parameter declaration options and
364+
/// declare a parameter as [`OptionalParameter`](crate::parameter::OptionalParameter),
365+
/// [`MandatoryParameter`](crate::parameter::MandatoryParameter), or
366+
/// [`ReadOnly`](crate::parameter::ReadOnlyParameter).
367+
///
368+
/// # Example
369+
/// ```
370+
/// # use rclrs::{Context, ParameterRange, RclrsError};
371+
/// let context = Context::new([])?;
372+
/// let node = rclrs::create_node(&context, "domain_id_node")?;
373+
/// // Set it to a range of 0-100, with a step of 2
374+
/// let range = ParameterRange {
375+
/// lower: Some(0),
376+
/// upper: Some(100),
377+
/// step: Some(2),
378+
/// };
379+
/// let param = node.declare_parameter("int_param")
380+
/// .default(10)
381+
/// .range(range)
382+
/// .mandatory()
383+
/// .unwrap();
384+
/// assert_eq!(param.get(), 10);
385+
/// param.set(50).unwrap();
386+
/// assert_eq!(param.get(), 50);
387+
/// // Out of range, will return an error
388+
/// assert!(param.set(200).is_err());
389+
/// # Ok::<(), RclrsError>(())
390+
/// ```
391+
pub fn declare_parameter<'a, T: ParameterVariant + 'a>(
392+
&'a self,
393+
name: impl Into<Arc<str>>,
394+
) -> ParameterBuilder<'a, T> {
395+
self._parameter.declare(name.into())
396+
}
397+
398+
/// Enables usage of undeclared parameters for this node.
399+
///
400+
/// Returns a [`Parameters`] struct that can be used to get and set all parameters.
401+
pub fn use_undeclared_parameters(&self) -> Parameters {
402+
self._parameter.allow_undeclared();
403+
Parameters {
404+
interface: &self._parameter,
405+
}
406+
}
407+
363408
/// Creates a [`NodeBuilder`][1] with the given name.
364409
///
365410
/// Convenience function equivalent to [`NodeBuilder::new()`][2].
@@ -384,7 +429,7 @@ impl Node {
384429
// function, which is why it's not merged into Node::call_string_getter().
385430
// This function is unsafe since it's possible to pass in an rcl_node_t with dangling
386431
// pointers etc.
387-
unsafe fn call_string_getter_with_handle(
432+
pub(crate) unsafe fn call_string_getter_with_handle(
388433
rcl_node: &rcl_node_t,
389434
getter: unsafe extern "C" fn(*const rcl_node_t) -> *const c_char,
390435
) -> String {

rclrs/src/node/builder.rs

+7-14
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ use std::ffi::CString;
22
use std::sync::{Arc, Mutex};
33

44
use crate::rcl_bindings::*;
5-
use crate::{
6-
node::call_string_getter_with_handle, resolve_parameter_overrides, Context, Node, RclrsError,
7-
ToResult,
8-
};
5+
use crate::{Context, Node, ParameterInterface, RclrsError, ToResult};
96

107
/// A builder for creating a [`Node`][1].
118
///
@@ -262,24 +259,20 @@ impl NodeBuilder {
262259
.ok()?;
263260
};
264261

265-
let _parameter_map = unsafe {
266-
let fqn = call_string_getter_with_handle(&rcl_node, rcl_node_get_fully_qualified_name);
267-
resolve_parameter_overrides(
268-
&fqn,
269-
&rcl_node_options.arguments,
270-
&rcl_context.global_arguments,
271-
)?
272-
};
273262
let rcl_node_mtx = Arc::new(Mutex::new(rcl_node));
274-
263+
let _parameter = ParameterInterface::new(
264+
&rcl_node_mtx,
265+
&rcl_node_options.arguments,
266+
&rcl_context.global_arguments,
267+
)?;
275268
Ok(Node {
276269
rcl_node_mtx,
277270
rcl_context_mtx: self.context.clone(),
278271
clients_mtx: Mutex::new(vec![]),
279272
guard_conditions_mtx: Mutex::new(vec![]),
280273
services_mtx: Mutex::new(vec![]),
281274
subscriptions_mtx: Mutex::new(vec![]),
282-
_parameter_map,
275+
_parameter,
283276
})
284277
}
285278

0 commit comments

Comments
 (0)