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

下載本文檔

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

文檔簡介

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

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

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

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

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

UART_Init(void){

uint32_t

ret;

IotUartAttributeuart_attr

={

//波特率115200d、數(shù)據(jù)位8、停止位1、無奇偶檢驗(yàn)位

.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ū)動(dòng)?NXROBO202319串口接收采用超時(shí)機(jī)制,防止進(jìn)程阻塞在等待串口接收導(dǎo)致其他功能無法正常運(yùn)行。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ū)動(dòng)?NXROBO202320在功能包下使用串口驅(qū)動(dòng)時(shí),需在對應(yīng)CMakeList.txt的find_package添加serial。相關(guān)驅(qū)動(dòng)參考hm_read_node.cpp(串口數(shù)據(jù)讀取節(jié)點(diǎn))以及hm_write_node.cpp(串口數(shù)據(jù)發(fā)送節(jié)點(diǎn))開發(fā)板串口驅(qū)動(dòng)?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()); /*在此處進(jìn)行數(shù)據(jù)解析*/ }}循環(huán)讀取串口數(shù)據(jù),將讀取的數(shù)據(jù)存放在result.data中,之后可進(jìn)行數(shù)據(jù)解析。開發(fā)板串口驅(qū)動(dòng)?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進(jìn)行數(shù)據(jù)發(fā)送實(shí)現(xiàn)開源鴻蒙與ROS的通訊?NXROBO202323實(shí)現(xiàn)開源鴻蒙與ROS的通訊?NXROBO202324示例:在實(shí)際機(jī)器人開發(fā)中,需要開源鴻蒙開發(fā)板作為控制節(jié)點(diǎn)發(fā)送控制指令到NUC中,下面這個(gè)示例將模擬發(fā)送指令,復(fù)現(xiàn)開源鴻蒙與ROS的通訊的實(shí)現(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ū)動(dòng),在開源鴻蒙端給NUC端不斷發(fā)送信息,串口任務(wù)示例代碼如下。具體可參考spark_uart案例。ROS端實(shí)現(xiàn)?NXROBO202325在spark_hm_pi功能包中創(chuàng)建hm_uart_test節(jié)點(diǎn),新建hm_uart_test.cpp文件,并將該節(jié)點(diǎn)驅(qū)動(dòng)代碼加入編譯,在CMakeList.txt添加如下代碼:add_executable(hm_uart_testsrc/hm_uart_test.cpp)target_link_libraries(hm_uart_test

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

最新文檔

評論

0/150

提交評論