热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通过ROS的Node(节点)调用bhand_controller服务实现barrett_hand基本动作控制

简介:编写一个node,实现通过该node进行barrett机械手的初始化。bhand_controller提供很多关于机械手操作的服务,

简介:编写一个node,实现通过该node进行barrett机械手的初始化。bhand_controller提供很多关于机械手操作的服务,如我们可以通过终端运行下面命令:

$ rosservice call /bhand_node/actions "action: 1",实现机械手初始化,恢复到手指初始展开位姿,并进入到ready状态。本文将初始化等系列操作集成到一个node中,可以实现机械初始化和如开合等基本动作。

效果:运行 rosrun beginner_tutorials bhand_test 后,机械手自动初始化,然后等待3s后手指闭合。

环境:ubuntu 14.04 +indigo.

[正文]

1 获取调用服务需要的相关信息。通过roslaunch bhand_controller bhand_controller.launch运行barrett机械手控制主节点,通过service list可以查询到当前节点中服务如下图所示,本次要用到是/bhand_node/actions服务。

       为了能够在测试node中使用该服务,通过rosservice type查询其服务类型为bhand_controller/Actions,后文调用该服务是需要引用的一个头文件来自于这里。

      此外通过rossrv show指令可以查询到actions的类型为int32,wiki barrett页面事实上没有说明我们最终调用的action的取值范围,但示例给的init hand的action为1,通过rosmsg show bhand_controller/Service可以查询到相关action的取值,推测调用取值是如文件所示。


2 实现节点对于服务的调用。传统client.call()调用的步骤如下,

(1)引入所要调用的服务类型的头文件。

      本文中通过type查询到的类型为bhand_controller/Actions,故引入bhand_controller/Actions.h头文件。

(2)定义NodeHandle,client。并将client定义为 NodeHandle对象的serviceClient链接到的目标服务。其中bhand_node/actions为service list里的服务名称,bhand_controller::Actions为服务类型。

    client=nh.serviceClient("bhand_node/actions");

(3)通过目标服务类型定义测试服务对象。并根据服务request实现服务对象的数据填充。

    文中已通过rossrv show 知道目标服务只有一个int32参数,所以填充如下。

    bhand_controller::Actions test_action;
    test_action.request.action=1;

(4)将填充好数据的服务对象代入client.call()实现调用。

    client.call()函数调用成功会返回True因此可通过if判读是否调用成功,文中实现如下:

    if(client.call(test_action))
    {
        ROS_INFO("Init the robotic hand successfully!");
        ......
    }
    else
        ROS_INFO("Failed to Init the robotic hand!");

完整实现程序如下:

#include
#include "bhand_controller/Service.h"
#include "bhand_controller/Actions.h"int main(int argc,char **argv)
{ros::init(argc,argv,"example_srv_bhand");ros::NodeHandle nh;ros::ServiceClient client;client=nh.serviceClient("bhand_node/actions");bhand_controller::Actions test_action;test_action.request.action=1;if(client.call(test_action)){ROS_INFO("Init the robotic hand successfully!");ros::Duration(3).sleep();test_action.request.action=2;if(client.call(test_action))ROS_INFO("Closed the robotic hand successfully!");elseROS_INFO("Failed to close robotic hand!");}elseROS_INFO("Failed to Init the robotic hand!");ros::spinOnce();return 0;
}

备注:

1.由于此处引用了bhand_controller/Service.h,因此在test_action.request.action=1初始化是也可以采用下面方案:

test_action.request.action=bhand_controller::Service::INIT_HAND;

  效果相同。

2.原计划通过ros::service::call()实现调用,但总是调用不成功,机械手动作执行了但不能打印调用成功信息。调用代码如下:

    if(ros::service::call("bhand_node/actions",test_action))
        ROS_INFO("Init the robotic hand successfully!");
    else
        ROS_INFO("Failed to call action service!");

怀疑为第一个参数给的不正确,可能是名称问题,之前使用该函数名称使用的base name,此处为global name,不知道是不是相关,如果有相关研究者知道,还烦请告知,此处该如何调用。



转:https://www.cnblogs.com/siahekai/p/11000813.html



推荐阅读
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 命令模式是一种行为设计模式,它将请求封装成一个独立的对象,从而允许你参数化不同的请求、队列请求或者记录请求日志。本文将详细介绍命令模式的基本概念、组件及其在实际场景中的应用。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本教程详细介绍了如何使用 Spring Boot 创建一个简单的 Hello World 应用程序。适合初学者快速上手。 ... [详细]
  • 通过优化动态网络Cookies的全网互通机制,实现了用户在任意子站点的登录和注销操作均能同步至整个网络。具体实现涉及对三个关键文件的修改:首先,在`incDv_ClsMain.asp`中定位并调整`Response.Cookies`的相关设置;其次,更新`global.asa`以确保会话状态的一致性;最后,修改`login.asp`以支持跨域认证。这一改进不仅提升了用户体验,还增强了系统的安全性和可靠性。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • Tornado框架中模块与静态文件的应用
    本文详细介绍了Tornado框架中模块和静态文件的使用方法。首先明确模块与模板的区别,然后通过具体的代码示例展示如何在HTML文档中使用模块,并配置模块的路由。最后,提供了模块类中参数获取的示例。 ... [详细]
author-avatar
老邮迢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有