跳到主要内容

控制器二次开发通讯教程

介绍

控制系统的二次开发可以总结为示教器和控制器的交互,示教器作为用户使用的图形界面,可以在上面进行各种操作以达到下发指令的目的,而控制器则负责处理这些指令,并且与机器人伺服进行交互,同时将各种交互和处理的结果反馈给示教器,通过图形界面显示出来。因此二次开发的工作实际上就是自己编写示教器图形交互界面和控制器逻辑运行功能的工作。

· 编写一个控制器打印消息的程序

参考基础教程的环境配置教程安装控制器二次开发环境,下载 demo 和 3.7.1 的 SDK,将 demo 中解压出来的 demo.cpp 放到 3.7.1 的文件夹中(可以根据实际选择需要的版本,使用方法都是一样的,新版本会有更多的接口,请注意保持控制器和示教器版本的一致)

使用 eclipse 导入 3.7.1 的 demo 工程

在 demo.cpp 中写入一个新的函数

void SayHello(string str)
{
cout << "str = " << str << endl;
cout << "hello" << endl;
}

并在 main 函数中写入

NRC_SetSocketCustomProtocalCB(0x9200,&SayHello);

如下图所示

其中,0x9200 代表与示教器发送时对应的通讯号,SayHello 代表需要跳转触发的函数,格式需为 void xxx(string),字符串参数负责接收示教器发出的字符串,在本例中为 hello。具体函数定义请参考头文件 nrcAPI.h 打开终端,挂载到 demo 程序所在的文件夹下,使用命令

g++ -o nrc.out *.cpp nrcAPI.h -L. -lNexRob -lpthread -lm -ldl -lrt -std=c++11

进行编译,会在该目录下生产可执行文件 nrc.out

另起一个终端,使用 ssh inexbot@192.168.1.13 访问控制器内部,密码默认为 123

先挂载到 robot/目录下,使用 sudo killall -9 nrc.out 关闭控制器内原有的程序。在第一个终端中使用

scp nrc.out inexbot@192.168.1.13:~/robot

命令将该可执行文件拷入控制器中(IP 请填写你的控制器 IP,控制器默认 IP 为 192.168.1.13)。在第二个终端使用./nrc.out 执行我们刚刚编写的可执行文件

等待控制器和示教器的通讯连接上,再次进到示教器的用户界面点击我们在示教器通讯教程编写的按钮,看到终端成功打印出 hello,至此,通讯成功

常见问题

Q:控制器和示教器等了很久一直连接不上 A:检查示教器设置中 IP 设置是否是设置为控制器的 IP,若为直连,请将电脑的 IP 和控制器 IP 改在同一网段上,若是在反复测试中突然连不上,则考虑端口堵塞的问题,此时重启控制器和示教器程序即可 Q:连接成功后,示教器提示版本不匹配 A:本例程中使用的控制器和示教器版本均为 3.7.1,请去官网下载对应的 SDK Q:连接成功后,示教器提示控制器配置文件不匹配 A:进入示教器设置,系统设置,更多设置,恢复出厂值,重启即可 Q:使用 scp 指令时提示 Text file busy A:控制器中 nrc.out 正在运行导致的,使用 sudo killall -9 nrc.out 结束原有的程序即可,另外请避免连续运行两个 nrc.out,最好养成每次运行前先执行以上指令的习惯

· 控制器给示教器发信息

在前一节中,我们学习了如何从示教器发送消息给控制器,在本节中,我们将要从控制器发消息给示教器,这样才能完成一个完整的消息传递回路。 按照发送——接收的先后顺序,这次我们从控制器开始,沿用前一节中的 SayHello 函数,在该函数添加接口

NRC_SendSocketCustomProtocal(0x9201,str);

如下图所示

与第一节中的示教器发送消息的接口相似,0x9201 代表了协议号,str 代表要发送的字符串,在此处为 string 类型,由于第一节中 str 其实也就是示教器发送的 hello 字符串,因此在此处我们接收到 hello 之后又将 hello 返回给示教器。

接下来看示教器的接收部分,请跳转《示教器二次开发通讯教程》

· 示教器接收控制器消息

接下来看示教器的接收部分,demo 中已经内置了接收的接口,如下图

可以看到,在我们触发控制器二次开发通讯教程中的按钮之后,示教器不仅通过 0x9200 给控制器发送了 hello 字符串,还接收到了控制器通过 0x9201 发送过来的 hello 字符串。熟练掌握示教器和控制器的消息通讯之后,就可以实现两者之间的交互了。

小练习

1、在只使用一个协议号的情况下,传递多种消息,这里给出一个思路就是使用 json 格式的字符串带携带消息。 2、试一试实际通过自己编写的示教器按钮来控制机器人运动,机器人运动的二次开发接口为