四足机器人高算力、低成本主控第五步:UDP网络通信与上位机

在STM32中我们使用USB虚拟串口完成与上位机的通讯,从而帮助我们更方便地监视机器人状态和调试参数,而在树莓派中我们已经采用Linux系统因此可以使用UDP网口来实现更高速更复杂的通讯,这里我们让树莓派作为服务器上位机作为客户端,简单来说UDP的通讯机制是客户端向服务器主动发送数据,客户端在收到数据后对其进行反馈,因此在使用UDP时我们需要先包上对应的头文件:

UDP通讯的关键是二者在一个IP端并且端口号一致,因此为方便每次启动的网络连接这里我们将树莓派IP设定为静态IP,编辑树莓派对应网络配置文件sudo nano/etc/dhcpcd.conf,在最后加上下面的代码,重启后用SSH查看是否能够连接:

# 指定接口 eth0
interface eth0
# 指定静态IP,/24表示子网掩码为 255.255.255.0
static ip_address=192.168.1.20/24
# 路由器/网关IP地址
static routers=192.168.1.1
# 手动自定义DNS服务器
static domain_name_servers=114.114.114.114

因此在树莓派中首先完成socket的配置,其SERV_PORT为最重要的端口号需要与客户端保持一致:

依据UDP通讯机制,首先等待客户端数据:

由于UDP是整包读取,这里我们还是采用中断状态机处理接收数据:

在处理完后进行数据发送,类似串口给数组赋值指定发送长度即可:

则编译运行后用网线连接PC与树莓派,并可以采用如下的Python脚本测试,首先确保目标机IP和端口为树莓派:

之后客户端主发送:

发送完毕后读取服务器反馈:

备注:上述例子中给了UDP基本通讯案例,处理可以与PC上位机通讯外还可以实现与其他控制器的通讯,如采用JetsonNano实现深度学习将结果用UDP与树莓派通讯等,上述Demo可以通过运行OCU上位机选择UDP通讯模式后在控制界面进行按键打印测试,当然可以看到UDP机制下服务器在等待数据中处于阻塞状态这也是为什么需要多线程来管理,保证正常的导航算法不会被阻塞,另外使用多进程的原因也是因为UDP服务器死机后客户端往往需要重启才能连接,因此在我们调试中不希望修改代码后程序重启而上位机也需要重启,这也是为何在MOCO-ML工程模板中控制位一个独立任务,导航和OCU通讯为另一任务,这样我们调试控制算中导航任务不会被杀死,则上位机通讯也得以保证;

综上,通过5个步骤已经能自己构建一个类似MIT Upboard用于机器人运动控制的主控,当然其中很多部分还可以在继续优化,我也为此构建了一个采用树莓派为核心的开发板,欢迎大家后续预定关注:

MOCO-Pihat是一个面向高性能机器人运动控制的树莓派载板(提供安装好RT实时补打的镜像和安装教程),其采用STM32F4单片机作为主控制器,其具有两个典型固件模型,设计参考MIT Mini-Cheetha和Mjbot等方案,提供了两个主要的固件模式,采用同一套硬件完成(A)独立主控模式:可以直接在控制器中编程完成运动控制开发,可作为STM32学习用的开发板;(B)ARM载板模式:可作为如树莓派的IO载板,采集传感器数据并接受控制命令以CAN总线发送出去;(C)四足机器人运动控制器,控制器板载基本的IMU运动传感器,以CAN总线作为主要伺服控制接口完成与ODrive的通讯,另外预留USB可以连接上位机监控底层力控数据,并实现遥控、参数调节和状态切换,欢迎关注该开发板!