ros1_bridge icon indicating copy to clipboard operation
ros1_bridge copied to clipboard

Custom msg type array in service would not match

Open yumeminami opened this issue 9 months ago • 1 comments

ros1 planArmTrajectoryBezierCurve.srv:

kuavo_msgs/jointBezierTrajectory[] multi_joint_bezier_trajectory
float64 start_frame_time
float64 end_frame_time
string[] joint_names
---
bool success

ros2 PlanArmTrajectoryBezierCurve.srv

kuavo_msgs/JointBezierTrajectory[] multi_joint_bezier_trajectory
float64 start_frame_time
float64 end_frame_time
string[] joint_names
---
bool success

ros1 jointBezierTrajectory.msg

kuavo_msgs/bezierCurveCubicPoint[] bezier_curve_points

ros2 JointBezierTrajectory.msg

kuavo_msgs/BezierCurveCubicPoint[] bezier_curve_points

ros1 bezierCurveCubicPoint.msg

float64[] end_point
float64[] left_control_point
float64[] right_control_point

ros2 BezierCurveCubicPoint.msg

float64[] end_point
float64[] left_control_point
float64[] right_control_point

mapping_rules.yaml

- ros1_package_name: kuavo_msgs
  ros1_service_name: planArmTrajectoryBezierCurve
  ros2_package_name: kuavo_msgs
  ros2_service_name: PlanArmTrajectoryBezierCurve

- ros1_package_name: kuavo_msgs
  ros1_message_name: jointBezierTrajectory
  ros2_package_name: kuavo_msgs
  ros2_message_name: JointBezierTrajectory

- ros1_package_name: kuavo_msgs
  ros1_message_name: bezierCurveCubicPoint
  ros2_package_name: kuavo_msgs
  ros2_message_name: BezierCurveCubicPoint

After build the bridge_ws, I've got the kuavo_msgs__srv__PlanArmTrajectoryBezierCurve__factories.cpp

Expectation:

// generated from ros1_bridge/resource/interface_factories.cpp.em

#include "kuavo_msgs_factories.hpp"

#include <algorithm>

#include "rclcpp/rclcpp.hpp"

// include builtin interfaces
#include <ros1_bridge/convert_builtin_interfaces.hpp>

// include ROS 1 services
#include <kuavo_msgs/planArmTrajectoryBezierCurve.h>

// include ROS 2 services
#include <kuavo_msgs/srv/plan_arm_trajectory_bezier_curve.hpp>

namespace ros1_bridge
{

std::shared_ptr<FactoryInterface>
get_factory_kuavo_msgs__srv__PlanArmTrajectoryBezierCurve(const std::string & ros1_type_name, const std::string & ros2_type_name)
{
  (void)ros1_type_name;
  (void)ros2_type_name;
  return std::shared_ptr<FactoryInterface>();
}

std::unique_ptr<ServiceFactoryInterface>
get_service_factory_kuavo_msgs__srv__PlanArmTrajectoryBezierCurve(const std::string & ros_id, const std::string & package_name, const std::string & service_name)
{
  if (
    (
      ros_id == "ros1" &&
      package_name == "kuavo_msgs" &&
      service_name == "planArmTrajectoryBezierCurve"
    ) || (
      ros_id == "ros2" &&
      package_name == "kuavo_msgs" &&
      service_name == "srv/PlanArmTrajectoryBezierCurve"
    )
  ) {
    return std::unique_ptr<ServiceFactoryInterface>(new ServiceFactory<
      kuavo_msgs::planArmTrajectoryBezierCurve,
      kuavo_msgs::srv::PlanArmTrajectoryBezierCurve
    >);
  }
  return nullptr;
}
// conversion functions for available interfaces

template <>
void ServiceFactory<
  kuavo_msgs::planArmTrajectoryBezierCurve,
  kuavo_msgs::srv::PlanArmTrajectoryBezierCurve
>::translate_1_to_2(
  const kuavo_msgs::planArmTrajectoryBezierCurve::Request& req1,
  kuavo_msgs::srv::PlanArmTrajectoryBezierCurve::Request& req2
) {
  req2.multi_joint_bezier_trajectory.resize(req1.multi_joint_bezier_trajectory.size());
  auto multi_joint_bezier_trajectory1_it = req1.multi_joint_bezier_trajectory.begin();
  auto multi_joint_bezier_trajectory2_it = req2.multi_joint_bezier_trajectory.begin();
  while (
    multi_joint_bezier_trajectory1_it != req1.multi_joint_bezier_trajectory.end() &&
    multi_joint_bezier_trajectory2_it != req2.multi_joint_bezier_trajectory.end()
  ) {
    auto & multi_joint_bezier_trajectory1 = *(multi_joint_bezier_trajectory1_it++);
    auto & multi_joint_bezier_trajectory2 = *(multi_joint_bezier_trajectory2_it++);
  Factory<kuavo_msgs::jointBezierTrajectory,kuavo_msgs::msg::JointBezierTrajectory>::convert_1_to_2(
    multi_joint_bezier_trajectory1, multi_joint_bezier_trajectory2
  );
  }
  auto & start_frame_time1 = req1.start_frame_time;
  auto & start_frame_time2 = req2.start_frame_time;
  start_frame_time2 = start_frame_time1;
  auto & end_frame_time1 = req1.end_frame_time;
  auto & end_frame_time2 = req2.end_frame_time;
  end_frame_time2 = end_frame_time1;
  req2.joint_names.resize(req1.joint_names.size());
  auto joint_names1_it = req1.joint_names.begin();
  auto joint_names2_it = req2.joint_names.begin();
  while (
    joint_names1_it != req1.joint_names.end() &&
    joint_names2_it != req2.joint_names.end()
  ) {
    auto & joint_names1 = *(joint_names1_it++);
    auto & joint_names2 = *(joint_names2_it++);
  joint_names2 = joint_names1;
  }
}

template <>
void ServiceFactory<
  kuavo_msgs::planArmTrajectoryBezierCurve,
  kuavo_msgs::srv::PlanArmTrajectoryBezierCurve
>::translate_1_to_2(
  const kuavo_msgs::planArmTrajectoryBezierCurve::Response& req1,
  kuavo_msgs::srv::PlanArmTrajectoryBezierCurve::Response& req2
) {
  auto & success1 = req1.success;
  auto & success2 = req2.success;
  success2 = success1;
}

template <>
void ServiceFactory<
  kuavo_msgs::planArmTrajectoryBezierCurve,
  kuavo_msgs::srv::PlanArmTrajectoryBezierCurve
>::translate_2_to_1(
  const kuavo_msgs::srv::PlanArmTrajectoryBezierCurve::Request& req2,
  kuavo_msgs::planArmTrajectoryBezierCurve::Request& req1
) {
  req1.multi_joint_bezier_trajectory.resize(req2.multi_joint_bezier_trajectory.size());
  auto multi_joint_bezier_trajectory1_it = req1.multi_joint_bezier_trajectory.begin();
  auto multi_joint_bezier_trajectory2_it = req2.multi_joint_bezier_trajectory.begin();
  while (
    multi_joint_bezier_trajectory1_it != req1.multi_joint_bezier_trajectory.end() &&
    multi_joint_bezier_trajectory2_it != req2.multi_joint_bezier_trajectory.end()
  ) {
    auto & multi_joint_bezier_trajectory1 = *(multi_joint_bezier_trajectory1_it++);
    auto & multi_joint_bezier_trajectory2 = *(multi_joint_bezier_trajectory2_it++);
  Factory<kuavo_msgs::jointBezierTrajectory,kuavo_msgs::msg::JointBezierTrajectory>::convert_2_to_1(
    multi_joint_bezier_trajectory2, multi_joint_bezier_trajectory1
  );
  }
  auto & start_frame_time1 = req1.start_frame_time;
  auto & start_frame_time2 = req2.start_frame_time;
  start_frame_time1 = start_frame_time2;
  auto & end_frame_time1 = req1.end_frame_time;
  auto & end_frame_time2 = req2.end_frame_time;
  end_frame_time1 = end_frame_time2;
  req1.joint_names.resize(req2.joint_names.size());
  auto joint_names1_it = req1.joint_names.begin();
  auto joint_names2_it = req2.joint_names.begin();
  while (
    joint_names1_it != req1.joint_names.end() &&
    joint_names2_it != req2.joint_names.end()
  ) {
    auto & joint_names1 = *(joint_names1_it++);
    auto & joint_names2 = *(joint_names2_it++);
  joint_names1 = joint_names2;
  }
}

template <>
void ServiceFactory<
  kuavo_msgs::planArmTrajectoryBezierCurve,
  kuavo_msgs::srv::PlanArmTrajectoryBezierCurve
>::translate_2_to_1(
  const kuavo_msgs::srv::PlanArmTrajectoryBezierCurve::Response& req2,
  kuavo_msgs::planArmTrajectoryBezierCurve::Response& req1
) {
  auto & success1 = req1.success;
  auto & success2 = req2.success;
  success1 = success2;
}

}  // namespace ros1_bridge

Actual:

// generated from ros1_bridge/resource/interface_factories.cpp.em

#include "kuavo_msgs_factories.hpp"

#include <algorithm>

#include "rclcpp/rclcpp.hpp"

// include builtin interfaces
#include <ros1_bridge/convert_builtin_interfaces.hpp>

// include ROS 1 services

// include ROS 2 services

namespace ros1_bridge
{

std::shared_ptr<FactoryInterface>
get_factory_kuavo_msgs__srv__PlanArmTrajectoryBezierCurve(const std::string & ros1_type_name, const std::string & ros2_type_name)
{
  (void)ros1_type_name;
  (void)ros2_type_name;
  return std::shared_ptr<FactoryInterface>();
}

std::unique_ptr<ServiceFactoryInterface>
get_service_factory_kuavo_msgs__srv__PlanArmTrajectoryBezierCurve(const std::string & ros_id, const std::string & package_name, const std::string & service_name)
{
  (void)ros_id;
  (void)package_name;
  (void)service_name;
  return nullptr;
}
// conversion functions for available interfaces
}  // namespace ros1_bridge

yumeminami avatar May 28 '25 02:05 yumeminami

the problem is the code only checks the the msg type that including [] is match or not.

https://github.com/ros2/ros1_bridge/blob/6c5ad167139ae64a42c8a202614f7c84004081ee/ros1_bridge/init.py#L645

my service request msg type is kuavo_msgs/JointBezierTrajectory[] multi_joint_bezier_trajectory and it should rstrip the [] to match

yumeminami avatar May 28 '25 02:05 yumeminami