All notable changes to this project will be documented in this file.
Steps:
- Starting on master
- Edit change log
- Revise the version numbers in Cargo.toml files
- Commit the changes
- Release packages in order:
- roslibrust_common
- roslibrust_codegen
- roslibrust_codegen_macro
- roslibrust_mock
- roslibrust_ros1
- roslibrust_rosbridge
- roslibrust_zenoh
- roslibrust
- Push to master
- Tag and push tag
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- A new
Ros
trait has been added that all backends implement. This trait behaves like a typical ROS1 node handle, and is easier to work with in generics than directly using TopicProvider or ServiceProvider.
- roslibrust_serde_rosmsg verison updated resulting in a significant performance boost on serializing large messages. 95% gains measured on 1080p color image serialization. 25% gains measured on roundtrip image benchmarks with ros1 backend.
- roslibrust_mock now provides a basic mock implementation of roslibrust's generic traits for use in building automated testing of nodes.
- roslibrust_zenoh now proivides a Zenoh client that is compatible with the zenoh-ros1-plugin / zenoh-ros1-bridge
- roslibrust_ros1 now provides a ROS1 native client as a standalone crate
- roslibrust_rosbridge now provides a rosbridge client as a standalone crate
- roslibrust_rosapi now provides a generic interface for the rosapi node compatible with both rosbridge and ros1 backends
- Keeping a ros1::ServiceServer alive no longer keeps the underlying node alive past the last ros1::NodeHandle being dropped.
- Dropping the last ros1::NodeHandle results in the node cleaning up any advertises, subscriptions, and services with the ROS master.
- Generated code now includes various lint attributes to suppress warnings.
- TCPROS header parsing now ignores (the undocumented fields) response_type and request_type and doesn't produce warnings on them.
- ROS1 native service servers now respect the "persistent" header field, and automatically close the underlying TCP socket after a single request unless persistent is set to 1 in the connection header.
- A major reorganization of the internals of roslibrust was done to improve our ability to support multiple backends.
As part of the organization the rosbridge backend has been moved under the the
rosbridge
module, soroslibrust::ClientHandle
now becomesroslibrust::rosbridge::ClientHandle
. - Internal integral type Time changed from u32 to i32 representation to better align with ROS1
- Conversions between ROS Time and Duration to std::time::Time and std::time::Duration switched to TryFrom as they can be fallible.
- Main crate Error type has been simplified to leak fewer internal types.
- roslibrust_codegen is now intended to be accessed by users via the
codegen
feature flag on roslibrust. - roslibrust_codegen_macro is now intended to be accessed by users via the
macro
feature flag on roslibrust. - Code generated by roslibrust_codegen now depends on
roslibrust
with thecodegen
feature flag being available to it.
- ROS1 Native Publishers no longer occasionally truncate very large messages when configured with latching
- Passing of large messages containing uint8[] arrays is now substantially faster
- Generated code now relies on serde_bytes to enable faster handling of uint8[] arrays
- Switched to a fork of serde_rosmsg to enable faster handling of uint8[] arrays
- ROS1 Native Publishers now support latching behavior
- The XML RPC client for interacting directly with the rosmaster server has been exposed as a public API
- Experimental: Initial support for writing generic clients that can be compile time specialized for rosbridge or ros1
- Can subscribe to any topic and get raw bytes instead of a deserialized message of known type
- Can publish to any topic and send raw bytes instead of a deserialized message
- ROS1 Native Publishers correctly call unadvertise when dropped
- ROS1 Native Publishers no longer occasionally truncate very large messages (>5MB)
- ROS1 Node Handle's advertise() now requires a latching argument
- RosBridge ClientHandle [call_service()] is now templated on the service type instead of on both the request and response type. This is to bring it in line with the ROS1 API.
- RosBridge ClientHandle::Publisher publish() now takes a reference to the message instead of taking ownership. This is to bring it in line with the ROS1 API.
- The RosServiceType trait used by codegen now requires 'static + Send + Sync this will not affect any generated types, but custom types may have issue.
- Bug with message_definitions provided by Publisher in the connection header not being the fully expanded definition.
- Bug with ROS1 native subscribers not being able to receive messages larger than 4096 bytes.
- Bug with ros1 native publishers not parsing connection headers correctly
- ROS1 native service servers and service clients are now supported (experimental feature)
- The reconnection logic for rosbridge clients was fundamentally broken and failing to reconnect. This has been fixed.
- Generic subscriptions coming from rospy that specified "*" as the md5sum were not properly handled. This has been fixed.
- Code generated by roslibrust_codegen now depends only on libraries exposed by roslibrust_codegen. This means that crates that were previously adding dependencies on serde, serde-big-array, and smart-default will no longer need to do so.
- A significant reworking of the error types in the ROS1 native client was performed to move away from the
Box<dyn Error + Send + Sync>
pattern and instead use theanyhow
crate.
- The build.rs example in example_package now correctly informs cargo of filesystem dependencies
- The
advertise_service
method inrosbridge/client.rs
now accepts closures - Expose additional methods useful for custom cases not using package manifests or standard ROS2 setups
- Messages containing fixed sized arrays now successfully serialize and deserialize when using ROS1 native communication
- The function interface for top level generation functions in
roslibrust_codegen
have been changed to include the list of dependent filesystem paths that should trigger re-running code generation. Note: new files added to the search paths will not be automatically detected. - [Breaking Change] Codegen now generates fixed sized arrays as arrays [T; N] instead of Vec
- Removed
find_and_generate_ros_messages_relative_to_manifest_dir!
this proc_macro was changing the current working directory of the compilation job resulting in a variety of strange compilation behaviors. Build.rs scripts are recommended for use cases requiring fine grained control of message generation. - The function interface for top level generation functions in
roslibrust_codegen
have been changed to include the list of dependent filesystem paths that should trigger re-running code generation. Note: new files added to the search paths will not be automatically detected. - Refactor the
ros1::node
module into separate smaller pieces. This should be invisible externally (and no changes to examples were required).
- Experimental support for ROS1 native communication behind the
ros1
feature flag - Generation of C++ source added via
roslibrust_genmsg
along with arbitrary languages via passed in templates - Generation of Rust source for actions
- Example for custom generic message usage with rosbridge
- Example for async native ROS1 listener
- Example for async native ROS1 publisher
- Incorrect handling of ROS1 message string constants
crawl
function inroslibrust_codegen
updated to a more flexible API- Overhaul of error handling in roslibrust_codegen to bubble errors up, and remove use of panic! and unwrap(). Significantly better error messages should be produced from proc_macros and build.rs files. Direct usages of the API will need to be updated to handle the returned error type.
- RosMessageType trait now has associated constants for MD5SUM and DEFINITION to enable ROS1 native support. These constants are optional at this time with a default value of "" provided.
- Support for default field values in ROS2 messages
- Added public APIs for getting message data from search and for generating Rust code given message data in roslibrust_codegen
- More useful logs available when running codegen
- Refactor some of the public APIs and types in roslibrust_codegen (concept of
ParsedMessageFile
vsMessageFile
) - Added a method
get_md5sum
toMessageFile
- Additional code generation API and macro which excludes
ROS_PACKAGE_PATH
- Bug causing single quoted string constants in message files to not be parsed correctly
- Bug causing float constants in message files to cause compiler errors because
f32 = 0;
is not allowed in rust - Bug where packages were not properly de-duplicated during discovery.
advertise_service
andsubscribe
methods on ClientHandle were changed from needing&mut self
to&self
- Initial support for ROS2 message generation
- Initial integration testing for ROS2 all basic functionality covered
- CI testing for Humble
- The generated
char
type within rust is now u8. - Package names are now determined by the
name
tag within package.xml instead of by directory name
- No longer generate empty
impl
blocks from message structs that have not associated constants - Significant improvement to documentation with expanded examples
advertise_service
no longer panics if multiple advertise attempts made to same topic
Fix to docs.rs build.
- Service server example
Client
is nowClientHandle
- All identifiers in generated code are now escaped with
r#
advertise_service
now returns aServiceHandle
which controls the lifetime of the service
- Fixed issue where the spin and reconnect context would never drop even if there were no more
ClientHandle
s - Fixed parsing issue with triple dashes in comments of service files
- Fixed bug in generation where message properties or constants had names conflicting with Rust reserved keywords
Yanked version due to failed publish
Yanked version due to failed publish
- Support for service servers
- Into<> helpers for Time and Duration for tokio and std
- Failure in message generation caused by files without extensions
- Failure in message generation caused by failing to quote around string constants
- Failure in message generation caused by bad design of integral types TimeI and DurationI
Initial public release