《鴻蒙機器人編程》課件-2.3 實現(xiàn)OpenHarmony與ROS的通訊_第1頁
《鴻蒙機器人編程》課件-2.3 實現(xiàn)OpenHarmony與ROS的通訊_第2頁
《鴻蒙機器人編程》課件-2.3 實現(xiàn)OpenHarmony與ROS的通訊_第3頁
《鴻蒙機器人編程》課件-2.3 實現(xiàn)OpenHarmony與ROS的通訊_第4頁
《鴻蒙機器人編程》課件-2.3 實現(xiàn)OpenHarmony與ROS的通訊_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

?NXROBO2023ROS與鴻蒙的通訊節(jié)點介紹課程說明開源鴻蒙開發(fā)板與ROS主控之間的通訊方式SPARK的通訊框架串口通訊的驅(qū)動實現(xiàn)開源鴻蒙與ROS的通訊?NXROBO20232開源鴻蒙開發(fā)板與ROS主控之間的通訊方式?NXROBO20233通訊方式?NXROBO20234開源鴻蒙開發(fā)板與ROS主控之間通過串口進行通信,通過USB數(shù)據(jù)線硬件連接進行通信。單片機通信接口的電平邏輯和NUC主機通信接口的電平邏輯不同,NUC主機上的通信接口有USB接口,相應電平邏輯遵照USB原則,開發(fā)板需通過USB轉(zhuǎn)TTL模塊才能正常與NUC進行數(shù)據(jù)交互。開發(fā)板串口?NXROBO20235開發(fā)板連接好拓展燈板后,拓展燈板已經(jīng)連接好CH340E芯片,對應開發(fā)板串口1,并且提供type-c接口供開發(fā)者使用,故使用該口作為與NUC主控之間的通信。ROS主控串口?NXROBO20236ROS主控端的NUC提供標準的USB接口,可以使用ROS的serial功能包進行串口驅(qū)動的編寫,利用serial提供的接口實現(xiàn)串口的讀取與接收,與開源鴻蒙開發(fā)板進行交互。

由于Linux對不同串口的識別名稱不固定,插拔后也需要重新賦予權(quán)限,所以還需考慮使用usb規(guī)則文件來為串口取固定別名以及賦予權(quán)限。固定串口別名?NXROBO20237Linux在使用串口讀寫數(shù)據(jù)時,經(jīng)常面臨插拔串口后需要重新給權(quán)限,還有可能串口的名字發(fā)生了改變,例如由ttyUSB0變?yōu)榱藅tyUSB1,為了讓程序能夠正確讀取到開發(fā)板串口數(shù)據(jù),且不用每次都修改代碼,最好給開發(fā)板對應的串口固定為一個串口名字,同時給上權(quán)限,可根據(jù)設(shè)備ID或者USB口進行固定。根據(jù)設(shè)備ID固定根據(jù)設(shè)備芯片的設(shè)備ID來可以區(qū)分不同設(shè)備對應的USB,不同芯片的設(shè)備ID不同,但此方法不適用于有兩個設(shè)備相同的情況。

根據(jù)USB口固定Linux設(shè)備的每個USB口的(KERNELS)是不同的且固定的,可以修改固定USB口開固定設(shè)備串口,此方法靈活性不高,設(shè)備必須接固定USB口。根據(jù)USB口固定串口?NXROBO202381查看USB對應的KERNEL2建立規(guī)則文件3串口映射成功SPARK的通訊框架?NXROBO20239硬件架構(gòu)?NXROBO202310外設(shè)通過無線,內(nèi)部通過串口和NUC通信,控制底盤。通信架構(gòu)實現(xiàn)?NXROBO202311外設(shè)通過無線,內(nèi)部通過串口和NUC通信,控制底盤。手機客戶端手機端需進行無線連接,使用wifi,實現(xiàn)TCP客戶端程序,用于發(fā)送控制指令到達星火派開發(fā)板。

星火派作為TCP服務端,接收客戶端發(fā)來的機器人控制指令消息,并對消息進行處理。采用輕量級的TCP/IP協(xié)議棧LwIP進行標準的socket編程。作為機器人控制發(fā)送節(jié)點,需要編寫串口驅(qū)動通過USB接口與NUC進行信息交互。

NUC作為機器人控制接收節(jié)點,正確配置好環(huán)境使能夠識別到星火派,需要在ROS系統(tǒng)中適配好串口驅(qū)動,與星火派進行通信。作為機器人各個部件的控制中心,需要組織ROS通信節(jié)點,實現(xiàn)節(jié)點間的通信。無線控制通信?NXROBO202312星火派開發(fā)板通過無線的方式和外部設(shè)備通信,如手機,平板等;而通過無線控制實現(xiàn)方式有很多,如藍牙、紅外、LoRa、WiFi等,它們在應用場景、傳輸距離、數(shù)據(jù)傳輸速率等方面有所不同。藍牙:主要用于短距離通信。其最大傳輸距離一般在10米左右,具有低功耗、低成本、簡單易用等特點。紅外:紅外通信的距離相對較短,需要發(fā)送和接收端直接對準才能進行數(shù)據(jù)傳輸。它最大的優(yōu)點是安全性高,但是受到環(huán)境因素的影響較大,如遮擋、強光等均會影響通信效果。LoRa:是一種低功耗、長距離、低速率的無線通信技術(shù),適合于物聯(lián)網(wǎng)等物聯(lián)設(shè)備的連接和數(shù)據(jù)傳輸。它的傳輸距離可以達到數(shù)公里,但傳輸速率較慢。WiFi:是一種高速的無線局域網(wǎng)通信技術(shù),支持高速數(shù)據(jù)傳輸和多用戶同時訪問。其傳輸距離較短,一般在100米左右。WiFi在家庭網(wǎng)絡(luò)、企業(yè)辦公中應用廣泛,也是公共場所提供無線網(wǎng)絡(luò)服務的主要技術(shù)之一。WIFI通信?NXROBO202313STA和AP在無線網(wǎng)絡(luò)中是兩個重要的概念,分別代表了不同的工作模式。即客戶端,是指連接到一個已經(jīng)存在的Wi-Fi網(wǎng)絡(luò)上的設(shè)備。STA只擁有連接到Wi-Fi網(wǎng)絡(luò)的基本權(quán)限,例如接收和發(fā)送數(shù)據(jù),但不能創(chuàng)建Wi-Fi網(wǎng)絡(luò)、給其他設(shè)備提供服務等。AP(AccessPoint)即接入點,是指創(chuàng)建并管理Wi-Fi網(wǎng)絡(luò)的設(shè)備。AP允許其他設(shè)備(STA)通過Wi-Fi連接到它所創(chuàng)建的網(wǎng)絡(luò),并且可以對這些連接進行管理,例如限制連接數(shù)量、控制訪問權(quán)限等。通常情況下,STA與AP是相互獨立的,它們需要通過Wi-Fi信號來建立連接。當一個設(shè)備想要連接到一個Wi-Fi網(wǎng)絡(luò)時,它首先會搜索周圍可用的Wi-Fi信號,并找到合適的AP,然后向這個AP發(fā)起連接請求。如果連接成功,這個設(shè)備就成為了這個Wi-Fi網(wǎng)絡(luò)的一個STA,可以開始使用網(wǎng)絡(luò)提供的服務。本版本采用的是STA模式,連接熱點或者路由,配置IP。TCP/IPUDP?NXROBO202314TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)是兩種常見的互聯(lián)網(wǎng)傳輸協(xié)議。TCP是一種面向連接的協(xié)議,它提供可靠的、有序的、基于字節(jié)流的數(shù)據(jù)傳輸服務。TCP通過三次握手建立連接,然后在數(shù)據(jù)傳輸時進行確認和重傳以確保數(shù)據(jù)可靠性,同時還可以實現(xiàn)流量控制和擁塞控制。TCP適用于要求數(shù)據(jù)傳輸可靠性和完整性的應用場景,如網(wǎng)頁瀏覽、電子郵件、文件傳輸?shù)?。UDP是一種無連接的協(xié)議,它不提供可靠性和有序性保證,但是傳輸速度較快。UDP發(fā)送端將每個數(shù)據(jù)包獨立地發(fā)送出去,接收端收到后直接使用,沒有確認和重傳機制。UDP適用于需要快速傳輸數(shù)據(jù),但對數(shù)據(jù)傳輸可靠性和完整性要求不高的應用場景,如網(wǎng)絡(luò)游戲、視頻會議等。LwIP?NXROBO202315lwIP(輕量級IP協(xié)議棧)是一個開源的TCP/IP協(xié)議棧,設(shè)計用于在嵌入式系統(tǒng)中運行。它是一個小巧、高效、可移植的協(xié)議棧,通過最小化內(nèi)存使用和代碼大小,使得它非常適合于資源受限的嵌入式設(shè)備。lwIP提供了一系列常用的網(wǎng)絡(luò)協(xié)議,包括IPv4/IPv6、TCP、UDP、ICMP、DNS等,在實現(xiàn)網(wǎng)絡(luò)連接時提供了強大的功能。同時,lwIP還提供了一些高級特性,例如多個網(wǎng)絡(luò)接口支持、RawAPI、SocketAPI、SNMP等,可以滿足不同應用場景的需求。lwIP的代碼極為精簡,核心代碼只有數(shù)十個文件,總代碼量僅幾十KB,因此非常適合在嵌入式系統(tǒng)中使用。同時,由于lwIP已被廣泛應用于各種平臺和應用領(lǐng)域,因此有很多社區(qū)資源可供參考。星火派的TCP協(xié)議也是通過移植的lwIP實現(xiàn)。串口通訊的驅(qū)動?NXROBO202316開發(fā)板串口驅(qū)動?NXROBO202317基于驅(qū)動開發(fā)介紹里的串口驅(qū)動接口,我們需要實現(xiàn)以下接口,提供用于與NUC進行串口通信的驅(qū)動。API接口說明voidUART_Init(void);串口初始化intUart_ReceiveData(char*data,unsignedintlen);串口接收數(shù)據(jù)intUart_SentData(char*data,unsignedintlen);串口發(fā)送數(shù)據(jù)開發(fā)板串口驅(qū)動?NXROBO202318void

UART_Init(void){

uint32_t

ret;

IotUartAttributeuart_attr

={

//波特率115200d、數(shù)據(jù)位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;

}

}串口參數(shù)配置初始化引腳功能串口初始化開發(fā)板串口驅(qū)動?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;}串口發(fā)送使用IoTUartWrite發(fā)送數(shù)據(jù)。ROS串口驅(qū)動?NXROBO202320在功能包下使用串口驅(qū)動時,需在對應CMakeList.txt的find_package添加serial。相關(guān)驅(qū)動參考hm_read_node.cpp(串口數(shù)據(jù)讀取節(jié)點)以及hm_write_node.cpp(串口數(shù)據(jù)發(fā)送節(jié)點)開發(fā)板串口驅(qū)動?NXROBO202321初始化串口參數(shù),設(shè)備名稱,波特率等,打開串口。

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()); /*在此處進行數(shù)據(jù)解析*/ }}循環(huán)讀取串口數(shù)據(jù),將讀取的數(shù)據(jù)存放在result.data中,之后可進行數(shù)據(jù)解析。開發(fā)板串口驅(qū)動?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);

調(diào)用write進行數(shù)據(jù)發(fā)送實現(xiàn)開源鴻蒙與ROS的通訊?NXROBO202323實現(xiàn)開源鴻蒙與ROS的通訊?NXROBO202324示例:在實際機器人開發(fā)中,需要開源鴻蒙開發(fā)板作為控制節(jié)點發(fā)送控制指令到NUC中,下面這個示例將模擬發(fā)送指令,復現(xiàn)開源鴻蒙與ROS的通訊的實現(xiàn)過程。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);

}}

嘗試使用上一節(jié)寫好的串口驅(qū)動,在開源鴻蒙端給NUC端不斷發(fā)送信息,串口任務示例代碼如下。具體可參考spark_uart案例。ROS端實現(xiàn)?NXROBO202325在spark_hm_pi功能包中創(chuàng)建hm_uart_test節(jié)點,新建hm_uart_test.cpp文件,并將該節(jié)點驅(qū)動代碼加入編譯,在CMakeList.txt添加如下代碼:add_executable(hm_uart_testsrc/hm_uart_test.cpp)target_link_libraries(hm_uart_test

${catkin_LIBRARIES})實現(xiàn)開源鴻蒙與ROS的通訊?NXROBO202326hm_uart_test.cpp實現(xiàn):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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論