Skip to content

Commit caceb40

Browse files
committed
templatize node and add merger for tracked objects
Signed-off-by: a-maumau <[email protected]>
1 parent 41bd3fa commit caceb40

File tree

11 files changed

+584
-157
lines changed

11 files changed

+584
-157
lines changed

perception/autoware_simple_object_merger/CMakeLists.txt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,25 @@ project(autoware_simple_object_merger)
55
find_package(autoware_cmake REQUIRED)
66
autoware_package()
77

8+
include_directories(
9+
include
10+
)
11+
812
# Targets
913
ament_auto_add_library(${PROJECT_NAME} SHARED
10-
src/simple_object_merger_node.cpp
14+
src/simple_object_merger_base.cpp
15+
src/detected_object_simple_merger/node.cpp
16+
src/tracked_object_simple_merger/node.cpp
17+
)
18+
19+
rclcpp_components_register_node(${PROJECT_NAME}
20+
PLUGIN "autoware::simple_object_merger::DetectedObjectSimpleMergerNode"
21+
EXECUTABLE detected_object_simple_merger_node
1122
)
1223

1324
rclcpp_components_register_node(${PROJECT_NAME}
14-
PLUGIN "autoware::simple_object_merger::SimpleObjectMergerNode"
15-
EXECUTABLE simple_object_merger_node
25+
PLUGIN "autoware::simple_object_merger::TrackedObjectSimpleMergerNode"
26+
EXECUTABLE tracked_object_simple_merger_node
1627
)
1728

1829
# Tests
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/**:
2+
ros__parameters:
3+
update_rate_hz: 20.0
4+
new_frame_id: "map"
5+
timeout_threshold: 1.0
6+
input_topics: [""]
7+
uuid_mapping_cleanup_threshold: 30.0 # in sec.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright 2025 TIER IV, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#ifndef AUTOWARE__SIMPLE_OBJECT_MERGER__DETECTED_OBJECT_SIMPLE_MERGER__NODE_HPP_
16+
#define AUTOWARE__SIMPLE_OBJECT_MERGER__DETECTED_OBJECT_SIMPLE_MERGER__NODE_HPP_
17+
18+
#include "autoware/simple_object_merger/simple_object_merger_base.hpp"
19+
#include "autoware_utils/ros/transform_listener.hpp"
20+
#include "rclcpp/rclcpp.hpp"
21+
22+
#include "autoware_perception_msgs/msg/detected_objects.hpp"
23+
24+
namespace autoware::simple_object_merger
25+
{
26+
using autoware_perception_msgs::msg::DetectedObjects;
27+
28+
class DetectedObjectSimpleMergerNode
29+
: public SimpleObjectMergerBase<autoware_perception_msgs::msg::DetectedObjects>
30+
{
31+
public:
32+
explicit DetectedObjectSimpleMergerNode(const rclcpp::NodeOptions & node_options);
33+
34+
private:
35+
void approximateMerger(
36+
const DetectedObjects::ConstSharedPtr & object_msg0,
37+
const DetectedObjects::ConstSharedPtr & object_msg1) override;
38+
39+
void onTimer();
40+
};
41+
42+
} // namespace autoware::simple_object_merger
43+
44+
#endif // AUTOWARE__SIMPLE_OBJECT_MERGER__DETECTED_OBJECT_SIMPLE_MERGER__NODE_HPP_
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2023 TIER IV, Inc.
1+
// Copyright 2025 TIER IV, Inc.
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -12,14 +12,12 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#ifndef SIMPLE_OBJECT_MERGER_NODE_HPP_
16-
#define SIMPLE_OBJECT_MERGER_NODE_HPP_
15+
#ifndef AUTOWARE__SIMPLE_OBJECT_MERGER__SIMPLE_OBJECT_MERGER_BASE_HPP_
16+
#define AUTOWARE__SIMPLE_OBJECT_MERGER__SIMPLE_OBJECT_MERGER_BASE_HPP_
1717

1818
#include "autoware_utils/ros/transform_listener.hpp"
1919
#include "rclcpp/rclcpp.hpp"
2020

21-
#include "autoware_perception_msgs/msg/detected_objects.hpp"
22-
2321
#include <message_filters/subscriber.h>
2422
#include <message_filters/sync_policies/approximate_time.h>
2523
#include <message_filters/synchronizer.h>
@@ -31,13 +29,13 @@
3129

3230
namespace autoware::simple_object_merger
3331
{
34-
using autoware_perception_msgs::msg::DetectedObject;
35-
using autoware_perception_msgs::msg::DetectedObjects;
3632

37-
class SimpleObjectMergerNode : public rclcpp::Node
33+
template <class ObjsMsgType>
34+
class SimpleObjectMergerBase : public rclcpp::Node
3835
{
3936
public:
40-
explicit SimpleObjectMergerNode(const rclcpp::NodeOptions & node_options);
37+
explicit SimpleObjectMergerBase(
38+
const std::string & node_name, const rclcpp::NodeOptions & node_options);
4139

4240
struct NodeParam
4341
{
@@ -49,52 +47,60 @@ class SimpleObjectMergerNode : public rclcpp::Node
4947

5048
private:
5149
// Subscriber
52-
rclcpp::Subscription<DetectedObjects>::SharedPtr sub_objects_{};
53-
std::vector<rclcpp::Subscription<DetectedObjects>::SharedPtr> sub_objects_array{};
54-
std::shared_ptr<autoware_utils::TransformListener> transform_listener_;
50+
typename rclcpp::Subscription<ObjsMsgType>::SharedPtr sub_objects_{};
51+
std::vector<typename rclcpp::Subscription<ObjsMsgType>::SharedPtr> sub_objects_array{};
5552

5653
// Subscriber by message_filter
57-
message_filters::Subscriber<DetectedObjects> input0_{};
58-
message_filters::Subscriber<DetectedObjects> input1_{};
59-
using SyncPolicy =
60-
message_filters::sync_policies::ApproximateTime<DetectedObjects, DetectedObjects>;
54+
typename message_filters::Subscriber<ObjsMsgType> input0_{};
55+
typename message_filters::Subscriber<ObjsMsgType> input1_{};
56+
using SyncPolicy = message_filters::sync_policies::ApproximateTime<ObjsMsgType, ObjsMsgType>;
6157
using Sync = message_filters::Synchronizer<SyncPolicy>;
6258
typename std::shared_ptr<Sync> sync_ptr_;
6359

64-
// Process callbacks
65-
void approximateMerger(
66-
const DetectedObjects::ConstSharedPtr & object_msg0,
67-
const DetectedObjects::ConstSharedPtr & object_msg1);
68-
69-
void onData(const DetectedObjects::ConstSharedPtr msg, size_t array_number);
70-
71-
// Data Buffer
72-
std::vector<DetectedObjects::ConstSharedPtr> objects_data_{};
73-
geometry_msgs::msg::TransformStamped::ConstSharedPtr transform_;
74-
75-
// Publisher
76-
rclcpp::Publisher<DetectedObjects>::SharedPtr pub_objects_{};
77-
7860
// Timer
7961
rclcpp::TimerBase::SharedPtr timer_{};
80-
void onTimer();
81-
bool isDataReady();
82-
bool shouldLogThrottle(
83-
size_t index, const rclcpp::Time & now, std::vector<rclcpp::Time> & last_log_times,
84-
double throttle_interval_sec);
8562

8663
// Parameter Server
8764
OnSetParametersCallbackHandle::SharedPtr set_param_res_;
65+
66+
// Process callbacks
67+
virtual void approximateMerger(
68+
const typename ObjsMsgType::ConstSharedPtr & object_msg0,
69+
const typename ObjsMsgType::ConstSharedPtr & object_msg1);
70+
71+
virtual void onTimer();
72+
73+
void onData(const typename ObjsMsgType::ConstSharedPtr msg, size_t array_number);
74+
8875
rcl_interfaces::msg::SetParametersResult onSetParam(
8976
const std::vector<rclcpp::Parameter> & params);
9077

78+
protected:
79+
// Publisher
80+
typename rclcpp::Publisher<ObjsMsgType>::SharedPtr pub_objects_{};
81+
82+
std::shared_ptr<autoware_utils::TransformListener> transform_listener_;
83+
geometry_msgs::msg::TransformStamped::ConstSharedPtr transform_;
84+
85+
// Data Buffer
86+
std::vector<typename ObjsMsgType::ConstSharedPtr> objects_data_{};
87+
88+
// Core
89+
size_t input_topic_size_;
90+
9191
// Parameter
9292
NodeParam node_param_{};
9393

94-
// Core
95-
size_t input_topic_size;
94+
bool isDataReady();
95+
bool shouldLogThrottle(
96+
size_t index, const rclcpp::Time & now, std::vector<rclcpp::Time> & last_log_times,
97+
double throttle_interval_sec);
98+
99+
typename ObjsMsgType::SharedPtr getTransformedObjects(
100+
typename ObjsMsgType::ConstSharedPtr objects, const std::string & target_frame_id,
101+
geometry_msgs::msg::TransformStamped::ConstSharedPtr transform);
96102
};
97103

98104
} // namespace autoware::simple_object_merger
99105

100-
#endif // SIMPLE_OBJECT_MERGER_NODE_HPP_
106+
#endif // AUTOWARE__SIMPLE_OBJECT_MERGER__SIMPLE_OBJECT_MERGER_BASE_HPP_
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright 2025 TIER IV, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#ifndef AUTOWARE__SIMPLE_OBJECT_MERGER__TRACKED_OBJECT_SIMPLE_MERGER__NODE_HPP_
16+
#define AUTOWARE__SIMPLE_OBJECT_MERGER__TRACKED_OBJECT_SIMPLE_MERGER__NODE_HPP_
17+
18+
#include "autoware/simple_object_merger/simple_object_merger_base.hpp"
19+
#include "autoware_utils/ros/transform_listener.hpp"
20+
#include "rclcpp/rclcpp.hpp"
21+
22+
#include "autoware_perception_msgs/msg/tracked_objects.hpp"
23+
#include <unique_identifier_msgs/msg/uuid.hpp>
24+
25+
#include <string>
26+
#include <unordered_map>
27+
28+
namespace autoware::simple_object_merger
29+
{
30+
using autoware_perception_msgs::msg::TrackedObject;
31+
using autoware_perception_msgs::msg::TrackedObjects;
32+
33+
struct UUIDMapping
34+
{
35+
int pass_through_node_id = -1;
36+
std::unordered_map<int, unique_identifier_msgs::msg::UUID> replace_map;
37+
rclcpp::Time last_seen;
38+
bool is_mapped_uuid = false;
39+
};
40+
41+
class TrackedObjectSimpleMergerNode
42+
: public SimpleObjectMergerBase<autoware_perception_msgs::msg::TrackedObjects>
43+
{
44+
public:
45+
explicit TrackedObjectSimpleMergerNode(const rclcpp::NodeOptions & node_options);
46+
47+
private:
48+
rclcpp::Duration uuid_mapping_cleanup_threshold_ = rclcpp::Duration::from_seconds(30.0);
49+
std::unordered_map<std::string, UUIDMapping> uuid_mapper_;
50+
51+
void approximateMerger(
52+
const TrackedObjects::ConstSharedPtr & object_msg0,
53+
const TrackedObjects::ConstSharedPtr & object_msg1) override;
54+
void onTimer();
55+
56+
void mapUUID(TrackedObject & object, const int & node_id);
57+
void cleanupUUIDMap();
58+
};
59+
60+
} // namespace autoware::simple_object_merger
61+
62+
#endif // AUTOWARE__SIMPLE_OBJECT_MERGER__TRACKED_OBJECT_SIMPLE_MERGER__NODE_HPP_
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<launch>
2+
<arg name="output/objects" default="~/output/objects"/>
3+
<arg name="param_path" default="$(find-pkg-share autoware_simple_object_merger)/config/detected_object_simple_merger.param.yaml"/>
4+
5+
<node pkg="autoware_simple_object_merger" exec="detected_object_simple_merger_node" name="detected_object_simple_merger" output="screen">
6+
<remap from="~/output/objects" to="$(var output/objects)"/>
7+
<param from="$(var param_path)"/>
8+
</node>
9+
</launch>

perception/autoware_simple_object_merger/launch/simple_object_merger.launch.xml renamed to perception/autoware_simple_object_merger/launch/tracked_object_simple_merger.launch.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<launch>
22
<arg name="output/objects" default="~/output/objects"/>
3-
<arg name="param_path" default="$(find-pkg-share autoware_simple_object_merger)/config/simple_object_merger.param.yaml"/>
3+
<arg name="param_path" default="$(find-pkg-share autoware_simple_object_merger)/config/tracked_object_simple_merger.param.yaml"/>
44

5-
<node pkg="autoware_simple_object_merger" exec="simple_object_merger_node" name="simple_object_merger" output="screen">
5+
<node pkg="autoware_simple_object_merger" exec="tracked_object_simple_merger_node" name="tracked_object_simple_merger" output="screen">
66
<remap from="~/output/objects" to="$(var output/objects)"/>
77
<param from="$(var param_path)"/>
88
</node>

0 commit comments

Comments
 (0)