机器人平台框架Yarp - Yet another robot platform
简介
ROS有强大和易用的特性,用的人很多,目前已经推出2.0版本,有相关的官网和论坛。然而其缺点也比较明显。
只能基于Ubuntu系统,且一个ROS版本只能对应一个具体的Ubuntu版本
通信效率相对较低,基于Tcp协议。据说2.0以后支持udp协议,但效率如何位置,据说2.0以后版本变化也比较大
系统较大。ROS使用与一个系统较大的平台,包括移动机器人、机械臂、平台机器人、室外展示机器人等。对于一般的开发者而已,往往只专注与1~2个核心点,很少涉及全部功能。而ROS的升级和维护往往涉及较大的文件和相关库,开发并不轻便。
故需要找到替代品。Yarp标榜了“Another"不知作者是否是相对ROS而言。
Yarp是开源系统,源码在Github中可以得到,且有几个稳定版本共选择。https://github.com/robotology/yarp
官方文档在 http://www.yarp.it/
然而官方文档似乎由doxgen生成,并不条理,且很多文档并没有相关注释,tutorial下来也没有一个明确的理解概念,所以在此需要记录学习过程的体会和经验,希望给后来者提供需求和帮助。
Yarp的优势:
- 分布式,支持tcp/udp/http 协议
- 跨平台,用c++编写,依赖库很少,Linux下只需要必备的几个三方库。Windows下需额外下载一个库编译后即可使用
- 开源,支持修改
- 简单,支持CMake工具
基于以上有点,在跨平台开发时得心应手,目前没有碰到太多效率问题,比较时候当前的项目需求。
安装
利用Git工具获取源码或相应稳定版本 https://github.com/robotology/yarp
Windows下尚需按照源码ACE
利用CMake生成工程,编译,设定YARP_DIR为CMake相关目录
Enjoy!
简单实例
新建CMakeLists.txt, 内容如下
cmake_minimum_required(VERSION 2.8.) project(yarp_demo) find_package(YARP REQUIRED)
include_directories(${YARP_INCLUDE_DIRS})
add_executable(simple_sender simple_sender.cpp) target_link_libraries(simple_receiver ${YARP_LIBRARIES})
简单的CMake代码,主要包含Yarp引用的header files,以及在链接时需要加入的Yarp库。Windows和Linux下面均经过测试。其中Windows需要在环境变量中指定Yarp_dir。当然,Yarp最好是自己编译通过。
simple_sender.cpp的源码如下:
#include <yarp/os/Network.h>
#include <yarp/os/Port.h>
#include <yarp/os/Bottle.h>
#include <yarp/os/Time.h>
#include <stdio.h>
#include <yarp/os/all.h>
#include <yarp/sig/all.h> #include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp> using namespace yarp::os;
using namespace yarp::sig;
using namespace yarp::sig::draw;
using namespace yarp::os; int main(int argc, char **argv)
{
char* ipAddr = "127.0.0.1";
const int defaultPort = ; Network yarp; // connect to the name server
Contact nameServer(ipAddr, defaultPort);
Network::setNameServerContact(nameServer); BufferedPort<ImageOf<PixelRgb> > port;
port.open("/circle"); cv::VideoCapture mCap; mCap = cv::VideoCapture();
if (mCap.isOpened())
{
while ()
{
cv::Mat frame;
mCap >> frame; ImageOf<PixelRgb>& img = port.prepare();
img.setExternal(frame.data, frame.cols, frame.rows);
port.write(); cv::imshow("image", frame);
int val = cv::waitKey();
if(val > ) break;
} }
else
{
int ct = ;
int idx = ;
while (true)
{
ImageOf<PixelRgb>& img = port.prepare();
img.resize(, );
img.zero(); PixelRgb blue(, , );
addCircle(img, blue, ct, , ); printf("send msg: %d \n", ++idx);
port.write(); Time::delay();
ct = (ct + ) % ;
if (idx > 0xffff) break;
} } mCap.release();
port.close();
return ;
}
相对于Yarp Example里面的范例,本例略复杂,即将发送的数据由OpenCV采集摄像头的数据,再转化为图片格式,发送出去。如果客户端没有摄像头,则直接创建一张简单图片,画一个圆形发送出去。
其接受代码如下simple_receiver.cpp(CMakeList可参照上面的写,非常简单):
#include <yarp/os/Network.h>
#include <yarp/os/Port.h>
#include <yarp/os/Bottle.h>
#include <stdio.h> #include <yarp/os/all.h>
#include <yarp/sig/all.h> using namespace yarp::os;
using namespace yarp::sig; #include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp> #include <string> int main(int argc, char **argv)
{
std::string ipAddr("127.0.0.1");
const int defaultPort = ; Network yarp;
// connect to the name server
Contact nameServer(ipAddr, defaultPort);
Network::setNameServerContact(nameServer); Port input;
auto ret = input.open("/receiver");
if (!ret)
{
printf("Could not connect server \n. ## Please retry. \n");
return -;
} Bottle bot;
ImageOf<PixelRgb> img; Network::connect("/circle", "/receiver", "udp"); while (true)
{ input.read(img);
auto img2 = img.getIplImage();
IplImage *img3 = static_cast<IplImage*>(img2); cvShowImage("Image", img3);
cvWaitKey(); printf("\t======================== \n");
//printf("got msg: %s\n", bot.toString().c_str());
} input.close(); return ;
}
连接正常的话,可以实时收到sender发送过来的图像。
其他几个要点:
Network::connect函数的第三个参数可选择tpc或upd
Yarp默认不需要选择ipAddr或者port。在多机通信时,需要指定ip或端口
单机通信效率比较高。
另外Yarp含有Ros的结构,同时也有类似Ros的Topic的概念,会我后面的文章中介绍。
机器人平台框架Yarp - Yet another robot platform的更多相关文章
- Robot Framework自动化测试框架核心指南-如何做好自动化测试平台框架的设计
自动化测试如果需要能高效快速的支撑软件项目的测试,项目的快速迭代以及上线,除了以上我们介绍的需要许多的Lib来支持以及需要高效的去编写自动化测试案例外,还需要一个好的自动化测试框架平台来支撑我们的自动 ...
- 玩转X-CTR100 l STM32F4 l X-CTR100与树莓派搭建机器人平台
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器与树莓派Linux系统 ...
- SNF软件开发机器人平台2018-发展升级履历-零编程时代
一.SNF软件开发机器人产品白皮书 二.SNF开发机器人教程:链接:https://pan.baidu.com/s/1Qpomg11c_1b1NKY5P7e4Bw 密码:jwc3 三.SNF软件开发机 ...
- AI中台——智能聊天机器人平台的架构与应用(分享实录)
内容来源:宜信技术学院第3期技术沙龙-线上直播|AI中台——智能聊天机器人平台 主讲人:宜信科技中心AI中台团队负责人王东 导读:随着“中台”战略的提出,目前宜信中台建设在思想理念及架构设计上都已经取 ...
- 5G和AI机器人平台
5G和AI机器人平台 Qualcomm Launches 5G and AI Robotics Platform 高通技术公司(Qualcomm Technologies)周三推出了一款高级5G和人工 ...
- 5G和AI机器人平台为工业4.0和无人机提供服务
5G和AI机器人平台为工业4.0和无人机提供服务 Qualcomm 5G and AI robotics platform delivers for Industry 4.0 and drones 高 ...
- 通过Django Channels设计聊天机器人WEB框架
这两个月都在忙着设计针对银联客服业务的智能聊天机器人,上一周已经交完设计报告,这一周还和部门同事一起分享了系统设计及运行效果.因为时间的关系,系统原型我使用了Flask+jQuery的组合,感觉用以原 ...
- 易普优APS高级计划排程系统系列提纲:行业知识,业务建模,排程算法,计划可视化,平台框架,案例分享
专注于高级计划排程系统研发与实施10来年了,国内外各种APS软件基本都研究过,这里列个提纲主要从6个方面跟大家一起讨论分享,欢迎大家鼓掌或拍砖 易普优APS高级计划排程系统系列001:行业知识,APS ...
- OpenStack云计算平台框架
概: OpenStack是包含很多独立组件的一个云计算平台框架.在安装组件前,需要先将框架搭建出来,才能向其中放置组件. 搭建open stack云计算平台框架 一.安装open stack云计算平 ...
随机推荐
- Java基础加强之并发(一)基本概念介绍
基本概念介绍 进程:它是内存中的一段独立的空间,可以负责当前应用程序的运行.当前这个进程负责调度当前程序中的所有运行细节. 线程:它是位于进程中,负责当前进程中的某个具备独立运行资格的空间. 进程是负 ...
- linq to sql 和linq to php 的区别
linq to sql 这是自.net框架3.5版本以上做出了相关规定. linq to php .Net的linq库的忠实移植到PHP 这个库使得大量使用匿名函数在PHP 5.3中引入的功能.因此, ...
- 20145203盖泽双 《Java程序设计》第四周学习总结
20145203盖泽双 <Java程序设计>第四周学习总结 教材学习内容总结 1.多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单 ...
- python list 使用技巧
格式:list[start:stop:step] 示例:a =list(range(0,10))print(a[1:8:2]) #[1, 3, 5, 7]print(a[:8:2]) #[0, 2, ...
- [转]C#调用C++类(以COM组件的形式)
如果想用C#调用C/C++写的函数,可以先将C/C++的函数写成dll文件,由C#用DllImport的方式来调用,但是这种方法无法调用C++写的类,如果想调用C++类,可以先把C++类封装成COM组 ...
- C#在WinForm中重写ProgressBar控件(带%的显示)
废话少说,直接上码: namespace csPublish { [ToolboxItem(true)] class textProgressBar : System.Windows.Forms.Pr ...
- ping不通linux服务器排查
很久没启动linux了,今天打开试了下 ssh root@192.168.229.128 ping 一直超时 老规矩挨着来排查 检查网络设备器改为Net 模式 重启网络服务 service netw ...
- 第八天- 基础数据操作补充 集合set 深浅拷贝
字符串的操作补充: .join() 方法用于将序列(字符串/列表/元组/字典)中的 元素 以指定的字符连接生成一个新的字符串 str = "人生苦短我用python!" # 用于字 ...
- Flume定时启动任务 防止挂掉
一,查看Flume条数:ps -ef|grep java|grep flume|wc -l ==>15 检查进程:给sh脚本添加权限,chmod 777 xx.sh #!/bin/s ...
- 复制文件到IDE等工具出现乱码解决方案
首要的解决方案是设置文件或者项目或者工作空间的编码,可以采用在文件上.项目上右键->properties进行设置 第二种方式是在editplus等编辑器里打开文件,然后打开文件之后点击菜单Fil ...