《鸿蒙机器人编程》课件-2.3 实现OpenHarmony与ROS的通讯_第1页
《鸿蒙机器人编程》课件-2.3 实现OpenHarmony与ROS的通讯_第2页
《鸿蒙机器人编程》课件-2.3 实现OpenHarmony与ROS的通讯_第3页
《鸿蒙机器人编程》课件-2.3 实现OpenHarmony与ROS的通讯_第4页
《鸿蒙机器人编程》课件-2.3 实现OpenHarmony与ROS的通讯_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

©NXROBO2023ROS与鸿蒙的通讯节点介绍课程说明开源鸿蒙开发板与ROS主控之间的通讯方式SPARK的通讯框架串口通讯的驱动实现开源鸿蒙与ROS的通讯©NXROBO20232开源鸿蒙开发板与ROS主控之间的通讯方式©NXROBO20233通讯方式©NXROBO20234开源鸿蒙开发板与ROS主控之间通过串口进行通信,通过USB数据线硬件连接进行通信。单片机通信接口的电平逻辑和NUC主机通信接口的电平逻辑不同,NUC主机上的通信接口有USB接口,相应电平逻辑遵照USB原则,开发板需通过USB转TTL模块才能正常与NUC进行数据交互。开发板串口©NXROBO20235开发板连接好拓展灯板后,拓展灯板已经连接好CH340E芯片,对应开发板串口1,并且提供type-c接口供开发者使用,故使用该口作为与NUC主控之间的通信。ROS主控串口©NXROBO20236ROS主控端的NUC提供标准的USB接口,可以使用ROS的serial功能包进行串口驱动的编写,利用serial提供的接口实现串口的读取与接收,与开源鸿蒙开发板进行交互。

由于Linux对不同串口的识别名称不固定,插拔后也需要重新赋予权限,所以还需考虑使用usb规则文件来为串口取固定别名以及赋予权限。固定串口别名©NXROBO20237Linux在使用串口读写数据时,经常面临插拔串口后需要重新给权限,还有可能串口的名字发生了改变,例如由ttyUSB0变为了ttyUSB1,为了让程序能够正确读取到开发板串口数据,且不用每次都修改代码,最好给开发板对应的串口固定为一个串口名字,同时给上权限,可根据设备ID或者USB口进行固定。根据设备ID固定根据设备芯片的设备ID来可以区分不同设备对应的USB,不同芯片的设备ID不同,但此方法不适用于有两个设备相同的情况。

根据USB口固定Linux设备的每个USB口的(KERNELS)是不同的且固定的,可以修改固定USB口开固定设备串口,此方法灵活性不高,设备必须接固定USB口。根据USB口固定串口©NXROBO202381查看USB对应的KERNEL2建立规则文件3串口映射成功SPARK的通讯框架©NXROBO20239硬件架构©NXROBO202310外设通过无线,内部通过串口和NUC通信,控制底盘。通信架构实现©NXROBO202311外设通过无线,内部通过串口和NUC通信,控制底盘。手机客户端手机端需进行无线连接,使用wifi,实现TCP客户端程序,用于发送控制指令到达星火派开发板。

星火派作为TCP服务端,接收客户端发来的机器人控制指令消息,并对消息进行处理。采用轻量级的TCP/IP协议栈LwIP进行标准的socket编程。作为机器人控制发送节点,需要编写串口驱动通过USB接口与NUC进行信息交互。

NUC作为机器人控制接收节点,正确配置好环境使能够识别到星火派,需要在ROS系统中适配好串口驱动,与星火派进行通信。作为机器人各个部件的控制中心,需要组织ROS通信节点,实现节点间的通信。无线控制通信©NXROBO202312星火派开发板通过无线的方式和外部设备通信,如手机,平板等;而通过无线控制实现方式有很多,如蓝牙、红外、LoRa、WiFi等,它们在应用场景、传输距离、数据传输速率等方面有所不同。蓝牙:主要用于短距离通信。其最大传输距离一般在10米左右,具有低功耗、低成本、简单易用等特点。红外:红外通信的距离相对较短,需要发送和接收端直接对准才能进行数据传输。它最大的优点是安全性高,但是受到环境因素的影响较大,如遮挡、强光等均会影响通信效果。LoRa:是一种低功耗、长距离、低速率的无线通信技术,适合于物联网等物联设备的连接和数据传输。它的传输距离可以达到数公里,但传输速率较慢。WiFi:是一种高速的无线局域网通信技术,支持高速数据传输和多用户同时访问。其传输距离较短,一般在100米左右。WiFi在家庭网络、企业办公中应用广泛,也是公共场所提供无线网络服务的主要技术之一。WIFI通信©NXROBO202313STA和AP在无线网络中是两个重要的概念,分别代表了不同的工作模式。即客户端,是指连接到一个已经存在的Wi-Fi网络上的设备。STA只拥有连接到Wi-Fi网络的基本权限,例如接收和发送数据,但不能创建Wi-Fi网络、给其他设备提供服务等。AP(AccessPoint)即接入点,是指创建并管理Wi-Fi网络的设备。AP允许其他设备(STA)通过Wi-Fi连接到它所创建的网络,并且可以对这些连接进行管理,例如限制连接数量、控制访问权限等。通常情况下,STA与AP是相互独立的,它们需要通过Wi-Fi信号来建立连接。当一个设备想要连接到一个Wi-Fi网络时,它首先会搜索周围可用的Wi-Fi信号,并找到合适的AP,然后向这个AP发起连接请求。如果连接成功,这个设备就成为了这个Wi-Fi网络的一个STA,可以开始使用网络提供的服务。本版本采用的是STA模式,连接热点或者路由,配置IP。TCP/IPUDP©NXROBO202314TCP(传输控制协议)和UDP(用户数据报协议)是两种常见的互联网传输协议。TCP是一种面向连接的协议,它提供可靠的、有序的、基于字节流的数据传输服务。TCP通过三次握手建立连接,然后在数据传输时进行确认和重传以确保数据可靠性,同时还可以实现流量控制和拥塞控制。TCP适用于要求数据传输可靠性和完整性的应用场景,如网页浏览、电子邮件、文件传输等。UDP是一种无连接的协议,它不提供可靠性和有序性保证,但是传输速度较快。UDP发送端将每个数据包独立地发送出去,接收端收到后直接使用,没有确认和重传机制。UDP适用于需要快速传输数据,但对数据传输可靠性和完整性要求不高的应用场景,如网络游戏、视频会议等。LwIP©NXROBO202315lwIP(轻量级IP协议栈)是一个开源的TCP/IP协议栈,设计用于在嵌入式系统中运行。它是一个小巧、高效、可移植的协议栈,通过最小化内存使用和代码大小,使得它非常适合于资源受限的嵌入式设备。lwIP提供了一系列常用的网络协议,包括IPv4/IPv6、TCP、UDP、ICMP、DNS等,在实现网络连接时提供了强大的功能。同时,lwIP还提供了一些高级特性,例如多个网络接口支持、RawAPI、SocketAPI、SNMP等,可以满足不同应用场景的需求。lwIP的代码极为精简,核心代码只有数十个文件,总代码量仅几十KB,因此非常适合在嵌入式系统中使用。同时,由于lwIP已被广泛应用于各种平台和应用领域,因此有很多社区资源可供参考。星火派的TCP协议也是通过移植的lwIP实现。串口通讯的驱动©NXROBO202316开发板串口驱动©NXROBO202317基于驱动开发介绍里的串口驱动接口,我们需要实现以下接口,提供用于与NUC进行串口通信的驱动。API接口说明voidUART_Init(void);串口初始化intUart_ReceiveData(char*data,unsignedintlen);串口接收数据intUart_SentData(char*data,unsignedintlen);串口发送数据开发板串口驱动©NXROBO202318void

UART_Init(void){

uint32_t

ret;

IotUartAttributeuart_attr

={

//波特率115200d、数据位8、停止位1、无奇偶检验位

.baudRate=

115200,

.dataBits=

8,

.stopBits=

1,

.parity=

0,

.rxBlock=

1,

};

IoTGpioInit(HI_GPIO_IDX_5);//初始化GPIO5

IoTGpioInit(HI_GPIO_IDX_6);//初始化GPIO6

hi_io_set_func(HI_GPIO_IDX_5,HI_IO_FUNC_GPIO_5_UART1_RXD);

hi_io_set_func(HI_GPIO_IDX_6,HI_IO_FUNC_GPIO_6_UART1_TXD);

//初始化串口

ret

=

IoTUartInit(UART_PORT,&uart_attr);

if(ret

!=IOT_SUCCESS)

{

printf("Failedtoinituart%d.",UART_PORT);

return;

}

}串口参数配置初始化引脚功能串口初始化开发板串口驱动©NXROBO202319串口接收采用超时机制,防止进程阻塞在等待串口接收导致其他功能无法正常运行。int

Uart_ReceiveData(char

*data,

unsigned

intlen){

uint16_t

rxlen

=0;

int

ret

=

0;

while(len

-

rxlen

>

0)

{

ret

=

hi_uart_read_timeout(UART_PORT,(unsigned

char

*)data+rxlen,len-rxlen,20);

if(ret

==

0

&&

rxlen

!=

0)

{

return

rxlen;

}

else

{

rxlen

+=

ret;

}

}

return

rxlen;}

int

Uart_SentData(char

*data,

unsigned

intlen){

int

ret;

ret

=

IoTUartWrite(UART_PORT,(unsigned

char

*)data,len);

if(ret

==

-1)

{

printf("Uartwritedataerror!\r\n");

}

return

ret;}串口发送使用IoTUartWrite发送数据。ROS串口驱动©NXROBO202320在功能包下使用串口驱动时,需在对应CMakeList.txt的find_package添加serial。相关驱动参考hm_read_node.cpp(串口数据读取节点)以及hm_write_node.cpp(串口数据发送节点)开发板串口驱动©NXROBO202321初始化串口参数,设备名称,波特率等,打开串口。

serial::Serial_serial;

try

{

_serial.setPort("/dev/SPARK-HM-PI");

_serial.setBaudrate(115200);

serial::Timeoutto=serial::Timeout::simpleTimeout(1000);

_serial.setTimeout(to);

_serial.open();

ROS_INFO_STREAM("Porthasbeenopensuccessfully");

}

catch(serial::IOException&e)

{

ROS_ERROR_STREAM("Unabletoopenport");

return

-1;

}

if(_serial.isOpen())

{

ROS_INFO_STREAM("Portisopen");

}

while(ros::ok())

{

if(_serial.available())

{

result.data.clear();

result.data

=

_serial.read(_serial.available()); /*在此处进行数据解析*/ }}循环读取串口数据,将读取的数据存放在result.data中,之后可进行数据解析。开发板串口驱动©NXROBO202322同样初始化并打开串口

serial::Serial_serial;

try

{

_serial.setPort("/dev/SPARK-HM-PI");

_serial.setBaudrate(115200);

serial::Timeoutto=serial::Timeout::simpleTimeout(1000);

_serial.setTimeout(to);

_serial.open();

ROS_INFO_STREAM("Porthasbeenopensuccessfully");

}

catch(serial::IOException&e)

{

ROS_INFO_STREAM("Unabletoopenport");

return

-1;

}

if(_serial.isOpen())

{

ROS_INFO_STREAM("Portisopen");

}

_serial.write(msg->data);

调用write进行数据发送实现开源鸿蒙与ROS的通讯©NXROBO202323实现开源鸿蒙与ROS的通讯©NXROBO202324示例:在实际机器人开发中,需要开源鸿蒙开发板作为控制节点发送控制指令到NUC中,下面这个示例将模拟发送指令,复现开源鸿蒙与ROS的通讯的实现过程。static

void

SPARK_Uart_Task(void){

int

i

=

0;

char

*data

=

"HereisSPARK-HM-PI:";

char

uart_buff[UART_BUFF_SIZE]={0};

UART_Init();

while(1)

{

sprintf(uart_buff,"%s%d\n",data,i);

Uart_SentData(uart_buff,sizeof(uart_buff));

i++;

usleep(1000000);

}}

尝试使用上一节写好的串口驱动,在开源鸿蒙端给NUC端不断发送信息,串口任务示例代码如下。具体可参考spark_uart案例。ROS端实现©NXROBO202325在spark_hm_pi功能包中创建hm_uart_test节点,新建hm_uart_test.cpp文件,并将该节点驱动代码加入编译,在CMakeList.txt添加如下代码:add_executable(hm_uart_testsrc/hm_uart_test.cpp)target_link_libraries(hm_uart_test

${catkin_LIBRARIES})实现开源鸿蒙与ROS的通讯©NXROBO202326hm_uart_test.cpp实现:try

{

_serial.setPort("/dev/SPARK-HM-PI");

_serial.setBaudrate(115200);

serial::Timeoutto=

serial::Timeout::simpleTimeout(1000);

_serial.setTimeout(to);

_serial.open();

ROS_INFO_STREAM("Porthasbeenopensuccessfully");

}

catch(serial::IOException&e)

{

ROS_ERROR_STREAM("Unabletoopenport");

return

-1;

}

if

(_serial.isOpen())

{

ROS_INFO_STREAM("Portisopen");

}

while

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论