Проблема при передаче в качестве аргумента std :: bind функции-члена на C ++ (и MoveIt API) - PullRequest
0 голосов
/ 08 февраля 2019

Добрый день,

ПРИМЕЧАНИЕ: Хотя это вопрос, связанный с ROS, я публикую его здесь, поскольку уверен, что моя проблема связана с C ++, а не с ROS API.

Я пытаюсь использовать функцию setFromIK , определенную для moveit :: core :: RobotState .

Эта функция допускает вызываемый параметр с именем GroupStateValidityCallbackFnс типом (сигнатура функции):

typedef boost::function<bool(RobotState* robot_state, const JointModelGroup* joint_group, const double* joint_group_variable_values)>

Проблема возникает из-за того, что я пытаюсь передать функции класса-члена этому параметру (потому что мне нужно получить классэкземпляры полей члена в обработке), а затем процесс привязки отправляется в ад.

Мой класс выглядит так:

class CSDA10F{
    public:
       bool validateIKSolution( robot_state::RobotState* robot_state, 
                                        const robot_state::JointModelGroup* joint_group, 
                                        const double* joint_group_variable_value){
              [...]
              // some code here
              [...]
          }

       bool planCartesianMotionTask(MoveGroupInterface* move_group, 
                                                    geometry_msgs::Pose initial_pose, 
                                                    geometry_msgs::Pose final_pose,
                                                    std::vector<MoveGroupInterface::Plan> motion_plans,
                                                    uint max_configurations = 10) {
         [...] // Here I make the call!!!.
            auto ik_check_callback = std::bind(&CSDA10F::validateIKSolution, this, _1, _2, _3);
            ik_solution_found = start_state.setFromIK( joint_model_group, initial_pose, 10, 0.01, ik_check_callback);
         [...]
         }

Я использую 3 заполнителя для 3 аргументов из функции,но затем компилятор просто завершается с ошибкой, которую я просто не понимаю.

In file included from /usr/include/boost/function/detail/maybe_include.hpp:28:0,
                 from /usr/include/boost/function/detail/function_iterate.hpp:14,
                 from /usr/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:62,
                 from /usr/include/boost/function.hpp:64,
                 from /opt/ros/kinetic/include/ros/forwards.h:40,
                 from /opt/ros/kinetic/include/ros/common.h:37,
                 from /opt/ros/kinetic/include/ros/ros.h:43,
                 from /home/invite/catkin_ws/src/invite-robotics/drum_automation/src/bag_handling.cpp:1:
/usr/include/boost/function/function_template.hpp: In instantiation of ‘static R boost::detail::function::function_obj_invoker3<FunctionObj, R, T0, T1, T2>::invoke(boost::detail::function::function_buffer&, T0, T1, T2) [with FunctionObj = std::_Bind<std::_Mem_fn<bool (invite_utils::CSDA10F::*)(moveit::core::RobotState*, const moveit::core::JointModelGroup*, const double*)>(invite_utils::CSDA10F, boost::arg<1>, boost::arg<2>, boost::arg<3>)>; R = bool; T0 = moveit::core::RobotState*; T1 = const moveit::core::JointModelGroup*; T2 = const double*]’:
/usr/include/boost/function/function_template.hpp:940:38:   required from ‘void boost::function3<R, T1, T2, T3>::assign_to(Functor) [with Functor = std::_Bind<std::_Mem_fn<bool (invite_utils::CSDA10F::*)(moveit::core::RobotState*, const moveit::core::JointModelGroup*, const double*)>(invite_utils::CSDA10F, boost::arg<1>, boost::arg<2>, boost::arg<3>)>; R = bool; T0 = moveit::core::RobotState*; T1 = const moveit::core::JointModelGroup*; T2 = const double*]’
/usr/include/boost/function/function_template.hpp:728:7:   required from ‘boost::function3<R, T1, T2, T3>::function3(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = std::_Bind<std::_Mem_fn<bool (invite_utils::CSDA10F::*)(moveit::core::RobotState*, const moveit::core::JointModelGroup*, const double*)>(invite_utils::CSDA10F, boost::arg<1>, boost::arg<2>, boost::arg<3>)>; R = bool; T0 = moveit::core::RobotState*; T1 = const moveit::core::JointModelGroup*; T2 = const double*; typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]’
/usr/include/boost/function/function_template.hpp:1077:16:   required from ‘boost::function<R(T0, T1, T2)>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = std::_Bind<std::_Mem_fn<bool (invite_utils::CSDA10F::*)(moveit::core::RobotState*, const moveit::core::JointModelGroup*, const double*)>(invite_utils::CSDA10F, boost::arg<1>, boost::arg<2>, boost::arg<3>)>; R = bool; T0 = moveit::core::RobotState*; T1 = const moveit::core::JointModelGroup*; T2 = const double*; typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]’
/home/invite/catkin_ws/src/invite-robotics/invite_utils/include/invite_utils/csda10f_interface.h:202:116:   required from here
/usr/include/boost/function/function_template.hpp:138:22: error: no match for call to ‘(std::_Bind<std::_Mem_fn<bool (invite_utils::CSDA10F::*)(moveit::core::RobotState*, const moveit::core::JointModelGroup*, const double*)>(invite_utils::CSDA10F, boost::arg<1>, boost::arg<2>, boost::arg<3>)>) (moveit::core::RobotState*, const moveit::core::JointModelGroup*, const double*)’
           return (*f)(BOOST_FUNCTION_ARGS);

Разве объявление в RobotState не разрешает функции-члены? Я полагаю, что я делаю ошибку с std:bind но я не могу найти aswerо том, что это.

Что я знаю:

  • Я использую правильные типы аргументов в функции для привязки
  • У меня есть правильное числоarguments (3)

Есть идеи, в чем проблема?

1 Ответ

0 голосов
/ 08 февраля 2019

Похоже, вы смешиваете заполнители _1, _2, _3 с std::bind.Попробуйте выполнить одно из следующих действий:

  • Переключение на boost::bind,
  • Добавление using std::placeholders; непосредственно перед вызовом,
  • Использование лямбда-выражения, которое захватывает this.
...