买域名网站,专业商城网站设计制作,微信公众号编辑 导入wordpress,新闻发稿渠道目录 0 专栏介绍1 动作通信模型2 动作模型实现(C)3 动作模型实现(Python)4 自定义动作 0 专栏介绍
本专栏旨在通过对ROS2的系统学习#xff0c;掌握ROS2底层基本分布式原理#xff0c;并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。
#x1f680;详情)3 动作模型实现(Python)4 自定义动作 0 专栏介绍
本专栏旨在通过对ROS2的系统学习掌握ROS2底层基本分布式原理并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。
详情《ROS2从入门到精通》 1 动作通信模型
在ROS2中动作通信机制提供了一种用于执行长时间运行任务的方式由三个部分组成
目标(goal)对客户端的请求进行处理和响应反馈(feedback)对监控任务的动作执行过程提供反馈数据结果(result)对监控任务的执行结果提供反馈
举个机器人导航的任务说明 假设有一个机器人需要从起始点导航到目标点。通过使用动作通信机制可以定义一个导航动作其中目标是目标位置。机器人将发送导航目标给动作服务器服务器将返回连续的反馈例如机器人的当前位置障碍物检测等。最终当机器人到达目标位置时服务器将返回导航任务的结果。 再比如机械臂控制 通过定义动作目标和提供连续的反馈可以实现对机械臂的精确控制。例如可以定义一个动作来控制机械臂移动到特定位置反馈可以包括当前位置、力传感器的读数等。一旦机械臂到达目标位置服务器将返回控制任务的结果 动作是应用级通信机制建立在话题和服务之上但却与话题和服务通信不同
动作通信更适合描述一项任务的执行过程而话题通信更适合传输实时数据;动作通信返回一系列的反馈和一个最终结果而服务通常只返回单个响应;动作通信是可中断的即在执行过程中可以取消而服务通信通常是一次性的请求-响应模式;…
总之通过使用动作通信可以实现更复杂的交互和反馈并灵活地处理长时间运行的任务
2 动作模型实现(C) 实验目标客户端提交请求给turtlesim功能包的/rotate_absolute动作在界面上使乌龟旋转并不断监听乌龟的实时旋转数据以及到达目标角度的反馈。 服务器 本实验中无需编程,为turtlesim::Action定义的/rotate_absolute服务 客户端 注册一个客户端client_ptr_ rclcpp_action::create_clientTurtleAction(get_node_base_interface(),get_node_graph_interface(),get_node_logging_interface(),get_node_waitables_interface(),/turtle1/rotate_absolute
);定义目标响应回调函数void OnGoalResponseCallback(GoalHandle::SharedPtr goal_message) {if (!goal_message) {RCLCPP_ERROR(get_logger(), Client: Goal was rejected by server);rclcpp::shutdown();} elseRCLCPP_INFO(get_logger(), Client: Goal accepted by server, waiting for result);
}定义过程反馈回调函数void OnFeedbackCallback(GoalHandle::SharedPtr, const std::shared_ptrconst TurtleAction::Feedback feedback_message) {std::stringstream ss;ss Client: Received feedback: feedback_message-remaining;RCLCPP_INFO(this-get_logger(), %s, ss.str().c_str());
}定义结果回调函数void OnResultCallback(const GoalHandle::WrappedResult result_message) {switch (result_message.code) {case rclcpp_action::ResultCode::SUCCEEDED:break;case rclcpp_action::ResultCode::ABORTED:RCLCPP_ERROR(get_logger(), Client: Goal was aborted);rclcpp::shutdown();return;case rclcpp_action::ResultCode::CANCELED:RCLCPP_ERROR(get_logger(), Client: Goal was canceled);rclcpp::shutdown();return;default:RCLCPP_ERROR(get_logger(), Client: Unknown result code);rclcpp::shutdown();return;}RCLCPP_INFO(get_logger(), Client: Result received: %.2f, (result_message.result-delta));rclcpp::shutdown();
}实验结果如下所示在本实验中theta表示发送的目标角度remaining是过程反馈的目标角度差值信息delta是结果响应表示距离初始位置的角度偏差 3 动作模型实现(Python) 实验目标客户端提交请求给turtlesim功能包的/rotate_absolute动作在界面上使乌龟旋转并不断监听乌龟的实时旋转数据以及到达目标角度的反馈。 服务器 本实验中无需编程,为turtlesim::Action定义的/rotate_absolute服务 客户端 注册一个客户端self.client_ ActionClient(self, RotateAbsolute, /turtle1/rotate_absolute)定义目标响应回调函数def OnGoalResponseCallback(self, future):goal_handle future.result() if not goal_handle.accepted: self.get_logger().info(Client: Goal was rejected by server)returnself.get_logger().info(Client: Goal accepted by server, waiting for result)self._get_result_future goal_handle.get_result_async()self._get_result_future.add_done_callback(self.OnResultCallback)定义过程反馈回调函数def OnFeedbackCallback(self, feedback_msg):feedback feedback_msg.feedbackself.get_logger().info(fReceived feedback: {feedback.remaining:.2f}) 定义结果回调函数def OnResultCallback(self, future):if future.done():self.get_logger().info(fAction done!)result future.result().resultself.get_logger().info(fResult: {result.delta:.2f})elif future.cancelled():self.get_logger().info(fClient: Goal was canceled)else:raise RuntimeWarning(Client: Unknown result code) 实验结果如下所示在本实验中theta表示发送的目标角度remaining是过程反馈的目标角度差值信息delta是结果响应表示距离初始位置的角度偏差 4 自定义动作
自定义动作的通用流程如下 功能包下新建action文件夹在其中添加自定义服务xxx.action,注意目标、反馈和结果数据结构使用---分割功能包package.xml中添加编译依赖与执行依赖buildtool_dependrosidl_default_generators/buildtool_depend
exec_dependrosidl_default_runtime/exec_depend
member_of_grouprosidl_interface_packages/member_of_group功能包CMakeLists.txt中添加编译消息相关依赖find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}xxx.actionDEPENDENCIES xxx_actions
)ament_export_dependencies(rosidl_default_runtime)编译自定义动作在install/pkg_name/include中生成由xxx.action编译的C可识别的xxx.hpp头文件引入xxx.hpp即可调用自定义动作 下面给出一个实例 实现一个自定义动作请求机器人开始圆周运动反馈机器人的实时运动角度并返回最终结果 添加如下自定义动作并按上面步骤配置依赖
bool enable # goal
---
bool finish # result
---
int32 state # feedback定义一个服务器、一个客户端限于篇幅只贴出部分代码完整代码见文末。
服务器class OwnActionServerNode : public rclcpp::Node
{public:using OwnAction own_action_lab::action::MoveCircle;using GoalHandle rclcpp_action::ServerGoalHandleOwnAction;explicit OwnActionServerNode(const rclcpp::NodeOptions action_server_options rclcpp::NodeOptions()): Node(own_action_server, action_server_options) {action_server_ rclcpp_action::create_serverOwnAction(get_node_base_interface(),get_node_clock_interface(),get_node_logging_interface(),get_node_waitables_interface(),/move,std::bind(OwnActionServerNode::OnHandleGoal, this, std::placeholders::_1, std::placeholders::_2),std::bind(OwnActionServerNode::OnHandleCancel, this, std::placeholders::_1),std::bind(OwnActionServerNode::OnHandleAccepted, this, std::placeholders::_1));}
}客户端class OwnActionClientNode : public rclcpp::Node
{public:using OwnAction own_action_lab::action::MoveCircle;using GoalHandle rclcpp_action::ClientGoalHandleOwnAction;explicit OwnActionClientNode(const rclcpp::NodeOptions node_options rclcpp::NodeOptions()): Node(own_action_client, node_options) {client_ptr_ rclcpp_action::create_clientOwnAction(get_node_base_interface(),get_node_graph_interface(),get_node_logging_interface(),get_node_waitables_interface(),/move);}
}实测效果如下 完整代码通过下方博主名片联系获取 更多精彩专栏
《ROS从入门到精通》《Pytorch深度学习实战》《机器学习强基计划》《运动规划实战精讲》… 源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系