6.22-Actionlib

本文深入讲解了ROS中的ActionLib,一种用于处理长时间运行任务的标准化接口。通过客户端-服务器模型,ActionLib允许发送预发布任务并接收周期性反馈,特别适合需要长时间执行的任务场景。

TOC

参考

Actionlib
Detailed_description
Tutorials
SimpleActionClientAPI
sstream double 字符串转换
tf API

提示

  • 只有一个包或节点是消息,服务,动作的提供者时,在构造描述文件中才需要添加相应的描述语句,如果是接受者,那么不需要提供。

    请比较rosaria和rosaria_client构造描述文件的区别

前言

  • 基础技能,很重要
  • 接上一篇日志
  • 准备看完后,找一个时间给ROS for LabVIEW 加上Action功能,当前项目中利用ROS中一个Proxy节点,将服务请求转换为动作请求

步骤记录

学习actionlib基础知识
定义:用来为预先发布的任务执行提供接口

The actionlib stack provides a standardized interface for interfacing with preemptable tasks.

综述

在ROS中,已经有一种机制,让程序可以向一个节点发送任务请求并收到一次回应,这个机制叫做服务(service),但是在其他很多情况下,如果一个任务需要很长时间完成,用户想要周期性地收到服务器的反馈,这样的机制已经实现,叫做动作,action。

The actionlib package provides tools to create servers that execute long-running goals that can be preempted. It also provides a client interface in order to send requests to the server.

客户端-服务器模型(ROS Action Protocol)

协议建立在ros message机制上

action的具体消息定义(Action Specification)
  • Goal
  • Feedback
  • Result
  • .action file
    各种消息的具体定义都在这个文件中*.action
构造描述文件
find_package(catkin REQUIRED genmsg actionlib_msgs actionlib)
add_action_files(DIRECTORY action FILES DoDishes.action)
generate_messages(DEPENDENCIES actionlib_msgs)
<depend package="actionlib"/>
<depend package="actionlib_msgs"/>
示例代码
// sending the goal
ac.sendGoal(goal);
// wait until finish
while (!ac.waitForResult(ros::Duration(1.0)))
ROS_INFO("Running…");
// print result
if(ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
ROS_INFO("Hooray, the base moved 1 meter forward");
else
ROS_INFO("The base failed to move forward 1 meter for some reason");

转载于:https://www.cnblogs.com/lizhensheng/p/11117578.html

<think>好的,用户遇到了BL51 BANKED LINKER的FATAL ERROR L210问题,在处理STC12C5A60S2-ADC.obj时出现I/O错误。我需要根据用户提供的引用信息和常见解决方法,逐步分析可能的原因和解决方案。 首先,L210错误通常与链接器无法读取或访问指定的目标文件有关。根据引用[2]中的例子,KEIL编译器中的错误可能涉及路径中的特殊字符或空格。用户的问题可能与文件路径有关,比如路径中包含空格或中文字符,导致链接器无法正确读取文件。需要检查文件路径是否含有这些字符,并建议将项目移动到纯英文、无空格的路径下。 其次,目标文件可能损坏或未正确生成。用户需要确认编译过程是否成功,是否生成了正确的.obj文件。引用[1]中提到了编译过程中的错误处理,如果编译时有警告或错误,可能导致目标文件不完整。建议用户重新编译项目,确保所有源文件没有错误,并且生成的目标文件有效。 另外,文件权限问题也可能导致I/O错误。用户可能需要以管理员身份运行KEIL,或者检查文件是否被其他程序占用。引用[3]提到IAR中的段定义错误,虽然不同工具,但权限问题可能类似,需要检查文件是否可写。 还有,工程配置中的输出路径设置错误也可能导致链接器找不到目标文件。需要检查KEIL中的输出目录配置,确保路径正确,并且链接器能够访问。同时,检查是否在链接器设置中正确添加了目标文件,避免遗漏。 最后,硬件问题如存储空间不足或磁盘错误也可能引发此错误,但相对少见。可以建议用户检查磁盘空间,或尝试在其他目录下重新创建项目。 总结可能的解决步骤:检查文件路径、重新编译、检查权限、验证工程配置、处理磁盘问题。需要将这些步骤清晰地传达给用户,并提示如果问题持续,可能需要进一步检查具体错误信息或联系技术支持。</think>针对BL51 BANKED LINKER出现的FATAL ERROR L210问题,以下是分步解决方案: ### 一、问题定位 错误代码`L210 I/O ERROR ON INPUT FILE`表明链接器无法正确读取`STC12C5A60S2-ADC.obj`文件[^1]。常见原因包括: 1. 文件路径包含**中文字符/空格/特殊符号** 2. 目标文件**未生成或已损坏** 3. 文件系统**读写权限限制** 4. 工程配置中的**输出路径错误** ### 二、解决方案步骤 #### 1. 检查文件路径 - 将工程文件移动到**纯英文路径**(如`D:\Project\MCU`) - 确保路径不包含:`()`、`空格`、`中文`等特殊字符[^2] - 示例:原路径`J:\program\程序测试\`应改为`J:\program\mcu_test\` #### 2. 验证目标文件生成 1. 在KEIL中按`F7`执行完整编译 2. 检查编译输出窗口: ```log C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S) ``` 3. 确认`Output`目录下存在`STC12C5A60S2-ADC.obj`文件 #### 3. 调整工程配置 1. 打开`Options for Target` → `Output`选项卡 2. 设置可写目录: ```ini Name of Executable: mcc Output Directory: .\output\ ``` 3. 在`BL51 Misc`选项卡添加正确目标文件: ```ini Objects: STC12C5A60S2-ADC.obj, main.obj ``` #### 4. 处理文件权限 - 右键KEIL选择`以管理员身份运行` - 检查文件属性→安全→确保有`完全控制`权限 #### 5. 特殊场景处理 若使用STC官方库文件: 1. 确认已添加`STC12C5A60S2.H`头文件 2. 检查`STARTUP.A51`启动文件是否正确配置 3. 在`C51`选项卡启用`BANKED`模式: ```ini Memory Model: Large Code Banking: Enabled ``` ### 三、验证流程 ```mermaid graph TD A[开始] --> B{路径检查} B -->|含特殊字符| C[移动工程目录] B -->|路径正常| D{编译验证} D -->|编译失败| E[检查语法错误] D -->|编译成功| F[检查输出目录] F -->|obj存在| G[检查链接器配置] G -->|配置正确| H[管理员权限运行] H --> I[问题解决] ``` ### 四、典型错误对照表 | 现象 | 解决方案 | |-------|----------| | 中文路径报错 | 迁移到英文目录 | | 文件被占用 | 关闭其他编辑器 | | 磁盘空间不足 | 清理临时文件 | | 旧版本兼容问题 | 安装KEIL C51 V9.60+ |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值