标签:传递 blocking 国家标准 不同 log classes href double 解压
NML是RCS库中的一部分,NML英文全称是neutral message language。它是由美国国家标准与技术研究院(NIST,National Institute of Standard and Technology)针对分布式通信而设计的一种通信协议与方式。
无人车开发过程中,使用NML通信,并不需要对NML了解很深。由于目前可参考的资料并不多,建议使用尽量采用现成模板,直接套用即可。但是,由于不知道基本运行原理,容易在遇到问题时束手无策。出于该目的, 笔者将经验总结,以供参考。
简单的说来,程序中要使用NML通信,只需要以下简单的三步。
参考文件:https://www.nist.gov/el/intelligent-systems-division-73500/networked-control-systems-group/rcs-library-installation
以下方法针对的是Ubuntu系统,如果是windows系统或者遇到了安装困难可以参加附件中的word文档。
cd rcslib-2014.04.29(对应安装包名字)
./configure -enable-ALLJAVA
[修改Makefile中的prefix选项为 /opt/rcslib/build,此处将生成lib与include]
make
make check
make install(可能需要root权限)
以下部分是对NML官方文档的说明和一些实践中经验的补充。不同于官方文档,我们直接以我们车上的NML(bin/UGVAuto.nml)为模板,来说明。如果想使用,建议直接用模板修改,而不要从头到尾写。
NML配置文件主要包括四个部分,分别是:注释,消息,进程,server。
1.注释
注释以‘#‘开头,我们可以看到有一行以#开头,如下:
# Name Type Host size neut RPC# buffer# MP . . .
这就是注释。
为了更好的表示消息的写法,特意加了该注释。
2.消息(buffer)
消息对应在src/message里面的文件,只有定义了消息的头文件,才能够被其他程序调用。只有此处配置正确,才能保证消息的正常收发。
对于代表buffer的.hh文件,可用Makefile文件对message进行修改和编译,每次修改.hh文件都需要重新编译,编译生成新的/Test/lib/libTest.a文件。
Message名称都以n结尾,如MessageAn.hh MessageBn.hh MessageCn.hh等。这是在message文件夹里的Makefile中约定的,方便统一管理。而在.nml配置文件中,我们将后缀n略去。
消息以B开头,我们以现有模板的注释行为例,一一介绍该如何编写和定义消息。
# Buffers
# Name Type Host size neut RPC# buffer# MP . . .
B MessageA SHMEM 172.23.100.205 1024 0 * 1001 * 50001 bsem=5421 TCP=5421 xdr
这里要注意的是,如果用了两个不同的nml文件,如果有共同的buffer,后面的[Type-spec data]必须是一致的,否则无法通信。
3.进程(Process)
进程以P开头。
# Name Buffer Type Host Ops server timeout master cnum
# ModuleA
P ModuleA MessageA LOCAL 172.23.100.205 R 0 0.1 1 1 waitformaster
4.Server
Server是一种特殊的进程,其写法与进程类似。在/src/server下可用Makefile文件对server进行修改和编译,每次修改.cc文件都需要重新编译,编译生成新的/Test/bin/*svr 文件。
#Server
# Name Buffer Type Host 0ps server timeout master cnum
P ServerAsvr MessageA LOCAL 172.23.100.210 RW 1 0.1 1 51
注意:
server的Type都是LOCAL,Host是server程序所在主机地址。Ops一般为RW操作,server为1,master为1即可。
这一部分,介绍内容分为两部分:一是如何使用C++来编写NMLmessage,二是主程序中如何使用NML来通信。
NML message存放在src文件夹下,通常与应用程序在同一级目录下。这种目录结构能够最小化修改文件目录。
message文件夹内需要copy以下几个基本的文件:
-Makefile
-NMLmsgExn2.cc
-NMLmsgExn.hh
-CommonDefinitionX可用可不用,如果不用,则对应将头文件中的引用注释即可。
其中,
/usr/local/bin/CodeGenCmdLine.jar
。 find /opt -name CodeGenCmdLine.jar
find /usr -name CodeGenCmdLine.jar
clean:
-\rm -f *.o lib*.a lib*.so lib*.la *.lib *.ddll
// Prevent Multiple Inclusion
#ifndef MESSAGEAN_HH
#define MESSAGEAN_HH
// Include Files
#include "rcs.hh" // Common RCS definitions
#include "NMLmsgExn.hh"
#include "CommonDefinitionX.hh"
定义MESSAGEA_MSG_TYPE.
// Define the integer type ids.
#define MESSAGEA_MSG_TYPE 40101
接下来则是消息的定义,可以根据自己的需要,自定义一些数据结构:
struct UserType{
int int_array[2];
std::string v_str;
};
// Define the NML Message Classes
class MESSAGEA_MSG : public NMLmsgEx
{
public:
//Constructor
MESSAGEA_MSG();
// CMS Update Function
void update(CMS *);
// Place custom variables here.
char v_char;
double v_double;
UserType usertype_data;
};
// Declare NML format function
extern int MessageAFormat(NMLTYPE, void *, CMS *);
#endif // MESSAGEAN_HH
set_rcs_print_destination(RCS_PRINT_TO_STDOUT);
nml_start();
nml_cleanup();
NML * MESSAGE_CHANNEL = new NML(formatFunction,"buffer", "process", "config.nml");
Message_data = new MESSAGEA_MSG;
Message_data = (MESSAGEC_MSG *) MESSAGE_CHANNEL->get_address();
new MESSAGEA_MSG
。发送的Buffer,需要在构造函数中new MESSAGEA_MSG
开辟新空间。MESSAGE_CHANNEL ->blocking_read(0.2)
MESSAGE_CHANNEL ->write(Message_data)
(written by Bokai Liu)
下载地址:
https://gitee.com/drshawn/RCS-Tutorial/tree/master/HelloWorldModule
该程序在两台计算机上运行,有三个模块,分别为(计算机1)模块A,模块B和(计算机2)模块C。
程序运行流程为:
模块B(发送消息A,B)--->模块A(接收消息A,B,并进行处理,发送消息C)。
模块A(发送消息C)--->模块C(接收消息C)。
(Welcome to update and supplement)
NMLmsgEx::NMLmsgEx(long, long)
或
标签:传递 blocking 国家标准 不同 log classes href double 解压
原文地址:https://www.cnblogs.com/AIpower/p/12743445.html