--- stderr: learning_action_cpp
/userdata/dev_ws/src/ros2_21_tutorials/learning_action_cpp/src/action_move_client.cpp: In member function ‘void MoveCircleActionClient::send_goal(bool)’:
/userdata/dev_ws/src/ros2_21_tutorials/learning_action_cpp/src/action_move_client.cpp:48:84: error: no match for ‘operator=’ (operand types are ‘rclcpp_action::Client
48 | std::bind(&MoveCircleActionClient::goal_response_callback, this, _1);
| ^
In file included from /usr/include/c++/9/future:48,
from /opt/ros/foxy/include/rclcpp/executors.hpp:18,
from /opt/ros/foxy/include/rclcpp/rclcpp.hpp:146,
from /userdata/dev_ws/src/ros2_21_tutorials/learning_action_cpp/src/action_move_client.cpp:8:
/usr/include/c++/9/bits/std_function.h:462:7: note: candidate: ‘std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(const std::function<_Res(_ArgTypes ...)>&) [with _Res = void; _ArgTypes = {std::shared_future
462 | operator=(const function& __x)
| ^~~~~~~~
/usr/include/c++/9/bits/std_function.h:462:33: note: no known conversion for argument 1 from ‘std::_Bind_helper
462 | operator=(const function& __x)
| ~~~~~~~~~~~~~~~~^~~
/usr/include/c++/9/bits/std_function.h:480:7: note: candidate: ‘std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(std::function<_Res(_ArgTypes ...)>&&) [with _Res = void; _ArgTypes = {std::shared_future
480 | operator=(function&& __x) noexcept
| ^~~~~~~~
/usr/include/c++/9/bits/std_function.h:480:28: note: no known conversion for argument 1 from ‘std::_Bind_helper
480 | operator=(function&& __x) noexcept
| ~~~~~~~~~~~^~~
/usr/include/c++/9/bits/std_function.h:494:7: note: candidate: ‘std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(std::nullptr_t) [with _Res = void; _ArgTypes = {std::shared_future
494 | operator=(nullptr_t) noexcept
| ^~~~~~~~
/usr/include/c++/9/bits/std_function.h:494:17: note: no known conversion for argument 1 from ‘std::_Bind_helper
494 | operator=(nullptr_t) noexcept
| ^~~~~~~~~
/usr/include/c++/9/bits/std_function.h:523:2: note: candidate: ‘template
523 | operator=(_Functor&& __f)
| ^~~~~~~~
/usr/include/c++/9/bits/std_function.h:523:2: note: template argument deduction/substitution failed:
/usr/include/c++/9/bits/std_function.h: In substitution of ‘template
/usr/include/c++/9/bits/std_function.h:523:2: required by substitution of ‘template
/userdata/dev_ws/src/ros2_21_tutorials/learning_action_cpp/src/action_move_client.cpp:48:84: required from here
/usr/include/c++/9/bits/std_function.h:385:8: error: no type named ‘type’ in ‘struct std::enable_if
385 | using _Requires = typename enable_if<_Cond::value, _Tp>::type;
| ^~~~~~~~~
/usr/include/c++/9/bits/std_function.h:532:2: note: candidate: ‘template
532 | operator=(reference_wrapper<_Functor> __f) noexcept
| ^~~~~~~~
/usr/include/c++/9/bits/std_function.h:532:2: note: template argument deduction/substitution failed:
/userdata/dev_ws/src/ros2_21_tutorials/learning_action_cpp/src/action_move_client.cpp:48:84: note: ‘std::_Bind
48 | std::bind(&MoveCircleActionClient::goal_response_callback, this, _1);
| ^
make[2]: *** [CMakeFiles/action_move_client.dir/build.make:63: CMakeFiles/action_move_client.dir/src/action_move_client.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:80: CMakeFiles/action_move_client.dir/all] Error 2
make: *** [Makefile:141: all] Error 2
---
Failed <<< learning_action_cpp [9.24s, exited with code 2]
Summary: 20 packages finished [42.0s]
1 package failed: learning_action_cpp
1 package had stderr output: learning_action_cpp
thomas@ubuntu:/userdata/dev_ws$
=====================================
# Humble与Foxy版本兼容性说明
本代码仓库测试环境为:Ubuntu22.04+ROS Humble
如使用Ubuntu20.04+ROS Foxy,由于部分API接口不完全兼容,需要做一下代码修改:
## learning_action_cpp功能包

原始代码:
// 创建一个服务器收到目标之后反馈时的回调函数
void goal_response_callback(GoalHandle::SharedPtr goal_message)
{
if (!goal_message)
{
RCLCPP_ERROR(this->get_logger(), "Client: Goal was rejected by server");
rclcpp::shutdown(); // Shut down client node
}
else
{
RCLCPP_INFO(this->get_logger(), "Client: Goal accepted by server, waiting for result");
}
}
需要更改为:
// 创建一个服务器收到目标之后反馈时的回调函数
void goal_response_callback(std::shared_future
{
if (!goal_message.get())
{
RCLCPP_ERROR(this->get_logger(), "Client: Goal was rejected by server");
rclcpp::shutdown(); // Shut down client node
}
else
{
RCLCPP_INFO(this->get_logger(), "Client: Goal accepted by server, waiting for result");
}
}