Skip to content

Commit e018772

Browse files
authored
fix(radar_tracks_msg_converter): fix twist conversion (autowarefoundation#3963)
* fix(radar_tracks_msg_converter): fix twist conversion Signed-off-by: scepter914 <scepter914@gmail.com> * update README Signed-off-by: scepter914 <scepter914@gmail.com> * fix typo Signed-off-by: scepter914 <scepter914@gmail.com> * fix orientation_availability Signed-off-by: scepter914 <scepter914@gmail.com> --------- Signed-off-by: scepter914 <scepter914@gmail.com>
1 parent 0136613 commit e018772

File tree

3 files changed

+39
-93
lines changed

3 files changed

+39
-93
lines changed

perception/radar_tracks_msgs_converter/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ This package convert from [radar_msgs/msg/RadarTracks](https://github.com/ros-pe
1313
- `~/input/radar_objects` (radar_msgs/msg/RadarTracks.msg): Input radar topic
1414
- `~/input/odometry` (nav_msgs/msg/Odometry.msg): Ego vehicle odometry topic
1515
- Output
16-
- `~/output/radar_detected_objects` (autoware_auto_perception_msgs/msg/DetectedObject.idl): The topic converted to Autoware's message
17-
- `~/output/radar_tracked_objects` (autoware_auto_perception_msgs/msg/TrackedObject.idl): The topic converted to Autoware's message
16+
- `~/output/radar_detected_objects` (autoware_auto_perception_msgs/msg/DetectedObject.idl): The topic converted to Autoware's message. This is used for radar sensor fusion detection and radar detection.
17+
- `~/output/radar_tracked_objects` (autoware_auto_perception_msgs/msg/TrackedObject.idl): The topic converted to Autoware's message. This is used for tracking layer sensor fusion.
1818

1919
### Parameters
2020

perception/radar_tracks_msgs_converter/include/radar_tracks_msgs_converter/radar_tracks_msgs_converter_node.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class RadarTracksMsgsConverterNode : public rclcpp::Node
9393
// Core
9494
geometry_msgs::msg::PoseWithCovariance convertPoseWithCovariance();
9595
TrackedObjects convertRadarTrackToTrackedObjects();
96-
DetectedObjects convertRadarTrackToDetectedObjects();
96+
DetectedObjects convertTrackedObjectsToDetectedObjects(TrackedObjects & objects);
9797
uint8_t convertClassification(const uint16_t classification);
9898
};
9999

perception/radar_tracks_msgs_converter/src/radar_tracks_msgs_converter_node/radar_tracks_msgs_converter_node.cpp

+36-90
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
#include "radar_tracks_msgs_converter/radar_tracks_msgs_converter_node.hpp"
1616

17+
#include "tier4_autoware_utils/tier4_autoware_utils.hpp"
18+
1719
#include <tf2/utils.h>
1820

1921
#ifdef ROS_DISTRO_GALACTIC
@@ -153,94 +155,36 @@ void RadarTracksMsgsConverterNode::onTimer()
153155
node_param_.new_frame_id, header.frame_id, header.stamp, rclcpp::Duration::from_seconds(0.01));
154156

155157
TrackedObjects tracked_objects = convertRadarTrackToTrackedObjects();
156-
DetectedObjects detected_objects = convertRadarTrackToDetectedObjects();
158+
DetectedObjects detected_objects = convertTrackedObjectsToDetectedObjects(tracked_objects);
157159
if (!tracked_objects.objects.empty()) {
158160
pub_tracked_objects_->publish(tracked_objects);
159161
pub_detected_objects_->publish(detected_objects);
160162
}
161163
}
162164

163-
DetectedObjects RadarTracksMsgsConverterNode::convertRadarTrackToDetectedObjects()
165+
DetectedObjects RadarTracksMsgsConverterNode::convertTrackedObjectsToDetectedObjects(
166+
TrackedObjects & objects)
164167
{
165168
DetectedObjects detected_objects;
166-
detected_objects.header = radar_data_->header;
167-
detected_objects.header.frame_id = node_param_.new_frame_id;
168-
using POSE_IDX = tier4_autoware_utils::xyzrpy_covariance_index::XYZRPY_COV_IDX;
169-
using RADAR_IDX = tier4_autoware_utils::xyz_upper_covariance_index::XYZ_UPPER_COV_IDX;
169+
detected_objects.header = objects.header;
170170

171-
for (auto & radar_track : radar_data_->tracks) {
171+
for (auto & object : objects.objects) {
172172
DetectedObject detected_object;
173-
174173
detected_object.existence_probability = 1.0;
174+
detected_object.shape = object.shape;
175175

176-
detected_object.shape.type = Shape::BOUNDING_BOX;
177-
detected_object.shape.dimensions = radar_track.size;
178-
179-
// kinematics
176+
// kinematics setting
180177
DetectedObjectKinematics kinematics;
178+
kinematics.orientation_availability =
179+
autoware_auto_perception_msgs::msg::DetectedObjectKinematics::SIGN_UNKNOWN;
181180
kinematics.has_twist = true;
182181
kinematics.has_twist_covariance = true;
183-
184-
// convert by tf
185-
geometry_msgs::msg::PoseStamped radar_pose_stamped{};
186-
radar_pose_stamped.pose.position = radar_track.position;
187-
geometry_msgs::msg::PoseStamped transformed_pose_stamped{};
188-
tf2::doTransform(radar_pose_stamped, transformed_pose_stamped, *transform_);
189-
kinematics.pose_with_covariance.pose = transformed_pose_stamped.pose;
190-
191-
{
192-
auto & pose_cov = kinematics.pose_with_covariance.covariance;
193-
auto & radar_position_cov = radar_track.position_covariance;
194-
pose_cov[POSE_IDX::X_X] = radar_position_cov[RADAR_IDX::X_X];
195-
pose_cov[POSE_IDX::X_Y] = radar_position_cov[RADAR_IDX::X_Y];
196-
pose_cov[POSE_IDX::X_Z] = radar_position_cov[RADAR_IDX::X_Z];
197-
pose_cov[POSE_IDX::Y_X] = radar_position_cov[RADAR_IDX::X_Y];
198-
pose_cov[POSE_IDX::Y_Y] = radar_position_cov[RADAR_IDX::Y_Y];
199-
pose_cov[POSE_IDX::Y_Z] = radar_position_cov[RADAR_IDX::Y_Z];
200-
pose_cov[POSE_IDX::Z_X] = radar_position_cov[RADAR_IDX::X_Z];
201-
pose_cov[POSE_IDX::Z_Y] = radar_position_cov[RADAR_IDX::Y_Z];
202-
pose_cov[POSE_IDX::Z_Z] = radar_position_cov[RADAR_IDX::Z_Z];
203-
}
204-
205-
// convert by tf
206-
geometry_msgs::msg::Vector3Stamped radar_velocity_stamped{};
207-
radar_velocity_stamped.vector = radar_track.velocity;
208-
geometry_msgs::msg::Vector3Stamped transformed_vector3_stamped{};
209-
tf2::doTransform(radar_velocity_stamped, transformed_vector3_stamped, *transform_);
210-
kinematics.twist_with_covariance.twist.linear = transformed_vector3_stamped.vector;
211-
212-
// twist compensation
213-
if (node_param_.use_twist_compensation) {
214-
if (odometry_data_) {
215-
kinematics.twist_with_covariance.twist.linear.x += odometry_data_->twist.twist.linear.x;
216-
kinematics.twist_with_covariance.twist.linear.y += odometry_data_->twist.twist.linear.y;
217-
kinematics.twist_with_covariance.twist.linear.z += odometry_data_->twist.twist.linear.z;
218-
} else {
219-
RCLCPP_INFO(get_logger(), "Odometry data is not coming");
220-
}
221-
}
222-
223-
{
224-
auto & twist_cov = kinematics.twist_with_covariance.covariance;
225-
auto & radar_vel_cov = radar_track.velocity_covariance;
226-
twist_cov[POSE_IDX::X_X] = radar_vel_cov[RADAR_IDX::X_X];
227-
twist_cov[POSE_IDX::X_Y] = radar_vel_cov[RADAR_IDX::X_Y];
228-
twist_cov[POSE_IDX::X_Z] = radar_vel_cov[RADAR_IDX::X_Z];
229-
twist_cov[POSE_IDX::Y_X] = radar_vel_cov[RADAR_IDX::X_Y];
230-
twist_cov[POSE_IDX::Y_Y] = radar_vel_cov[RADAR_IDX::Y_Y];
231-
twist_cov[POSE_IDX::Y_Z] = radar_vel_cov[RADAR_IDX::Y_Z];
232-
twist_cov[POSE_IDX::Z_X] = radar_vel_cov[RADAR_IDX::X_Z];
233-
twist_cov[POSE_IDX::Z_Y] = radar_vel_cov[RADAR_IDX::Y_Z];
234-
twist_cov[POSE_IDX::Z_Z] = radar_vel_cov[RADAR_IDX::Z_Z];
235-
}
182+
kinematics.twist_with_covariance = object.kinematics.twist_with_covariance;
183+
kinematics.pose_with_covariance = object.kinematics.pose_with_covariance;
236184
detected_object.kinematics = kinematics;
237185

238186
// classification
239-
ObjectClassification classification;
240-
classification.probability = 1.0;
241-
classification.label = convertClassification(radar_track.classification);
242-
detected_object.classification.emplace_back(classification);
243-
187+
detected_object.classification = object.classification;
244188
detected_objects.objects.emplace_back(detected_object);
245189
}
246190
return detected_objects;
@@ -263,14 +207,34 @@ TrackedObjects RadarTracksMsgsConverterNode::convertRadarTrackToTrackedObjects()
263207
tracked_object.shape.type = Shape::BOUNDING_BOX;
264208
tracked_object.shape.dimensions = radar_track.size;
265209

266-
// kinematics
210+
// kinematics setting
267211
TrackedObjectKinematics kinematics;
268212
kinematics.orientation_availability = TrackedObjectKinematics::AVAILABLE;
269213
kinematics.is_stationary = false;
270214

271-
// convert by tf
215+
// Twist conversion
216+
geometry_msgs::msg::Vector3 compensated_velocity = radar_track.velocity;
217+
if (node_param_.use_twist_compensation) {
218+
if (odometry_data_) {
219+
compensated_velocity.x += odometry_data_->twist.twist.linear.x;
220+
compensated_velocity.y += odometry_data_->twist.twist.linear.y;
221+
compensated_velocity.z += odometry_data_->twist.twist.linear.z;
222+
} else {
223+
RCLCPP_INFO(get_logger(), "Odometry data is not coming");
224+
}
225+
}
226+
kinematics.twist_with_covariance.twist.linear.x = std::sqrt(
227+
compensated_velocity.x * compensated_velocity.x +
228+
compensated_velocity.y * compensated_velocity.y);
229+
230+
// Pose conversion
272231
geometry_msgs::msg::PoseStamped radar_pose_stamped{};
273232
radar_pose_stamped.pose.position = radar_track.position;
233+
234+
double yaw = tier4_autoware_utils::normalizeRadian(
235+
std::atan2(compensated_velocity.y, compensated_velocity.x));
236+
radar_pose_stamped.pose.orientation = tier4_autoware_utils::createQuaternionFromYaw(yaw);
237+
274238
geometry_msgs::msg::PoseStamped transformed_pose_stamped{};
275239
tf2::doTransform(radar_pose_stamped, transformed_pose_stamped, *transform_);
276240
kinematics.pose_with_covariance.pose = transformed_pose_stamped.pose;
@@ -289,24 +253,6 @@ TrackedObjects RadarTracksMsgsConverterNode::convertRadarTrackToTrackedObjects()
289253
pose_cov[POSE_IDX::Z_Z] = radar_position_cov[RADAR_IDX::Z_Z];
290254
}
291255

292-
// convert by tf
293-
geometry_msgs::msg::Vector3Stamped radar_velocity_stamped{};
294-
radar_velocity_stamped.vector = radar_track.velocity;
295-
geometry_msgs::msg::Vector3Stamped transformed_vector3_stamped{};
296-
tf2::doTransform(radar_velocity_stamped, transformed_vector3_stamped, *transform_);
297-
kinematics.twist_with_covariance.twist.linear = transformed_vector3_stamped.vector;
298-
299-
// twist compensation
300-
if (node_param_.use_twist_compensation) {
301-
if (odometry_data_) {
302-
kinematics.twist_with_covariance.twist.linear.x += odometry_data_->twist.twist.linear.x;
303-
kinematics.twist_with_covariance.twist.linear.y += odometry_data_->twist.twist.linear.y;
304-
kinematics.twist_with_covariance.twist.linear.z += odometry_data_->twist.twist.linear.z;
305-
} else {
306-
RCLCPP_INFO(get_logger(), "Odometry data is not coming");
307-
}
308-
}
309-
310256
{
311257
auto & twist_cov = kinematics.twist_with_covariance.covariance;
312258
auto & radar_vel_cov = radar_track.velocity_covariance;

0 commit comments

Comments
 (0)