《鴻蒙機器人編程》課件-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

提交評論