Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(autoware_utils): porting from autoware_universe_utils #23

Merged
merged 20 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
9fa4c0b
feat: PAWF-407 update autoware_utils & rename function in snake format
JianKangEgon Jan 15, 2025
df8e23a
feat: update README for autoware_utils
JianKangEgon Jan 16, 2025
4609190
feat: fix example code compile error
JianKangEgon Jan 16, 2025
e1e65c7
style(pre-commit): autofix
pre-commit-ci[bot] Jan 16, 2025
54be0ce
Merge pull request #1 from JianKangEgon/dev
JianKangEgon Jan 16, 2025
d4fa161
style(pre-commit): autofix
pre-commit-ci[bot] Jan 16, 2025
cc50fc9
feat: add new maintainer contact
JianKangEgon Jan 16, 2025
1aaaac4
feat: update CI build depends
JianKangEgon Jan 16, 2025
2056acc
style(pre-commit): autofix
pre-commit-ci[bot] Jan 16, 2025
a6db35c
feat: fix compile error
JianKangEgon Jan 16, 2025
a646c83
style(pre-commit): autofix
pre-commit-ci[bot] Jan 16, 2025
937c46f
fix: maintainer name
JianKangEgon Jan 17, 2025
a28b3eb
Merge branch 'main' of github.com:JianKangEgon/autoware_utils into main
JianKangEgon Jan 17, 2025
0bea3f7
fix(autoware_utils): duplicate variable name and function name in the…
NorahXiong Jan 17, 2025
eb4f047
fix: spell check error
JianKangEgon Jan 17, 2025
8454d9c
Merge branch 'main' of github.com:JianKangEgon/autoware_utils into main
JianKangEgon Jan 17, 2025
0958b25
style(pre-commit): autofix
pre-commit-ci[bot] Jan 17, 2025
a5d7b60
feat: rename namaspace autoware_utils to autoware::utils
JianKangEgon Jan 22, 2025
483ad63
style(pre-commit): autofix
pre-commit-ci[bot] Jan 22, 2025
c04c422
feat: revert namespace back to autoware_utils, new namespace will be …
JianKangEgon Jan 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/build-and-test-differential.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ jobs:
with:
rosdistro: ${{ matrix.rosdistro }}
target-packages: ${{ steps.get-modified-packages.outputs.modified-packages }}
build-depends-repos: build_depends.repos

- name: Test
id: test
Expand All @@ -65,6 +66,7 @@ jobs:
with:
rosdistro: ${{ matrix.rosdistro }}
target-packages: ${{ steps.get-modified-packages.outputs.modified-packages }}
build-depends-repos: build_depends.repos

- name: Upload coverage to CodeCov
if: ${{ steps.test.outputs.coverage-report-files != '' }}
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/build-and-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ jobs:
with:
rosdistro: ${{ matrix.rosdistro }}
target-packages: ${{ steps.get-self-packages.outputs.self-packages }}
build-depends-repos: build_depends.repos

- name: Test
if: ${{ steps.get-self-packages.outputs.self-packages != '' }}
Expand All @@ -53,6 +54,7 @@ jobs:
with:
rosdistro: ${{ matrix.rosdistro }}
target-packages: ${{ steps.get-self-packages.outputs.self-packages }}
build-depends-repos: build_depends.repos

- name: Upload coverage to CodeCov
if: ${{ steps.test.outputs.coverage-report-files != '' }}
Expand Down
10 changes: 9 additions & 1 deletion autoware_utils/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,16 @@ project(autoware_utils)
find_package(autoware_cmake REQUIRED)
autoware_package()

file(GLOB_RECURSE src_files
src/*.cpp
src/geometry/*.cpp
src/math/*.cpp
src/ros/*.cpp
src/system/*.cpp
)

ament_auto_add_library(autoware_utils SHARED
src/autoware_utils.cpp
${src_files}
)

if(BUILD_TESTING)
Expand Down
303 changes: 291 additions & 12 deletions autoware_utils/README.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,304 @@
# autoware_utils
# autoware_utils Library

Common utilities for Autoware.
## Overview

The **autoware_utils** library is a comprehensive toolkit designed to facilitate the development of autonomous driving applications. This library provides essential utilities for geometry, mathematics, ROS (Robot Operating System) expansions, diagnostics, and more. It is extensively used in the Autoware project to handle common tasks such as geometric calculations, data normalization, message conversions, performance monitoring, and point cloud transformations.

### Design

#### Geometry Module

The geometry module provides classes and functions for handling 2D and 3D points, vectors, polygons, and performing geometric operations:

- **`boost_geometry.hpp`**: Integrates Boost.Geometry for advanced geometric computations, defining point, segment, box, linestring, ring, and polygon types.
- **`alt_geometry.hpp`**: Implements alternative geometric types and operations for 2D vectors and polygons, including vector arithmetic, polygon creation, and various geometric predicates.
- **`ear_clipping.hpp`**: Provides algorithms for triangulating polygons using the ear clipping method.
- **`gjk_2d.hpp`**: Implements the GJK algorithm for fast intersection detection between convex polygons.
- **`sat_2d.hpp`**: Implements the SAT (Separating Axis Theorem) algorithm for detecting intersections between convex polygons.
- **`random_concave_polygon.hpp` and `random_convex_polygon.hpp`**: Generate random concave and convex polygons for testing purposes.
- **`pose_deviation.hpp`**: Calculates deviations between poses in terms of lateral, longitudinal, and yaw angles.
- **`boost_polygon_utils.hpp`**: Utility functions for manipulating polygons, including:
- Checking if a polygon is clockwise.
- Rotating polygons around the origin.
- Converting poses and shapes to polygons.
- Expanding polygons by an offset.
- **`geometry.hpp`**: Comprehensive geometric operations, including:
- Distance calculations between points and segments.
- Curvature computation.
- Pose transformations and interpolations.
- Intersection checks for convex polygons using GJK.
- Conversion between different coordinate systems.

#### Math Module

The math module offers a variety of mathematical utilities:

- **`accumulator.hpp`**: A class for accumulating statistical data, supporting min, max, and mean calculations.
- **`constants.hpp`**: Defines commonly used mathematical constants like π and gravity.
- **`normalization.hpp`**: Functions for normalizing angles and degrees.
- **`range.hpp`**: Functions for generating sequences of numbers (arange, linspace).
- **`trigonometry.hpp`**: Optimized trigonometric functions for faster computation.
- **`unit_conversion.hpp`**: Functions for converting between different units (e.g., degrees to radians, km/h to m/s).

#### ROS Module

The ROS module provides utilities for working with ROS messages and nodes:

- **`debug_publisher.hpp`**: A helper class for publishing debug messages with timestamps.
- **`diagnostics_interface.hpp`**: An interface for publishing diagnostic messages.
- **`logger_level_configure.hpp`**: Utility for configuring logger levels dynamically.
- **`managed_transform_buffer.hpp`**: A managed buffer for handling static and dynamic transforms.
- **`marker_helper.hpp`**: Helper functions for creating and manipulating visualization markers.
- **`msg_covariance.hpp`**: Indices for accessing covariance matrices in ROS messages.
- **`msg_operation.hpp`**: Overloaded operators for quaternion messages.
- **`parameter.hpp`**: Simplifies parameter retrieval and declaration.
- **`polling_subscriber.hpp`**: A subscriber class with different polling policies (latest, newest, all).
- **`processing_time_publisher.hpp`**: Publishes processing times as diagnostic messages.
- **`published_time_publisher.hpp`**: Tracks and publishes the time when messages are published.
- **`self_pose_listener.hpp`**: Listens to the self-pose of the vehicle.
- **`transform_listener.hpp`**: Manages transformation listeners.
- **`update_param.hpp`**: Updates parameters from remote nodes.
- **`uuid_helper.hpp`**: Utilities for generating and managing UUIDs.
- **`wait_for_param.hpp`**: Waits for parameters from remote nodes.
- **`debug_traits.hpp`**: Traits for identifying debug message types.
- **`pcl_conversion.hpp`**: Efficient conversion and transformation of PointCloud2 messages to PCL point clouds.

#### System Module

The system module provides low-level utilities for performance monitoring and error handling:

- **`backtrace.hpp`**: Prints backtraces for debugging.
- **`lru_cache.hpp`**: Implements an LRU (Least Recently Used) cache.
- **`stop_watch.hpp`**: Measures elapsed time for profiling.
- **`time_keeper.hpp`**: Tracks and reports the processing time of various functions.

#### Transform Module

Efficient methods for transforming and manipulating point clouds.

## Usage

To use all features, include `autoware_utils/autoware_utils.hpp`:
### Including Headers

To use the Autoware Utils library in your project, include the necessary headers at the top of your source files:

```cpp
#include "autoware_utils/geometry/boost_geometry.hpp"
#include "autoware_utils/math/accumulator.hpp"
#include "autoware_utils/ros/debug_publisher.hpp"
```

or you can include `autoware_utils/autoware_utils.hpp` for all features:

```cpp
#include "autoware_utils/autoware_utils.hpp"
```

### Example Code Snippets

#### Using Vector2d from alt_geometry.hpp

```cpp
#include "autoware_utils/geometry/alt_geometry.hpp"

using namespace autoware_utils::alt;

int main() {
Vector2d vec1(3.0, 4.0);
Vector2d vec2(1.0, 2.0);

// Compute the dot product
double dot_product = vec1.dot(vec2);

// Compute the norm
double norm = vec1.norm();

return 0;
}
```

#### Using Accumulator from accumulator.hpp

```cpp
#include <autoware_utils/autoware_utils.hpp>
#include "autoware_utils/math/accumulator.hpp"

int main() {
autoware_utils::Accumulator<double> acc;

using autoware_utils::deg2rad;
using autoware_utils::normalize_degree;
using autoware_utils::pi;
acc.add(1.0);
acc.add(2.0);
acc.add(3.0);

std::cout << "Mean: " << acc.mean() << "\n";
std::cout << "Min: " << acc.min() << "\n";
std::cout << "Max: " << acc.max() << "\n";
std::cout << "Count: " << acc.count() << "\n";

return 0;
}
```

To select features, include necessary header files:
### Detailed Usage Examples

#### Transform Point Clouds with ManagedTransformBuffer

```cpp
#include <autoware_utils/math/constants.hpp>
#include <autoware_utils/math/normalization.hpp>
#include "autoware_utils/ros/managed_transform_buffer.hpp"
#include "sensor_msgs/msg/point_cloud2.hpp"
#include <rclcpp/rclcpp.hpp>

int main(int argc, char * argv[]) {
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("transform_node");

// Initialize ManagedTransformBuffer
autoware_utils::ManagedTransformBuffer transform_buffer(node, false);

// Load point cloud data
sensor_msgs::msg::PointCloud2 cloud_in; // Assume this is populated with data
sensor_msgs::msg::PointCloud2 cloud_out;

// Transform point cloud from "base_link" to "map" frame
if (transform_buffer.transform_pointcloud("map", cloud_in, cloud_out)) {
RCLCPP_INFO(node->get_logger(), "Point cloud transformed successfully.");
} else {
RCLCPP_ERROR(node->get_logger(), "Failed to transform point cloud.");
}

rclcpp::shutdown();
return 0;
}
```

#### Update Parameters Dynamically with update_param.hpp

```cpp
#include "autoware_utils/ros/update_param.hpp"
#include <rclcpp/rclcpp.hpp>

int main(int argc, char * argv[]) {
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("param_node");

double param_value = 0.0;
std::vector<rclcpp::Parameter> params = node->get_parameters({"my_param"});

if (autoware_utils::update_param(params, "my_param", param_value)) {
RCLCPP_INFO(node->get_logger(), "Updated parameter value: %f", param_value);
} else {
RCLCPP_WARN(node->get_logger(), "Parameter 'my_param' not found.");
}

rclcpp::shutdown();
return 0;
}
```

#### Logging Processing Times with ProcessingTimePublisher

```cpp
#include "autoware_utils/ros/processing_time_publisher.hpp"
#include <rclcpp/rclcpp.hpp>
#include <map>

int main(int argc, char * argv[]) {
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("processing_time_node");

// Initialize ProcessingTimePublisher
autoware_utils::ProcessingTimePublisher processing_time_pub(node.get(), "~/debug/processing_time_ms");

// Simulate some processing times
std::map<std::string, double> processing_times = {
{"node1", 0.1}, {"node2", 0.2}, {"node3", 0.3}
};

// Publish processing times
processing_time_pub.publish(processing_times);

rclcpp::shutdown();
return 0;
}
```

#### Manipulating Polygons with boost_polygon_utils.hpp

```cpp
#include "autoware_utils/geometry/boost_polygon_utils.hpp"
#include "autoware_utils/geometry/boost_geometry.hpp"
#include <rclcpp/rclcpp.hpp>

int main(int argc, char * argv[]) {
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("polygon_node");

// Create a polygon
autoware_utils::Polygon2d polygon;
// Assume polygon is populated with points

// Rotate the polygon by 90 degrees
autoware_utils::Polygon2d rotated_polygon = autoware_utils::rotate_polygon(polygon, M_PI / 2);

// Expand the polygon by an offset
autoware_utils::Polygon2d expanded_polygon = autoware_utils::expand_polygon(polygon, 1.0);

// Check if the polygon is clockwise
bool is_clockwise = autoware_utils::is_clockwise(polygon);

rclcpp::shutdown();
return 0;
}
```

#### Efficient Point Cloud Conversion with pcl_conversion.hpp

```cpp
#include "autoware_utils/ros/pcl_conversion.hpp"
#include "sensor_msgs/msg/point_cloud2.hpp"
#include <pcl/point_types.h>
#include <pcl/PCLPointCloud2.h>
#include <Eigen/Core>
#include <rclcpp/rclcpp.hpp>

int main(int argc, char * argv[]) {
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("pcl_conversion_node");

// Load point cloud data
sensor_msgs::msg::PointCloud2 cloud_in; // Assume this is populated with data
pcl::PointCloud<pcl::PointXYZ> pcl_cloud;

// Define transformation matrix
Eigen::Matrix4f transform = Eigen::Matrix4f::Identity();
// Populate transform matrix with actual values

// Convert and transform point cloud
autoware_utils::transform_point_cloud_from_ros_msg(cloud_in, pcl_cloud, transform);

rclcpp::shutdown();
return 0;
}
```

#### Handling Debug Message Types with debug_traits.hpp

```cpp
#include "autoware_utils/ros/debug_publisher.hpp"
#include "autoware_utils/ros/debug_traits.hpp"
#include <rclcpp/rclcpp.hpp>

int main(int argc, char * argv[]) {
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("debug_node");

// Initialize DebugPublisher
autoware_utils::DebugPublisher debug_pub(node, "/debug");

// Publish a debug message with custom type
float debug_data = 42.0;
debug_pub.publish<autoware_internal_debug_msgs::msg::Float32Stamped>("example", debug_data);

using autoware_utils::normalize_degree;
using autoware_utils::pi;
rclcpp::shutdown();
return 0;
}
```
Loading
Loading