消息库zeromq的源码编译及其简单使⽤
作为⼀个致⼒于研究机器⼈仿真软件的机器⼈⼯程师,研究⼀下进程间通信是很有必要的。
当前机器⼈技术在各⾏各业的渗透处于快速上升阶段,诸多传统⾏业的公司都在转型升级中,尤其是今年(2020年)的新冠疫情,让我们看到了机器⼈和⽆⼈⼯⼚的另外⼀个优势。我们会看到地产商成⽴了机器⼈公司,卖饮料的成⽴了机器⼈公司,传统⽣产重型装备的开始研发机器⼈。中国的医患关系紧张,⽭盾短期难以调和,医⽣们冒着被患者家属伤害的风险给患者做⼿术,研发⼿术机器⼈来接管医⽣的部分⼯作,让医⽣不再那么⾟苦那么累已然成为⼀种趋势。
个⼈感觉,当前和未来的⼀个阶段,机器⼈的易⽤性依然很差,虽然近年来协作机器⼈市场发展迅速,国内布局协作机器⼈的⼚商不少,但是协作机器⼈的优势更多的是体现在⼈机协作的安全性上。协作机器⼈跟传统的⼯业机器⼈各有优劣。
传统⼯业机器⼈速度快、惯量⼤、精度⾼、故障率低,但是不够安只能在围栏⾥使⽤。协作机器⼈对传统⼯业机器⼈在安性⽅⾯进⾏了改进,使之可以与⼈协同作业的同时保证⼈的安全性。协作机器⼈为了达到安全的⽬的:1、需要限制速度、刚度、本体质量;2、具有碰撞检测(电流/⼒传感器)功能和拖动⽰教功能。3、符合相关协作机器⼈的安全标准。
根据个⼈的了解的实际情况,协作机器⼈的故障率⽐传统⼯业机器⼈⾼多了。
有时候⼯作时间久了,协作机器⼈指不定哪个关节就出现问题了,然后就要拆关节,返⼚维修,再快递寄回来,再装上去,这个过程机器⼈的位置出现了变化,⼜需要⽰教、标定什么的,⽬前很多视觉应⽤通常跟机器⼈相结合,⼿眼标定⼤概率是要做的,整个过程挺⿇烦的,并且费⽤蛮⾼的,所以未来协作机器⼈维修⼯程师应该还是蛮有市场的。有时候感慨,如果我们⼈类也能像机器⼈那样,⾝体的任何⼀个零部件坏了拆下来换个新的装上就好了。
不知不觉罗嗦了那么多,现在回归正题。要想让机器⼈变得好⽤,那就必须尽量多的让机器⼈系统软件来接管当前需要⼈来做的⼯作,就像A380等⼤型客机如果没有先进的航电系统,很多⼯作要飞⾏原来操作的话,那就太难搞了。因此,可以发现,最近⼏年国内不少机器⼈初创公司都在机器⼈易⽤性上做⼯作。
就个⼈经验来说,要使机器⼈好⽤,必须要在软件、硬件和算法⽅⾯做协同,协同就意味着各模块之间需要进⾏通信,所以进程间通信是机器⼈系统软件必要的技术,这⼀点也可以从很多机器⼈公司在招聘软件开发⼈员的招聘需求中略知⼀⼆。硬件包括:机器⼈本体、控制柜、末端夹具、六维⼒传感器、⼯控机、⼯业相机等
算法:主要是各种上层的机器⼈和视觉相关的算法,如机器⼈的运动学正逆解、动⼒学正逆解、运动规划、轨迹插补、碰撞检测、柔顺控制等,视觉相关的图像分类、⽬标检测、语义分割、实例分割、缺陷检测,点云相关的尺⼨测量、模型ICP匹配、6D抓取位姿估计,以及涉及到的各种算法加速问题
软件:软件是关联硬件和算法的枢纽,机器⼈系统软件,或者说是机器⼈操作系统,学过ROS的同学都知道ROS就是机器⼈操作系统的全称,可能很多同学⼀听到操作系统,脑海中第⼀印象就是WindowsXP/7/8/8.1/10,或者Ubuntu14/16/18/20等,这些是真正意义上的通⽤计算机操作系统,⽽我们这⾥所说的机器⼈操作系统更多的是⼀个中间件的⾓⾊,区分⼀个机器⼈软件包是机器⼈操作系统还是机器⼈⼯具箱的最重要的点即是否集成了进程间通信的功能。如果没有进程间通信的功能,那么就只是⼀个机器⼈⼯具箱,⽐如Peter Corke的MATLAB机器⼈⼯具箱,或者南丹麦⼤学开发维护的RobWork机器⼈⼯具箱,RobWork是基于C++开发的。
相反,ROS或者ROS2就是机器⼈操作系统,为啥,因为ROS实现了节点之间的发布订阅的通信功能,其底层使⽤的xmlrpc库,ROS2也实现了节点之间的发布订阅的通信功能,其底层使⽤的是Fast-RTPS库。
与ROS/ROS2类似的机器⼈操作系统还有⽐较著名的Yarp,即另外⼀个机器⼈平台,本质上就是⼀个机器⼈通信中间件,它提供了多种通信功能。此外,还有德国慕尼⿊⼯业⼤学开发维护的RoboticsLibrary,简称RL,也提供了简单的通讯功能。
终于讲完了本⽂的铺垫,下⾯进⼊今天的主⾓ZeroMQ,下⾯主要记录如何源码编译安装和使⽤ZeroMQ,感兴趣的同学可以⾃⼰去研究⼀下。
⾸先,我们下载和编译libzmq这个库:
git clone git@github:zeromq/libzmq.git
cd libzmq &&mkdir build &&cd build
cmake ..
sudo make -j4 install
其实,只需要安装libzmq就可以使⽤ZeroMQ的通信功能了,但是由于libzmq本⾝是⽤C写的,为了⽅便C++⽤户,官⽅有做了⼀个针对C++的接⼝封装,⽅便C++⽤户使⽤C++类和对象进⾏编程。
接着,我们下载和编译cppzmq这个库:
git clone git@github:zeromq/cppzmq.git
cd cppzmq
mkdir build
cd build
cmake ..
sudo make -j4 install
编写服务器代码:
cmake_minimum_required(VERSION 3.5)
project(zmq_server LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(cppzmq)
include_directories(${cppzmq_INCLUDE_DIR})
add_executable(zmq_server zmq_server.cpp)
target_link_libraries(zmq_server cppzmq)
zmq_server.cpp
#include <string>
#include <chrono>
#include <thread>
#include <iostream>
#include <zmq.hpp>
int main(){
cmake如何使用
using namespace std::chrono_literals;
// initialize the zmq context with a single IO thread
zmq::context_t context{1};
// construct a REP (reply) socket and bind to interface
zmq::socket_t socket{context, ZMQ_REP};
socket.bind("tcp://*:5555");
// prepare some static data for responses
const std::string data{"World"};
for(;;){
zmq::message_t request;
// receive a request from client
std::cout <<"Received "<< _string()<< std::endl;
// simulate work
std::this_thread::sleep_for(1s);
/
/ construct a reply message
zmq::message_t reply{data.cbegin(), d()};
// send the reply to the client
socket.send(reply, zmq::send_flags::none);
}
return0;
}
编写客户端代码:
cmake_minimum_required(VERSION 3.5)
project(zmq_client LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(cppzmq)
include_directories(${cppzmq_INCLUDE_DIR})
add_executable(zmq_client zmq_client.cpp)
target_link_libraries(zmq_client cppzmq)
zmq_client.cpp
#include <string>
#include <iostream>
#include <zmq.hpp>
int main(){
// initialize the zmq context with a single IO thread
zmq::context_t context{1};
// construct a REQ (request) socket and connect to interface
zmq::socket_t socket{context, ZMQ_REQ};
// set up some static data to send
const std::string data{"Hello"};
for(auto request_num =0; request_num <10;++request_num){
// initialize a request message
zmq::message_t request{data.cbegin(), d()};
// send the request message
std::cout <<"Sending Hello "<< request_num <<"..."<< std::endl;        socket.send(request, zmq::send_flags::none);
// wait for reply from server
zmq::message_t reply{};
std::cout <<"Received "<< _string();
std::cout <<" ("<< request_num <<")";
std::cout << std::endl;
}
return0;
}
编译运⾏,进⾏测试:
先启动服务器,进⾏端⼝监听
.
/zmq_server
然后启动客户端,发送和接收数据并打印
./zmq_client
测试效果如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。