首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++没有调用`LogBlock<CrazyflieROS::logMotor>`的匹配函数

C++没有调用`LogBlock<CrazyflieROS::logMotor>`的匹配函数
EN

Stack Overflow用户
提问于 2018-07-13 03:12:52
回答 1查看 889关注 0票数 0

我试图修改一个已经存在的ROS软件包,在crazyflie_driver文件夹中添加和删除一些东西。我正在用catkin_make编译,我有ROS运动16.04。我实际上正在修改crazyflie_server C++脚本的部分是:私有的: struct logImu {C++ acc_x;float acc_y;float acc_z;float gyro_x;float gyro_y;float gyro_z;}

代码语言:javascript
复制
private:
struct logMotor {
        int m1;
        int m2;
        int m3;
        int m4;
    } __attribute__((packed));


    void onImuData(uint32_t time_in_ms, logImu* data) {
    if (m_enable_logging_imu) {
      sensor_msgs::Imu msg;
      if (m_use_ros_time) {
        msg.header.stamp = ros::Time::now();
      } else {
        msg.header.stamp = ros::Time(time_in_ms / 1000.0);
      }
      msg.header.frame_id = m_tf_prefix + "/base_link";
      msg.orientation_covariance[0] = -1;
//new
        msg.orientation.x = cos(data->gyro_z/2)*cos(data->gyro_y/2)*cos(data->gyro_x/2) + sin(data->gyro_z/2)*sin(data->gyro_y/2)*sin(data->gyro_x/2);
    msg.orientation.y = sin(data->gyro_z/2)*cos(data->gyro_y/2)*cos(data->gyro_x/2) - cos(data->gyro_z/2)*sin(data->gyro_y/2)*sin(data->gyro_x/2);
    msg.orientation.z = cos(data->gyro_z/2)*sin(data->gyro_y/2)*cos(data->gyro_x/2) + sin(data->gyro_z/2)*cos(data->gyro_y/2)*sin(data->gyro_x/2);
    msg.orientation.w = cos(data->gyro_z/2)*cos(data->gyro_y/2)*sin(data->gyro_x/2) - sin(data->gyro_z/2)*sin(data->gyro_y/2)*cos(data->gyro_x/2);

//endnew


      // measured in deg/s; need to convert to rad/s
      msg.angular_velocity.x = degToRad(data->gyro_x);
      msg.angular_velocity.y = degToRad(data->gyro_y);
      msg.angular_velocity.z = degToRad(data->gyro_z);

      // measured in mG; need to convert to m/s^2
      msg.linear_acceleration.x = data->acc_x * 9.81;
      msg.linear_acceleration.y = data->acc_y * 9.81;
      msg.linear_acceleration.z = data->acc_z * 9.81;

      m_pubImu.publish(msg);
    }
}

void onMotorData(logMotor* data) {
        std_msgs::Int32MultiArray array;
        array.data.clear();
        array.data.push_back(data->m1);
        array.data.push_back(data->m2);
        array.data.push_back(data->m3);
        array.data.push_back(data->m4);

        m_pubMotors.publish(array);
    }

std::function<void(uint32_t, logImu*)> cb = std::bind(&CrazyflieROS::onImuData, this, std::placeholders::_1,std::placeholders::_2);

    logBlockImu.reset(new LogBlock<logImu>(
      &m_cf,{
        {"acc", "x"},
        {"acc", "y"},
        {"acc", "z"},
        {"gyro", "x"},
        {"gyro", "y"},
        {"gyro", "z"},
      }, cb));
    logBlockImu->start(1); // 10ms

 std::function<void(logMotor*)> cbmotor = std::bind(&CrazyflieROS::**onMotorData**, this, std::placeholders::_1);
 logBlockMotor.reset(new LogBlock<logMotor>(
                &m_cf,{
                        {"motor", "m1"},
                        {"motor", "m2"},
                        {"motor", "m3"},
                        {"motor", "m4"},
        }, cbmotor));


        logBlockMotor->start(1); // 10ms


}

我的问题是,当我试图用这部分代码进行编译时:

代码语言:javascript
复制
>logBlockMotor.reset(new LogBlock<logMotor>(
                &m_cf,{
                        {"motor", "m1"},
                        {"motor", "m2"},
                        {"motor", "m3"},
                        {"motor", "m4"},
        }, cbmotor));

它为调用LogBlock<CrazyflieROS::logMotor>提供了一个不匹配的函数

代码语言:javascript
复制
    /home/bitcraze/catkin_ws/src/crazyflie_ros/crazyflie_driver/src/crazyflie_server.cpp: In member function ‘void CrazyflieROS::run()’:
/home/bitcraze/catkin_ws/src/crazyflie_ros/crazyflie_driver/src/crazyflie_server.cpp:530:9: error: no matching function for call to ‘LogBlock<CrazyflieROS::logMotor>::LogBlock(Crazyflie*, <brace-enclosed initializer list>, std::function<void(unsigned int, CrazyflieROS::logImu*)>&)’
    }, cb));
         ^
In file included from /home/bitcraze/catkin_ws/src/crazyflie_ros/crazyflie_driver/src/crazyflie_server.cpp:50:0:
/home/bitcraze/catkin_ws/src/crazyflie_ros/crazyflie_cpp/include/crazyflie_cpp/Crazyflie.h:462:3: note: candidate: LogBlock<T>::LogBlock(Crazyflie*, std::__cxx11::list<std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >, std::function<void(unsigned int, T*)>&) [with T = CrazyflieROS::logMotor]
   LogBlock(
   ^
/home/bitcraze/catkin_ws/src/crazyflie_ros/crazyflie_cpp/include/crazyflie_cpp/Crazyflie.h:462:3: note:   no known conversion for argument 3 from ‘std::function<void(unsigned int, CrazyflieROS::logImu*)>’ to ‘std::function<void(unsigned int, CrazyflieROS::logMotor*)>&’
/home/bitcraze/catkin_ws/src/crazyflie_ros/crazyflie_cpp/include/crazyflie_cpp/Crazyflie.h:459:7: note: candidate: LogBlock<CrazyflieROS::logMotor>::LogBlock(const LogBlock<CrazyflieROS::logMotor>&)
 class LogBlock
       ^
/home/bitcraze/catkin_ws/src/crazyflie_ros/crazyflie_cpp/include/crazyflie_cpp/Crazyflie.h:459:7: note:   candidate expects 1 argument, 3 provided
crazyflie_ros/crazyflie_driver/CMakeFiles/crazyflie_server.dir/build.make:62: recipe for target 'crazyflie_ros/crazyflie_driver/CMakeFiles/crazyflie_server.dir/src/crazyflie_server.cpp.o' failed
make[2]: *** [crazyflie_ros/crazyflie_driver/CMakeFiles/crazyflie_server.dir/src/crazyflie_server.cpp.o] Error 1
CMakeFiles/Makefile2:2995: recipe for target 'crazyflie_ros/crazyflie_driver/CMakeFiles/crazyflie_server.dir/all' failed
make[1]: *** [crazyflie_ros/crazyflie_driver/CMakeFiles/crazyflie_server.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j1 -l1" failed

这是LogBlock.h文件的一部分:

代码语言:javascript
复制
namespace crazyflie_driver
{
template <class ContainerAllocator>
struct LogBlock_
{
  typedef LogBlock_<ContainerAllocator> Type;

  LogBlock_()
    : topic_name()
    , frequency(0)
    , variables()  {
    }
  LogBlock_(const ContainerAllocator& _alloc)
    : topic_name(_alloc)
    , frequency(0)
    , variables(_alloc)  {
  (void)_alloc;
    }



   typedef std::basic_string<char, std::char_traits<char>, typename ContainerAllocator::template rebind<char>::other >  _topic_name_type;
  _topic_name_type topic_name;

   typedef int16_t _frequency_type;
  _frequency_type frequency;

   typedef std::vector<std::basic_string<char, std::char_traits<char>, typename ContainerAllocator::template rebind<char>::other > , typename ContainerAllocator::template rebind<std::basic_string<char, std::char_traits<char>, typename ContainerAllocator::template rebind<char>::other > >::other >  _variables_type;
  _variables_type variables;





  typedef boost::shared_ptr< ::crazyflie_driver::LogBlock_<ContainerAllocator> > Ptr;
  typedef boost::shared_ptr< ::crazyflie_driver::LogBlock_<ContainerAllocator> const> ConstPtr;

}; // struct LogBlock_

我不明白我做错了什么,也是因为如果我把onImuData的内容留在代码中,它就会编译得很完美。一旦我添加了这部分代码,编译器就会出现错误。

有谁可以帮我?我还试图查看CMake.txt文件,但它似乎包含了目录,没有什么问题:

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.8.3)
project(crazyflie_driver)

find_package(catkin REQUIRED COMPONENTS
  message_generation
  std_msgs
  tf
  crazyflie_cpp
)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

add_service_files(
  FILES
  AddCrazyflie.srv
  GoTo.srv
  Land.srv
  RemoveCrazyflie.srv
  SetGroupMask.srv
  StartTrajectory.srv
  Stop.srv
  Takeoff.srv
  UpdateParams.srv
  UploadTrajectory.srv
  sendPacket.srv
)

add_message_files(
  FILES
  LogBlock.msg
  GenericLogData.msg
  FullState.msg
  TrajectoryPolynomialPiece.msg
  crtpPacket.msg
  Hover.msg
  Position.msg
)

## Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
   std_msgs
   geometry_msgs
)

catkin_package(
  CATKIN_DEPENDS
    message_runtime
    std_msgs
    tf
    crazyflie_cpp
)

###########
## Build ##
###########

include_directories(
  ${catkin_INCLUDE_DIRS}
)

## Declare a cpp executable
add_executable(crazyflie_server
  src/crazyflie_server.cpp
)

add_dependencies(crazyflie_server
  crazyflie_driver_generate_messages_cpp
)

## Specify libraries to link a library or executable target against
target_link_libraries(crazyflie_server
  ${catkin_LIBRARIES}
)

## Declare a cpp executable
add_executable(crazyflie_add
  src/crazyflie_add.cpp
)

add_dependencies(crazyflie_add
  crazyflie_driver_generate_messages_cpp
)

target_link_libraries(crazyflie_add
  ${catkin_LIBRARIES}
)

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-13 04:01:06

你在创造

代码语言:javascript
复制
std::function<void(logMotor*)> cbmotor = ...

然后将其传递给期望

代码语言:javascript
复制
std::function<void(uint32_t, T*)>&

( T大概是logMotor)。这两种类型不兼容。这是我在你的资料里读到的。

另一方面,错误信息则表示

参数3从‘std::function<void(unsigned int, CrazyflieROS::logImu*)>’‘std::function<void(unsigned int, CrazyflieROS::logMotor*)>&’没有已知的转换

这意味着您正在创建一个面向logImu的回调,并试图将其传递给一个面向logMotor的参数。您可能正在显示与您作为源发布的文件不同的文件中的错误消息。

无论如何,您需要传递正确类型的回调。

在不相关的情况下:

代码语言:javascript
复制
  LogBlock(
    Crazyflie* cf,
    std::list<std::pair<std::string, std::string> > variables,
    std::function<void(uint32_t, T*)>& callback)

是您试图使用的包中的一个bug。如果有一个非const引用的std::function参数,然后立即将其复制到一个成员变量中,这是没有意义的。这就不必要地限制了构造函数仅用于非const值参数。例如,你可以

代码语言:javascript
复制
std::function<void(uint32_t, logImu*)> cb = std::bind(...);

new LogBlock<logImu>(..., ..., cb)

但你不能直接

代码语言:javascript
复制
    new LogBlock<logImu>(..., ..., std::bind (...))

构造函数应该有一个const引用参数,并且可以选择具有rvalue引用参数的重载。

该函数还按值接受std::list,这也没有任何意义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51317144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档