[{"data":1,"prerenderedAt":5198},["ShallowReactive",2],{"wiki-page-\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver":3,"wiki-doc-items-\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver":4888,"language-switcher-data-\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver":5182,"wiki-i18n-paths-\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver":5197},{"id":4,"title":5,"body":6,"canonicalPath":4870,"chapterDepth":229,"chapterOrder":4871,"date":4872,"description":188,"docI18nKey":4873,"docKey":4874,"docRoot":4875,"docTitle":4876,"extension":4877,"i18nKey":4878,"isBlogPost":4879,"isWikiDoc":254,"isWikiIndex":4879,"layout":4880,"legacyPath":4880,"locale":4881,"localeSlug":4882,"meta":4883,"navigation":254,"path":4870,"seo":4884,"sourcePath":4885,"sourceStem":4878,"stem":4886,"wikiDepth":195,"__hash__":4887},"content\u002F_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2_serial_driver.md","ROS2 Serial Driver Library",{"type":7,"value":8,"toc":4866},"minimark",[9,14,18,26,30,33,36,39,45,51,54,59,62,74,88,101,125,131,135,138,141,144,147,151,157,175,182,317,323,326,331,341,347,363,368,377,393,398,404,455,458,462,467,484,489,527,534,538,544,584,595,601,606,611,616,623,626,633,640,645,650,672,676,679,682,687,694,697,700,703,706,709,715,720,723,727,732,739,742,752,757,762,772,777,1877,1882,1887,1891,1895,2793,2798,2802,3658,3663,3667,4833,4838,4846,4850,4862],[10,11,13],"h3",{"id":12},"ros1-serial-library-11","ROS1 Serial Library 1.1",[15,16,17],"p",{},"This is a ROS1 library, but it can also be compiled from third-party source code for use with ROS2.",[15,19,20],{},[21,22,23],"a",{"href":23,"rel":24},"http:\u002F\u002Fwjwwood.io\u002Fserial\u002Fdoc\u002F1.1.0\u002Findex.html",[25],"nofollow",[10,27,29],{"id":28},"ros2-serial-library-12","ROS2 Serial Library 1.2",[15,31,32],{},"As the name suggests, it is a serial port packet.",[15,34,35],{},"This library is compatible with ROS Humble and ROS Jazzy versions.",[15,37,38],{},"Official Detailed Explanation:",[15,40,41],{},[21,42,43],{"href":43,"rel":44},"https:\u002F\u002Fdocs.ros.org\u002Fen\u002Fhumble\u002Fp\u002Fserial_driver\u002Fgenerated\u002Findex.html#",[25],[15,46,47],{},[21,48,49],{"href":49,"rel":50},"https:\u002F\u002Findex.ros.org\u002Fp\u002Fserial_driver\u002F",[25],[15,52,53],{},"Below is a tutorial handcrafted based on the official documentation (as of the time this tutorial was created, there wasn't a single decent tutorial available yet).",[55,56,58],"h4",{"id":57},"the-serialdriver-library-features","The SerialDriver library features",[15,60,61],{},"This library is primarily based on the Boost.Asio library, so the underlying principle is the characteristic of Boost.Asio:",[15,63,64,68,69,73],{},[65,66,67],"strong",{},"Event-driven"," Boost.Asio uses the underlying I\u002FO multiplexing mechanisms provided by the operating system (such as Linux's ",[70,71,72],"code",{},"epoll",", Windows' I\u002FO Completion Ports) to monitor file descriptors (e.g., serial ports, sockets) for available data. When data arrives, the corresponding event is triggered.",[15,75,76,79,80,83,84,87],{},[65,77,78],{},"Callback Mechanism"," When a user calls an asynchronous method (such as ",[70,81,82],{},"async_read"," or ",[70,85,86],{},"async_receive","), a callback function is passed in. When the specified event (such as data reception completion) occurs, Boost.Asio automatically invokes the user-provided callback function.",[15,89,90,93,94,83,97,100],{},[65,91,92],{},"I\u002FO Service Object"," The core of Boost.Asio is an ",[70,95,96],{},"io_service",[70,98,99],{},"io_context"," object that manages all asynchronous operations and the scheduling of callbacks. When receiving asynchronously:",[102,103,104,114,119],"ul",{},[105,106,107,108,110,111,113],"li",{},"The user registers operations (such as ",[70,109,86],{},") into ",[70,112,99],{},".",[105,115,116,118],{},[70,117,99],{}," suspends the asynchronous operation and waits for an I\u002FO event to trigger.",[105,120,121,122,124],{},"When an I\u002FO event is triggered, ",[70,123,99],{}," calls the corresponding callback function.",[15,126,127,130],{},[65,128,129],{},"Does not block the main thread"," Asynchronous operations do not block the calling thread. The main thread can continue executing other tasks while the asynchronous operation completes in the background.",[55,132,134],{"id":133},"based-on-the-advantages-of-the-boostasio-library","Based on the advantages of the Boost.Asio library",[15,136,137],{},"The Boost.Asio library triggers events through system I\u002FO and spawns a separate thread to handle this task. As a result, the Boost library combines the characteristics of a microcontroller's serial port interrupt with the features of true multithreading.",[15,139,140],{},"However, although the serial port interrupt of a microcontroller can also trigger events through I\u002FO, since the microcontroller has only one real thread, entering an interrupt will inevitably block the main thread, resulting in a loss of efficiency.",[15,142,143],{},"If you directly receive data in the main thread and add an infinite loop with delays, this approach is often the least efficient and carries significant security risks. It is strongly not recommended.",[15,145,146],{},"Efficiency: Boost.Asio reception >> Microcontroller serial interrupt >> Multithreaded blocking reception >> Single-threaded blocking reception (when transmission speed is very fast, all are far greater than >>)",[55,148,150],{"id":149},"install-the-ros2-serial-package","Install the ROS2 serial package",[15,152,153,156],{},[65,154,155],{},"serial_driver"," is a library encapsulating serial communication functionality, consisting of two parts:",[102,158,159,169],{},[105,160,161,164,165,168],{},[65,162,163],{},"ROS2 Dependency Version",": Used in the ROS2 environment, it relies on ROS2 communication mechanisms (such as ",[70,166,167],{},"rclcpp",").",[105,170,171,174],{},[65,172,173],{},"Standalone Library Version",": Does not depend on ROS2 and can be used directly in a regular C++ project. (Untested)",[176,177,179],"h5",{"id":178},"method-1-install-in-ros2",[65,180,181],{},"Method 1: Install in ROS2",[183,184,189],"pre",{"className":185,"code":186,"language":187,"meta":188,"style":188},"language-bash shiki shiki-themes github-light github-dark","sudo apt install ros-\u003Cros2-distro>-asio-cmake-module\nsudo apt install ros-\u003Cros2-distro>-serial-driver\n\n#humble\nsudo apt install ros-humble-asio-cmake-module\nsudo apt install ros-humble-serial-driver\n#jazzy\nsudo apt install ros-jazzy-asio-cmake-module\nsudo apt install ros-jazzy-serial-driver\n","bash","",[70,190,191,227,249,256,263,275,287,293,305],{"__ignoreMap":188},[192,193,196,200,204,207,210,214,217,221,224],"span",{"class":194,"line":195},"line",1,[192,197,199],{"class":198},"sScJk","sudo",[192,201,203],{"class":202},"sZZnC"," apt",[192,205,206],{"class":202}," install",[192,208,209],{"class":202}," ros-",[192,211,213],{"class":212},"szBVR","\u003C",[192,215,216],{"class":202},"ros2-distr",[192,218,220],{"class":219},"sVt8B","o",[192,222,223],{"class":212},">",[192,225,226],{"class":202},"-asio-cmake-module\n",[192,228,230,232,234,236,238,240,242,244,246],{"class":194,"line":229},2,[192,231,199],{"class":198},[192,233,203],{"class":202},[192,235,206],{"class":202},[192,237,209],{"class":202},[192,239,213],{"class":212},[192,241,216],{"class":202},[192,243,220],{"class":219},[192,245,223],{"class":212},[192,247,248],{"class":202},"-serial-driver\n",[192,250,252],{"class":194,"line":251},3,[192,253,255],{"emptyLinePlaceholder":254},true,"\n",[192,257,259],{"class":194,"line":258},4,[192,260,262],{"class":261},"sJ8bj","#humble\n",[192,264,266,268,270,272],{"class":194,"line":265},5,[192,267,199],{"class":198},[192,269,203],{"class":202},[192,271,206],{"class":202},[192,273,274],{"class":202}," ros-humble-asio-cmake-module\n",[192,276,278,280,282,284],{"class":194,"line":277},6,[192,279,199],{"class":198},[192,281,203],{"class":202},[192,283,206],{"class":202},[192,285,286],{"class":202}," ros-humble-serial-driver\n",[192,288,290],{"class":194,"line":289},7,[192,291,292],{"class":261},"#jazzy\n",[192,294,296,298,300,302],{"class":194,"line":295},8,[192,297,199],{"class":198},[192,299,203],{"class":202},[192,301,206],{"class":202},[192,303,304],{"class":202}," ros-jazzy-asio-cmake-module\n",[192,306,308,310,312,314],{"class":194,"line":307},9,[192,309,199],{"class":198},[192,311,203],{"class":202},[192,313,206],{"class":202},[192,315,316],{"class":202}," ros-jazzy-serial-driver\n",[176,318,320],{"id":319},"method-2-general-this-method-has-not-been-tested-if-you-test-it-please-help-delete-this-sentence",[65,321,322],{},"Method 2: General (This method has not been tested. If you test it, please help delete this sentence.)",[15,324,325],{},"If you are using ROS1 or another environment and have not installed ROS2, please choose this method.",[15,327,328],{},[65,329,330],{},"Clone the repository",[15,332,333,334,337,338,340],{},"First, clone the ",[65,335,336],{},"transport_drivers"," repository (including ",[70,339,155],{},"):",[15,342,343],{},[21,344,345],{"href":345,"rel":346},"https:\u002F\u002Fgithub.com\u002Fros-drivers\u002Ftransport_drivers",[25],[183,348,350],{"className":185,"code":349,"language":187,"meta":188,"style":188},"git clone https:\u002F\u002Fgithub.com\u002Fros-drivers\u002Ftransport_drivers.git\n",[70,351,352],{"__ignoreMap":188},[192,353,354,357,360],{"class":194,"line":195},[192,355,356],{"class":198},"git",[192,358,359],{"class":202}," clone",[192,361,362],{"class":202}," https:\u002F\u002Fgithub.com\u002Fros-drivers\u002Ftransport_drivers.git\n",[15,364,365],{},[65,366,367],{},"Install Dependencies",[15,369,370,372,373,376],{},[70,371,155],{}," depends on the ",[65,374,375],{},"ASIO"," library (a cross-platform C++ network programming library). Make sure ASIO is installed on your system:",[183,378,380],{"className":185,"code":379,"language":187,"meta":188,"style":188},"sudo apt install libasio-dev\n",[70,381,382],{"__ignoreMap":188},[192,383,384,386,388,390],{"class":194,"line":195},[192,385,199],{"class":198},[192,387,203],{"class":202},[192,389,206],{"class":202},[192,391,392],{"class":202}," libasio-dev\n",[15,394,395],{},[65,396,397],{},"Compiling a Standalone Library",[15,399,400,401,403],{},"Enter the ",[70,402,155],{}," directory and compile:",[183,405,407],{"className":185,"code":406,"language":187,"meta":188,"style":188},"cd transport_drivers\u002Fserial_driver\nmkdir build\ncd build\ncmake ..\nmake\nsudo make install\n",[70,408,409,418,426,432,440,445],{"__ignoreMap":188},[192,410,411,415],{"class":194,"line":195},[192,412,414],{"class":413},"sj4cs","cd",[192,416,417],{"class":202}," transport_drivers\u002Fserial_driver\n",[192,419,420,423],{"class":194,"line":229},[192,421,422],{"class":198},"mkdir",[192,424,425],{"class":202}," build\n",[192,427,428,430],{"class":194,"line":251},[192,429,414],{"class":413},[192,431,425],{"class":202},[192,433,434,437],{"class":194,"line":258},[192,435,436],{"class":198},"cmake",[192,438,439],{"class":202}," ..\n",[192,441,442],{"class":194,"line":265},[192,443,444],{"class":198},"make\n",[192,446,447,449,452],{"class":194,"line":277},[192,448,199],{"class":198},[192,450,451],{"class":202}," make",[192,453,454],{"class":202}," install\n",[15,456,457],{},"Once installed, simply add the package normally in CMake.",[176,459,461],{"id":460},"other-preparatory-work","Other preparatory work",[15,463,464],{},[65,465,466],{},"Serial Debug Assistant Installation (Linux Version) (If you need the Windows version, ask the control group)",[183,468,470],{"className":185,"code":469,"language":187,"meta":188,"style":188},"sudo apt-get install cutecom\n",[70,471,472],{"__ignoreMap":188},[192,473,474,476,479,481],{"class":194,"line":195},[192,475,199],{"class":198},[192,477,478],{"class":202}," apt-get",[192,480,206],{"class":202},[192,482,483],{"class":202}," cutecom\n",[15,485,486],{},[65,487,488],{},"Permissions",[183,490,492],{"className":185,"code":491,"language":187,"meta":188,"style":188},"\n# 将用户权限提高\nsudo usermod -aG dialout $USER\nnewgrp dialout\n",[70,493,494,498,503,519],{"__ignoreMap":188},[192,495,496],{"class":194,"line":195},[192,497,255],{"emptyLinePlaceholder":254},[192,499,500],{"class":194,"line":229},[192,501,502],{"class":261},"# 将用户权限提高\n",[192,504,505,507,510,513,516],{"class":194,"line":251},[192,506,199],{"class":198},[192,508,509],{"class":202}," usermod",[192,511,512],{"class":413}," -aG",[192,514,515],{"class":202}," dialout",[192,517,518],{"class":219}," $USER\n",[192,520,521,524],{"class":194,"line":258},[192,522,523],{"class":198},"newgrp",[192,525,526],{"class":202}," dialout\n",[15,528,529,530,113],{},"For more operations related to Linux USB devices, please refer to the ",[21,531,533],{"href":532},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0900-qi-ta-cao-zuo#usb%E7%AB%AF%E5%8F%A3%E8%AE%BE%E7%BD%AE","Vinci Robotics Team Linux Beginner Tutorial",[55,535,537],{"id":536},"initialization-details","Initialization Details",[539,540,541],"ol",{},[105,542,543],{},"Create a function package",[183,545,547],{"className":185,"code":546,"language":187,"meta":188,"style":188},"ros2 pkg create cpp01_serial --build-type ament_cmake --dependencies rclcpp serial_driver --node-name demo01_uart_send\n",[70,548,549],{"__ignoreMap":188},[192,550,551,554,557,560,563,566,569,572,575,578,581],{"class":194,"line":195},[192,552,553],{"class":198},"ros2",[192,555,556],{"class":202}," pkg",[192,558,559],{"class":202}," create",[192,561,562],{"class":202}," cpp01_serial",[192,564,565],{"class":413}," --build-type",[192,567,568],{"class":202}," ament_cmake",[192,570,571],{"class":413}," --dependencies",[192,573,574],{"class":202}," rclcpp",[192,576,577],{"class":202}," serial_driver",[192,579,580],{"class":413}," --node-name",[192,582,583],{"class":202}," demo01_uart_send\n",[539,585,586,592],{"start":229},[105,587,588,589],{},"Include the header file: ",[70,590,591],{},"#include \"serial_driver\u002Fserial_driver.hpp\"",[105,593,594],{},"First, initialize the serial port:",[15,596,597],{},[598,599],"img",{"alt":188,"src":600},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1772.webp",[15,602,603],{},[598,604],{"alt":188,"src":605},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1773.webp",[15,607,608],{},[598,609],{"alt":188,"src":610},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1774.webp",[15,612,613],{},[598,614],{"alt":188,"src":615},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1775.webp",[15,617,618,619,622],{},"The serial port initialization function ",[70,620,621],{},"init_port()"," has two parameters.",[15,624,625],{},"The first parameter device_name is the port name.",[15,627,628,629,632],{},"The second parameter, ",[70,630,631],{},"config",", is the serial port parameter settings.",[15,634,635,636,639],{},"The device_name is a string, which specifies the device name under the ",[70,637,638],{},"\u002Fdev"," directory.",[15,641,642],{},[598,643],{"alt":188,"src":644},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1776.webp",[15,646,647],{},[598,648],{"alt":188,"src":649},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1777.webp",[183,651,653],{"className":185,"code":652,"language":187,"meta":188,"style":188},"ls \u002Fdev | grep USB\n",[70,654,655],{"__ignoreMap":188},[192,656,657,660,663,666,669],{"class":194,"line":195},[192,658,659],{"class":198},"ls",[192,661,662],{"class":202}," \u002Fdev",[192,664,665],{"class":212}," |",[192,667,668],{"class":198}," grep",[192,670,671],{"class":202}," USB\n",[15,673,529,674,113],{},[21,675,533],{"href":532},[15,677,678],{},"config is a class object, so you need to create an instance of this class as follows:",[15,680,681],{},"This thing is a lightweight class, so there's no need to place it on the heap; just create it directly on the stack.",[15,683,684],{},[598,685],{"alt":188,"src":686},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1778.webp",[15,688,689,690,693],{},"SerialPortConfig(uint32_t baud_rate, ",[65,691,692],{},"drivers::serial_driver::FlowControl flow_control"," , drivers::serial_driver::Parity parity, drivers::serial_driver::StopBits stop_bits)",[15,695,696],{},"From this overloaded function, you can see (ask the control group if you don't understand the parameters).",[15,698,699],{},"The first parameter is baud_rate, the baud rate.",[15,701,702],{},"The second parameter, flow_control, is for flow control.",[15,704,705],{},"The third parameter, parity, is used for parity checking.",[15,707,708],{},"The fourth parameter stop_bits stop bits",[15,710,711,712,113],{},"The specific parameters are in ",[70,713,714],{},"serial_port.hpp",[15,716,717],{},[598,718],{"alt":188,"src":719},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1779.webp",[15,721,722],{},"The serial port has been successfully initialized.",[55,724,726],{"id":725},"detailed-explanation-of-the-code","Detailed explanation of the code",[539,728,729],{},[105,730,731],{},"Send main logic",[15,733,734,735,738],{},"Next, we will write the main sending logic. First, we need to create a delay. Instead of using a blocking loop like ",[70,736,737],{},"while(true)",", ROS2 provides a timer.",[15,740,741],{},"First, create a timer (no need to go into detail about creating a timer; if you don't understand, review Teacher Zhao's video above).",[15,743,744,745,748,749,113],{},"One thing to note is that we are using ",[65,746,747],{},"milliseconds",", not ",[65,750,751],{},"microseconds",[15,753,754],{},[598,755],{"alt":188,"src":756},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1780.webp",[15,758,759],{},[598,760],{"alt":188,"src":761},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1781.webp",[15,763,764,765,768,769,113],{},"The core function is this ",[70,766,767],{},"send"," function. As you can see, the input parameter is a vector of type ",[70,770,771],{},"vector",[15,773,774],{},[598,775],{"alt":188,"src":776},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1782.webp",[183,778,782],{"className":779,"code":780,"language":781,"meta":188,"style":188},"language-cpp shiki shiki-themes github-light github-dark","#include \"rclcpp\u002Frclcpp.hpp\"\n#include \"serial_driver\u002Fserial_driver.hpp\"\n\nclass Serial_Node : public rclcpp::Node\n{\npublic:\n  Serial_Node() : Node(\"serial_node_cpp\")\n  {\n    \u002F\u002F 等设备准备好再初始化\n    \u002F\u002F std::this_thread::sleep_for(std::chrono::milliseconds(500));\n\n    \u002F\u002F 串口设备名（根据实际设备调整）\n    const std::string device_name = \"\u002Fdev\u002FttyUSB0\";\n\n    RCLCPP_INFO(this->get_logger(), \"Serial port Node Open!\");\n    \u002F\u002F 创建串口配置对象\n    \u002F\u002F 波特率115200；不开启流控制；无奇偶效验；停止位1。\n    drivers::serial_driver::SerialPortConfig config(\n        9600,\n        drivers::serial_driver::FlowControl::NONE,\n        drivers::serial_driver::Parity::NONE,\n        drivers::serial_driver::StopBits::ONE);\n\n    \u002F\u002F 初始化串口\n    try\n    {\n      io_context_ = std::make_shared\u003Cdrivers::common::IoContext>(1);\n      \u002F\u002F 初始化 serial_driver_\n      serial_driver_ = std::make_shared\u003Cdrivers::serial_driver::SerialDriver>(*io_context_);\n      serial_driver_->init_port(device_name, config);\n      serial_driver_->port()->open();\n\n      RCLCPP_INFO(this->get_logger(), \"Serial port initialized successfully\");\n      RCLCPP_INFO(this->get_logger(), \"Using device: %s\", serial_driver_->port().get()->device_name().c_str());\n      RCLCPP_INFO(this->get_logger(), \"Baud_rate: %d\", config.get_baud_rate());\n    }\n    catch (const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Failed to initialize serial port: %s\", ex.what());\n      return;\n    }\n\n    \u002F\u002F 设置发送定时器\n    send_timer_ = this->create_wall_timer(\n        std::chrono::milliseconds(500),\n        std::bind(&Serial_Node::send_message_timer_callback, this));\n  }\n\nprivate:\n  void send_message_timer_callback()\n  {\n    \u002F\u002F 发送一串字符串\n    const std::string message = \"Hello from ROS 2!\\n\";\n    std::vector\u003Cuint8_t> data(message.begin(), message.end());\n    \u002F\u002F std::vector\u003Cuint8_t> hex_data = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; \u002F\u002F \"Hello\" in ASCII\n    auto port = serial_driver_->port();\n\n    try\n    {\n      size_t bytes_sent_size = port->send(data);\n      RCLCPP_INFO(this->get_logger(), \"Sent: %s (%ld bytes)\", message.c_str(), bytes_sent_size);\n    }\n    catch(const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Error Transmiting from serial port:%s\",ex.what());\n    }\n  }\n\n  std::shared_ptr\u003Cdrivers::serial_driver::SerialDriver> serial_driver_;\n  std::shared_ptr\u003Cdrivers::common::IoContext> io_context_;\n  rclcpp::TimerBase::SharedPtr send_timer_;\n};\n\nint main(int argc, char **argv)\n{\n  rclcpp::init(argc, argv);\n\n  auto node = std::make_shared\u003CSerial_Node>();\n\n  rclcpp::spin(node);\n\n  rclcpp::shutdown();\n  return 0;\n}\n","cpp",[70,783,784,792,799,803,825,830,835,855,860,865,871,876,882,903,908,934,940,946,964,973,991,1007,1024,1029,1035,1041,1047,1085,1091,1126,1138,1155,1160,1181,1229,1260,1266,1289,1294,1325,1333,1338,1343,1349,1367,1390,1415,1421,1426,1432,1444,1449,1455,1477,1506,1515,1533,1538,1543,1548,1567,1603,1608,1625,1630,1659,1664,1669,1674,1699,1722,1736,1742,1747,1778,1783,1796,1801,1825,1830,1843,1848,1860,1871],{"__ignoreMap":188},[192,785,786,789],{"class":194,"line":195},[192,787,788],{"class":212},"#include",[192,790,791],{"class":202}," \"rclcpp\u002Frclcpp.hpp\"\n",[192,793,794,796],{"class":194,"line":229},[192,795,788],{"class":212},[192,797,798],{"class":202}," \"serial_driver\u002Fserial_driver.hpp\"\n",[192,800,801],{"class":194,"line":251},[192,802,255],{"emptyLinePlaceholder":254},[192,804,805,808,811,814,817,819,822],{"class":194,"line":258},[192,806,807],{"class":212},"class",[192,809,810],{"class":198}," Serial_Node",[192,812,813],{"class":219}," : ",[192,815,816],{"class":212},"public",[192,818,574],{"class":198},[192,820,821],{"class":219},"::",[192,823,824],{"class":198},"Node\n",[192,826,827],{"class":194,"line":265},[192,828,829],{"class":219},"{\n",[192,831,832],{"class":194,"line":277},[192,833,834],{"class":212},"public:\n",[192,836,837,840,843,846,849,852],{"class":194,"line":289},[192,838,839],{"class":198},"  Serial_Node",[192,841,842],{"class":219},"() : ",[192,844,845],{"class":198},"Node",[192,847,848],{"class":219},"(",[192,850,851],{"class":202},"\"serial_node_cpp\"",[192,853,854],{"class":219},")\n",[192,856,857],{"class":194,"line":295},[192,858,859],{"class":219},"  {\n",[192,861,862],{"class":194,"line":307},[192,863,864],{"class":261},"    \u002F\u002F 等设备准备好再初始化\n",[192,866,868],{"class":194,"line":867},10,[192,869,870],{"class":261},"    \u002F\u002F std::this_thread::sleep_for(std::chrono::milliseconds(500));\n",[192,872,874],{"class":194,"line":873},11,[192,875,255],{"emptyLinePlaceholder":254},[192,877,879],{"class":194,"line":878},12,[192,880,881],{"class":261},"    \u002F\u002F 串口设备名（根据实际设备调整）\n",[192,883,885,888,891,894,897,900],{"class":194,"line":884},13,[192,886,887],{"class":212},"    const",[192,889,890],{"class":198}," std",[192,892,893],{"class":219},"::string device_name ",[192,895,896],{"class":212},"=",[192,898,899],{"class":202}," \"\u002Fdev\u002FttyUSB0\"",[192,901,902],{"class":219},";\n",[192,904,906],{"class":194,"line":905},14,[192,907,255],{"emptyLinePlaceholder":254},[192,909,911,914,916,919,922,925,928,931],{"class":194,"line":910},15,[192,912,913],{"class":198},"    RCLCPP_INFO",[192,915,848],{"class":219},[192,917,918],{"class":413},"this",[192,920,921],{"class":219},"->",[192,923,924],{"class":198},"get_logger",[192,926,927],{"class":219},"(), ",[192,929,930],{"class":202},"\"Serial port Node Open!\"",[192,932,933],{"class":219},");\n",[192,935,937],{"class":194,"line":936},16,[192,938,939],{"class":261},"    \u002F\u002F 创建串口配置对象\n",[192,941,943],{"class":194,"line":942},17,[192,944,945],{"class":261},"    \u002F\u002F 波特率115200；不开启流控制；无奇偶效验；停止位1。\n",[192,947,949,952,954,956,959,961],{"class":194,"line":948},18,[192,950,951],{"class":198},"    drivers",[192,953,821],{"class":219},[192,955,155],{"class":198},[192,957,958],{"class":219},"::SerialPortConfig ",[192,960,631],{"class":198},[192,962,963],{"class":219},"(\n",[192,965,967,970],{"class":194,"line":966},19,[192,968,969],{"class":413},"        9600",[192,971,972],{"class":219},",\n",[192,974,976,979,981,983,985,988],{"class":194,"line":975},20,[192,977,978],{"class":198},"        drivers",[192,980,821],{"class":219},[192,982,155],{"class":198},[192,984,821],{"class":219},[192,986,987],{"class":198},"FlowControl",[192,989,990],{"class":219},"::NONE,\n",[192,992,994,996,998,1000,1002,1005],{"class":194,"line":993},21,[192,995,978],{"class":198},[192,997,821],{"class":219},[192,999,155],{"class":198},[192,1001,821],{"class":219},[192,1003,1004],{"class":198},"Parity",[192,1006,990],{"class":219},[192,1008,1010,1012,1014,1016,1018,1021],{"class":194,"line":1009},22,[192,1011,978],{"class":198},[192,1013,821],{"class":219},[192,1015,155],{"class":198},[192,1017,821],{"class":219},[192,1019,1020],{"class":198},"StopBits",[192,1022,1023],{"class":219},"::ONE);\n",[192,1025,1027],{"class":194,"line":1026},23,[192,1028,255],{"emptyLinePlaceholder":254},[192,1030,1032],{"class":194,"line":1031},24,[192,1033,1034],{"class":261},"    \u002F\u002F 初始化串口\n",[192,1036,1038],{"class":194,"line":1037},25,[192,1039,1040],{"class":212},"    try\n",[192,1042,1044],{"class":194,"line":1043},26,[192,1045,1046],{"class":219},"    {\n",[192,1048,1050,1053,1055,1057,1059,1062,1064,1067,1069,1072,1074,1077,1080,1083],{"class":194,"line":1049},27,[192,1051,1052],{"class":219},"      io_context_ ",[192,1054,896],{"class":212},[192,1056,890],{"class":198},[192,1058,821],{"class":219},[192,1060,1061],{"class":198},"make_shared",[192,1063,213],{"class":219},[192,1065,1066],{"class":198},"drivers",[192,1068,821],{"class":219},[192,1070,1071],{"class":198},"common",[192,1073,821],{"class":219},[192,1075,1076],{"class":198},"IoContext",[192,1078,1079],{"class":219},">(",[192,1081,1082],{"class":413},"1",[192,1084,933],{"class":219},[192,1086,1088],{"class":194,"line":1087},28,[192,1089,1090],{"class":261},"      \u002F\u002F 初始化 serial_driver_\n",[192,1092,1094,1097,1099,1101,1103,1105,1107,1109,1111,1113,1115,1118,1120,1123],{"class":194,"line":1093},29,[192,1095,1096],{"class":219},"      serial_driver_ ",[192,1098,896],{"class":212},[192,1100,890],{"class":198},[192,1102,821],{"class":219},[192,1104,1061],{"class":198},[192,1106,213],{"class":219},[192,1108,1066],{"class":198},[192,1110,821],{"class":219},[192,1112,155],{"class":198},[192,1114,821],{"class":219},[192,1116,1117],{"class":198},"SerialDriver",[192,1119,1079],{"class":219},[192,1121,1122],{"class":212},"*",[192,1124,1125],{"class":219},"io_context_);\n",[192,1127,1129,1132,1135],{"class":194,"line":1128},30,[192,1130,1131],{"class":219},"      serial_driver_->",[192,1133,1134],{"class":198},"init_port",[192,1136,1137],{"class":219},"(device_name, config);\n",[192,1139,1141,1143,1146,1149,1152],{"class":194,"line":1140},31,[192,1142,1131],{"class":219},[192,1144,1145],{"class":198},"port",[192,1147,1148],{"class":219},"()->",[192,1150,1151],{"class":198},"open",[192,1153,1154],{"class":219},"();\n",[192,1156,1158],{"class":194,"line":1157},32,[192,1159,255],{"emptyLinePlaceholder":254},[192,1161,1163,1166,1168,1170,1172,1174,1176,1179],{"class":194,"line":1162},33,[192,1164,1165],{"class":198},"      RCLCPP_INFO",[192,1167,848],{"class":219},[192,1169,918],{"class":413},[192,1171,921],{"class":219},[192,1173,924],{"class":198},[192,1175,927],{"class":219},[192,1177,1178],{"class":202},"\"Serial port initialized successfully\"",[192,1180,933],{"class":219},[192,1182,1184,1186,1188,1190,1192,1194,1196,1199,1202,1205,1208,1210,1213,1216,1218,1221,1223,1226],{"class":194,"line":1183},34,[192,1185,1165],{"class":198},[192,1187,848],{"class":219},[192,1189,918],{"class":413},[192,1191,921],{"class":219},[192,1193,924],{"class":198},[192,1195,927],{"class":219},[192,1197,1198],{"class":202},"\"Using device: ",[192,1200,1201],{"class":413},"%s",[192,1203,1204],{"class":202},"\"",[192,1206,1207],{"class":219},", serial_driver_->",[192,1209,1145],{"class":198},[192,1211,1212],{"class":219},"().",[192,1214,1215],{"class":198},"get",[192,1217,1148],{"class":219},[192,1219,1220],{"class":198},"device_name",[192,1222,1212],{"class":219},[192,1224,1225],{"class":198},"c_str",[192,1227,1228],{"class":219},"());\n",[192,1230,1232,1234,1236,1238,1240,1242,1244,1247,1250,1252,1255,1258],{"class":194,"line":1231},35,[192,1233,1165],{"class":198},[192,1235,848],{"class":219},[192,1237,918],{"class":413},[192,1239,921],{"class":219},[192,1241,924],{"class":198},[192,1243,927],{"class":219},[192,1245,1246],{"class":202},"\"Baud_rate: ",[192,1248,1249],{"class":413},"%d",[192,1251,1204],{"class":202},[192,1253,1254],{"class":219},", config.",[192,1256,1257],{"class":198},"get_baud_rate",[192,1259,1228],{"class":219},[192,1261,1263],{"class":194,"line":1262},36,[192,1264,1265],{"class":219},"    }\n",[192,1267,1269,1272,1275,1278,1280,1283,1286],{"class":194,"line":1268},37,[192,1270,1271],{"class":212},"    catch",[192,1273,1274],{"class":219}," (",[192,1276,1277],{"class":212},"const",[192,1279,890],{"class":198},[192,1281,1282],{"class":219},"::exception ",[192,1284,1285],{"class":212},"&",[192,1287,1288],{"class":219},"ex)\n",[192,1290,1292],{"class":194,"line":1291},38,[192,1293,1046],{"class":219},[192,1295,1297,1300,1302,1304,1306,1308,1310,1313,1315,1317,1320,1323],{"class":194,"line":1296},39,[192,1298,1299],{"class":198},"      RCLCPP_ERROR",[192,1301,848],{"class":219},[192,1303,918],{"class":413},[192,1305,921],{"class":219},[192,1307,924],{"class":198},[192,1309,927],{"class":219},[192,1311,1312],{"class":202},"\"Failed to initialize serial port: ",[192,1314,1201],{"class":413},[192,1316,1204],{"class":202},[192,1318,1319],{"class":219},", ex.",[192,1321,1322],{"class":198},"what",[192,1324,1228],{"class":219},[192,1326,1328,1331],{"class":194,"line":1327},40,[192,1329,1330],{"class":212},"      return",[192,1332,902],{"class":219},[192,1334,1336],{"class":194,"line":1335},41,[192,1337,1265],{"class":219},[192,1339,1341],{"class":194,"line":1340},42,[192,1342,255],{"emptyLinePlaceholder":254},[192,1344,1346],{"class":194,"line":1345},43,[192,1347,1348],{"class":261},"    \u002F\u002F 设置发送定时器\n",[192,1350,1352,1355,1357,1360,1362,1365],{"class":194,"line":1351},44,[192,1353,1354],{"class":219},"    send_timer_ ",[192,1356,896],{"class":212},[192,1358,1359],{"class":413}," this",[192,1361,921],{"class":219},[192,1363,1364],{"class":198},"create_wall_timer",[192,1366,963],{"class":219},[192,1368,1370,1373,1375,1378,1380,1382,1384,1387],{"class":194,"line":1369},45,[192,1371,1372],{"class":198},"        std",[192,1374,821],{"class":219},[192,1376,1377],{"class":198},"chrono",[192,1379,821],{"class":219},[192,1381,747],{"class":198},[192,1383,848],{"class":219},[192,1385,1386],{"class":413},"500",[192,1388,1389],{"class":219},"),\n",[192,1391,1393,1395,1397,1400,1402,1404,1407,1410,1412],{"class":194,"line":1392},46,[192,1394,1372],{"class":198},[192,1396,821],{"class":219},[192,1398,1399],{"class":198},"bind",[192,1401,848],{"class":219},[192,1403,1285],{"class":212},[192,1405,1406],{"class":198},"Serial_Node",[192,1408,1409],{"class":219},"::send_message_timer_callback, ",[192,1411,918],{"class":413},[192,1413,1414],{"class":219},"));\n",[192,1416,1418],{"class":194,"line":1417},47,[192,1419,1420],{"class":219},"  }\n",[192,1422,1424],{"class":194,"line":1423},48,[192,1425,255],{"emptyLinePlaceholder":254},[192,1427,1429],{"class":194,"line":1428},49,[192,1430,1431],{"class":212},"private:\n",[192,1433,1435,1438,1441],{"class":194,"line":1434},50,[192,1436,1437],{"class":212},"  void",[192,1439,1440],{"class":198}," send_message_timer_callback",[192,1442,1443],{"class":219},"()\n",[192,1445,1447],{"class":194,"line":1446},51,[192,1448,859],{"class":219},[192,1450,1452],{"class":194,"line":1451},52,[192,1453,1454],{"class":261},"    \u002F\u002F 发送一串字符串\n",[192,1456,1458,1460,1462,1465,1467,1470,1473,1475],{"class":194,"line":1457},53,[192,1459,887],{"class":212},[192,1461,890],{"class":198},[192,1463,1464],{"class":219},"::string message ",[192,1466,896],{"class":212},[192,1468,1469],{"class":202}," \"Hello from ROS 2!",[192,1471,1472],{"class":413},"\\n",[192,1474,1204],{"class":202},[192,1476,902],{"class":219},[192,1478,1480,1483,1486,1489,1492,1495,1498,1501,1504],{"class":194,"line":1479},54,[192,1481,1482],{"class":198},"    std",[192,1484,1485],{"class":219},"::vector",[192,1487,1488],{"class":212},"\u003Cuint8_t>",[192,1490,1491],{"class":198}," data",[192,1493,1494],{"class":219},"(message.",[192,1496,1497],{"class":198},"begin",[192,1499,1500],{"class":219},"(), message.",[192,1502,1503],{"class":198},"end",[192,1505,1228],{"class":219},[192,1507,1509,1512],{"class":194,"line":1508},55,[192,1510,1511],{"class":261},"    \u002F\u002F std::vector\u003Cuint8_t> hex_data = {0x48, 0x65, 0x6C, 0x6C, 0x6F};",[192,1513,1514],{"class":261}," \u002F\u002F \"Hello\" in ASCII\n",[192,1516,1518,1521,1524,1526,1529,1531],{"class":194,"line":1517},56,[192,1519,1520],{"class":212},"    auto",[192,1522,1523],{"class":219}," port ",[192,1525,896],{"class":212},[192,1527,1528],{"class":219}," serial_driver_->",[192,1530,1145],{"class":198},[192,1532,1154],{"class":219},[192,1534,1536],{"class":194,"line":1535},57,[192,1537,255],{"emptyLinePlaceholder":254},[192,1539,1541],{"class":194,"line":1540},58,[192,1542,1040],{"class":212},[192,1544,1546],{"class":194,"line":1545},59,[192,1547,1046],{"class":219},[192,1549,1551,1554,1557,1559,1562,1564],{"class":194,"line":1550},60,[192,1552,1553],{"class":212},"      size_t",[192,1555,1556],{"class":219}," bytes_sent_size ",[192,1558,896],{"class":212},[192,1560,1561],{"class":219}," port->",[192,1563,767],{"class":198},[192,1565,1566],{"class":219},"(data);\n",[192,1568,1570,1572,1574,1576,1578,1580,1582,1585,1587,1589,1592,1595,1598,1600],{"class":194,"line":1569},61,[192,1571,1165],{"class":198},[192,1573,848],{"class":219},[192,1575,918],{"class":413},[192,1577,921],{"class":219},[192,1579,924],{"class":198},[192,1581,927],{"class":219},[192,1583,1584],{"class":202},"\"Sent: ",[192,1586,1201],{"class":413},[192,1588,1274],{"class":202},[192,1590,1591],{"class":413},"%ld",[192,1593,1594],{"class":202}," bytes)\"",[192,1596,1597],{"class":219},", message.",[192,1599,1225],{"class":198},[192,1601,1602],{"class":219},"(), bytes_sent_size);\n",[192,1604,1606],{"class":194,"line":1605},62,[192,1607,1265],{"class":219},[192,1609,1611,1613,1615,1617,1619,1621,1623],{"class":194,"line":1610},63,[192,1612,1271],{"class":212},[192,1614,848],{"class":219},[192,1616,1277],{"class":212},[192,1618,890],{"class":198},[192,1620,1282],{"class":219},[192,1622,1285],{"class":212},[192,1624,1288],{"class":219},[192,1626,1628],{"class":194,"line":1627},64,[192,1629,1046],{"class":219},[192,1631,1633,1635,1637,1639,1641,1643,1645,1648,1650,1652,1655,1657],{"class":194,"line":1632},65,[192,1634,1299],{"class":198},[192,1636,848],{"class":219},[192,1638,918],{"class":413},[192,1640,921],{"class":219},[192,1642,924],{"class":198},[192,1644,927],{"class":219},[192,1646,1647],{"class":202},"\"Error Transmiting from serial port:",[192,1649,1201],{"class":413},[192,1651,1204],{"class":202},[192,1653,1654],{"class":219},",ex.",[192,1656,1322],{"class":198},[192,1658,1228],{"class":219},[192,1660,1662],{"class":194,"line":1661},66,[192,1663,1265],{"class":219},[192,1665,1667],{"class":194,"line":1666},67,[192,1668,1420],{"class":219},[192,1670,1672],{"class":194,"line":1671},68,[192,1673,255],{"emptyLinePlaceholder":254},[192,1675,1677,1680,1683,1685,1687,1689,1691,1694,1696],{"class":194,"line":1676},69,[192,1678,1679],{"class":198},"  std",[192,1681,1682],{"class":219},"::shared_ptr",[192,1684,213],{"class":212},[192,1686,1066],{"class":198},[192,1688,821],{"class":219},[192,1690,155],{"class":198},[192,1692,1693],{"class":219},"::SerialDriver",[192,1695,223],{"class":212},[192,1697,1698],{"class":219}," serial_driver_;\n",[192,1700,1702,1704,1706,1708,1710,1712,1714,1717,1719],{"class":194,"line":1701},70,[192,1703,1679],{"class":198},[192,1705,1682],{"class":219},[192,1707,213],{"class":212},[192,1709,1066],{"class":198},[192,1711,821],{"class":219},[192,1713,1071],{"class":198},[192,1715,1716],{"class":219},"::IoContext",[192,1718,223],{"class":212},[192,1720,1721],{"class":219}," io_context_;\n",[192,1723,1725,1728,1730,1733],{"class":194,"line":1724},71,[192,1726,1727],{"class":198},"  rclcpp",[192,1729,821],{"class":219},[192,1731,1732],{"class":198},"TimerBase",[192,1734,1735],{"class":219},"::SharedPtr send_timer_;\n",[192,1737,1739],{"class":194,"line":1738},72,[192,1740,1741],{"class":219},"};\n",[192,1743,1745],{"class":194,"line":1744},73,[192,1746,255],{"emptyLinePlaceholder":254},[192,1748,1750,1753,1756,1758,1760,1764,1767,1770,1773,1776],{"class":194,"line":1749},74,[192,1751,1752],{"class":212},"int",[192,1754,1755],{"class":198}," main",[192,1757,848],{"class":219},[192,1759,1752],{"class":212},[192,1761,1763],{"class":1762},"s4XuR"," argc",[192,1765,1766],{"class":219},", ",[192,1768,1769],{"class":212},"char",[192,1771,1772],{"class":212}," **",[192,1774,1775],{"class":1762},"argv",[192,1777,854],{"class":219},[192,1779,1781],{"class":194,"line":1780},75,[192,1782,829],{"class":219},[192,1784,1786,1788,1790,1793],{"class":194,"line":1785},76,[192,1787,1727],{"class":198},[192,1789,821],{"class":219},[192,1791,1792],{"class":198},"init",[192,1794,1795],{"class":219},"(argc, argv);\n",[192,1797,1799],{"class":194,"line":1798},77,[192,1800,255],{"emptyLinePlaceholder":254},[192,1802,1804,1807,1810,1812,1814,1816,1818,1820,1822],{"class":194,"line":1803},78,[192,1805,1806],{"class":212},"  auto",[192,1808,1809],{"class":219}," node ",[192,1811,896],{"class":212},[192,1813,890],{"class":198},[192,1815,821],{"class":219},[192,1817,1061],{"class":198},[192,1819,213],{"class":219},[192,1821,1406],{"class":198},[192,1823,1824],{"class":219},">();\n",[192,1826,1828],{"class":194,"line":1827},79,[192,1829,255],{"emptyLinePlaceholder":254},[192,1831,1833,1835,1837,1840],{"class":194,"line":1832},80,[192,1834,1727],{"class":198},[192,1836,821],{"class":219},[192,1838,1839],{"class":198},"spin",[192,1841,1842],{"class":219},"(node);\n",[192,1844,1846],{"class":194,"line":1845},81,[192,1847,255],{"emptyLinePlaceholder":254},[192,1849,1851,1853,1855,1858],{"class":194,"line":1850},82,[192,1852,1727],{"class":198},[192,1854,821],{"class":219},[192,1856,1857],{"class":198},"shutdown",[192,1859,1154],{"class":219},[192,1861,1863,1866,1869],{"class":194,"line":1862},83,[192,1864,1865],{"class":212},"  return",[192,1867,1868],{"class":413}," 0",[192,1870,902],{"class":219},[192,1872,1874],{"class":194,"line":1873},84,[192,1875,1876],{"class":219},"}\n",[15,1878,1879],{},[598,1880],{"alt":188,"src":1881},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1783.webp",[15,1883,1884],{},[598,1885],{"alt":188,"src":1886},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1784.webp",[55,1888,1890],{"id":1889},"detailed-explanation-of-the-receiving-code","Detailed explanation of the receiving code",[176,1892,1894],{"id":1893},"timer-method-inefficient-not-recommended","Timer method (inefficient, not recommended)",[183,1896,1898],{"className":779,"code":1897,"language":781,"meta":188,"style":188},"#include \"rclcpp\u002Frclcpp.hpp\"\n#include \"serial_driver\u002Fserial_driver.hpp\"\n#include \u003Cstring>\n\nclass Serial_Node : public rclcpp::Node\n{\npublic:\n  Serial_Node() : Node(\"serial_node_cpp\")\n  {\n    \u002F\u002F 等设备准备好再初始化\n    \u002F\u002F std::this_thread::sleep_for(std::chrono::milliseconds(500));\n\n    \u002F\u002F 串口设备名（根据实际设备调整）\n    const std::string device_name = \"\u002Fdev\u002FttyUSB0\";\n\n    RCLCPP_INFO(this->get_logger(), \"Serial port Node Open!\");\n    \u002F\u002F 创建串口配置对象\n    \u002F\u002F 波特率115200；不开启流控制；无奇偶效验；停止位1。\n    drivers::serial_driver::SerialPortConfig config(\n        9600,\n        drivers::serial_driver::FlowControl::NONE,\n        drivers::serial_driver::Parity::NONE,\n        drivers::serial_driver::StopBits::ONE);\n\n    \u002F\u002F 初始化串口\n    try\n    {\n      io_context_ = std::make_shared\u003Cdrivers::common::IoContext>(1);\n      \u002F\u002F 初始化 serial_driver_\n      serial_driver_ = std::make_shared\u003Cdrivers::serial_driver::SerialDriver>(*io_context_);\n      serial_driver_->init_port(device_name, config);\n      serial_driver_->port()->open();\n\n      RCLCPP_INFO(this->get_logger(), \"Serial port initialized successfully\");\n      RCLCPP_INFO(this->get_logger(), \"Using device: %s\", serial_driver_->port().get()->device_name().c_str());\n      RCLCPP_INFO(this->get_logger(), \"Baud_rate: %d\", config.get_baud_rate());\n    }\n    catch (const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Failed to initialize serial port: %s\", ex.what());\n      return;\n    }\n\n    \u002F\u002F 设置发送定时器\n    receive_timer_ = this->create_wall_timer(\n        std::chrono::milliseconds(3),\n        std::bind(&Serial_Node::receive_message_timer_callback, this));\n  }\n\nprivate:\n  void receive_message_timer_callback()\n  {\n    std::vector\u003Cuint8_t> data(100); \u002F\u002F \"Hello\" in ASCII\n    auto port = serial_driver_->port();\n\n    try\n    {\n      size_t bytes_receive_size = port->receive(data);\n      if(bytes_receive_size > 0)\n      {\n        std::string message(data.begin(),data.begin() + bytes_receive_size);\n        RCLCPP_INFO(this->get_logger(), \"Receive: %s (%ld bytes)\", message.c_str(), bytes_receive_size);\n      }\n    }\n    catch(const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Error Receiving from serial port:%s\",ex.what());\n    }\n  }\n\n  std::shared_ptr\u003Cdrivers::serial_driver::SerialDriver> serial_driver_;\n  std::shared_ptr\u003Cdrivers::common::IoContext> io_context_;\n  rclcpp::TimerBase::SharedPtr receive_timer_;\n};\n\nint main(int argc, char **argv)\n{\n  rclcpp::init(argc, argv);\n\n  auto node = std::make_shared\u003CSerial_Node>();\n\n  rclcpp::spin(node);\n\n  rclcpp::shutdown();\n  return 0;\n}\n",[70,1899,1900,1906,1912,1919,1923,1939,1943,1947,1961,1965,1969,1973,1977,1981,1995,1999,2017,2021,2025,2039,2045,2059,2073,2087,2091,2095,2099,2103,2133,2137,2167,2175,2187,2191,2209,2247,2273,2277,2293,2297,2323,2329,2333,2337,2341,2356,2375,2396,2400,2404,2408,2417,2421,2441,2455,2459,2463,2467,2483,2497,2502,2531,2564,2569,2573,2589,2593,2620,2624,2628,2632,2652,2672,2683,2687,2691,2713,2717,2727,2731,2751,2755,2765,2769,2779,2788],{"__ignoreMap":188},[192,1901,1902,1904],{"class":194,"line":195},[192,1903,788],{"class":212},[192,1905,791],{"class":202},[192,1907,1908,1910],{"class":194,"line":229},[192,1909,788],{"class":212},[192,1911,798],{"class":202},[192,1913,1914,1916],{"class":194,"line":251},[192,1915,788],{"class":212},[192,1917,1918],{"class":202}," \u003Cstring>\n",[192,1920,1921],{"class":194,"line":258},[192,1922,255],{"emptyLinePlaceholder":254},[192,1924,1925,1927,1929,1931,1933,1935,1937],{"class":194,"line":265},[192,1926,807],{"class":212},[192,1928,810],{"class":198},[192,1930,813],{"class":219},[192,1932,816],{"class":212},[192,1934,574],{"class":198},[192,1936,821],{"class":219},[192,1938,824],{"class":198},[192,1940,1941],{"class":194,"line":277},[192,1942,829],{"class":219},[192,1944,1945],{"class":194,"line":289},[192,1946,834],{"class":212},[192,1948,1949,1951,1953,1955,1957,1959],{"class":194,"line":295},[192,1950,839],{"class":198},[192,1952,842],{"class":219},[192,1954,845],{"class":198},[192,1956,848],{"class":219},[192,1958,851],{"class":202},[192,1960,854],{"class":219},[192,1962,1963],{"class":194,"line":307},[192,1964,859],{"class":219},[192,1966,1967],{"class":194,"line":867},[192,1968,864],{"class":261},[192,1970,1971],{"class":194,"line":873},[192,1972,870],{"class":261},[192,1974,1975],{"class":194,"line":878},[192,1976,255],{"emptyLinePlaceholder":254},[192,1978,1979],{"class":194,"line":884},[192,1980,881],{"class":261},[192,1982,1983,1985,1987,1989,1991,1993],{"class":194,"line":905},[192,1984,887],{"class":212},[192,1986,890],{"class":198},[192,1988,893],{"class":219},[192,1990,896],{"class":212},[192,1992,899],{"class":202},[192,1994,902],{"class":219},[192,1996,1997],{"class":194,"line":910},[192,1998,255],{"emptyLinePlaceholder":254},[192,2000,2001,2003,2005,2007,2009,2011,2013,2015],{"class":194,"line":936},[192,2002,913],{"class":198},[192,2004,848],{"class":219},[192,2006,918],{"class":413},[192,2008,921],{"class":219},[192,2010,924],{"class":198},[192,2012,927],{"class":219},[192,2014,930],{"class":202},[192,2016,933],{"class":219},[192,2018,2019],{"class":194,"line":942},[192,2020,939],{"class":261},[192,2022,2023],{"class":194,"line":948},[192,2024,945],{"class":261},[192,2026,2027,2029,2031,2033,2035,2037],{"class":194,"line":966},[192,2028,951],{"class":198},[192,2030,821],{"class":219},[192,2032,155],{"class":198},[192,2034,958],{"class":219},[192,2036,631],{"class":198},[192,2038,963],{"class":219},[192,2040,2041,2043],{"class":194,"line":975},[192,2042,969],{"class":413},[192,2044,972],{"class":219},[192,2046,2047,2049,2051,2053,2055,2057],{"class":194,"line":993},[192,2048,978],{"class":198},[192,2050,821],{"class":219},[192,2052,155],{"class":198},[192,2054,821],{"class":219},[192,2056,987],{"class":198},[192,2058,990],{"class":219},[192,2060,2061,2063,2065,2067,2069,2071],{"class":194,"line":1009},[192,2062,978],{"class":198},[192,2064,821],{"class":219},[192,2066,155],{"class":198},[192,2068,821],{"class":219},[192,2070,1004],{"class":198},[192,2072,990],{"class":219},[192,2074,2075,2077,2079,2081,2083,2085],{"class":194,"line":1026},[192,2076,978],{"class":198},[192,2078,821],{"class":219},[192,2080,155],{"class":198},[192,2082,821],{"class":219},[192,2084,1020],{"class":198},[192,2086,1023],{"class":219},[192,2088,2089],{"class":194,"line":1031},[192,2090,255],{"emptyLinePlaceholder":254},[192,2092,2093],{"class":194,"line":1037},[192,2094,1034],{"class":261},[192,2096,2097],{"class":194,"line":1043},[192,2098,1040],{"class":212},[192,2100,2101],{"class":194,"line":1049},[192,2102,1046],{"class":219},[192,2104,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2131],{"class":194,"line":1087},[192,2106,1052],{"class":219},[192,2108,896],{"class":212},[192,2110,890],{"class":198},[192,2112,821],{"class":219},[192,2114,1061],{"class":198},[192,2116,213],{"class":219},[192,2118,1066],{"class":198},[192,2120,821],{"class":219},[192,2122,1071],{"class":198},[192,2124,821],{"class":219},[192,2126,1076],{"class":198},[192,2128,1079],{"class":219},[192,2130,1082],{"class":413},[192,2132,933],{"class":219},[192,2134,2135],{"class":194,"line":1093},[192,2136,1090],{"class":261},[192,2138,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163,2165],{"class":194,"line":1128},[192,2140,1096],{"class":219},[192,2142,896],{"class":212},[192,2144,890],{"class":198},[192,2146,821],{"class":219},[192,2148,1061],{"class":198},[192,2150,213],{"class":219},[192,2152,1066],{"class":198},[192,2154,821],{"class":219},[192,2156,155],{"class":198},[192,2158,821],{"class":219},[192,2160,1117],{"class":198},[192,2162,1079],{"class":219},[192,2164,1122],{"class":212},[192,2166,1125],{"class":219},[192,2168,2169,2171,2173],{"class":194,"line":1140},[192,2170,1131],{"class":219},[192,2172,1134],{"class":198},[192,2174,1137],{"class":219},[192,2176,2177,2179,2181,2183,2185],{"class":194,"line":1157},[192,2178,1131],{"class":219},[192,2180,1145],{"class":198},[192,2182,1148],{"class":219},[192,2184,1151],{"class":198},[192,2186,1154],{"class":219},[192,2188,2189],{"class":194,"line":1162},[192,2190,255],{"emptyLinePlaceholder":254},[192,2192,2193,2195,2197,2199,2201,2203,2205,2207],{"class":194,"line":1183},[192,2194,1165],{"class":198},[192,2196,848],{"class":219},[192,2198,918],{"class":413},[192,2200,921],{"class":219},[192,2202,924],{"class":198},[192,2204,927],{"class":219},[192,2206,1178],{"class":202},[192,2208,933],{"class":219},[192,2210,2211,2213,2215,2217,2219,2221,2223,2225,2227,2229,2231,2233,2235,2237,2239,2241,2243,2245],{"class":194,"line":1231},[192,2212,1165],{"class":198},[192,2214,848],{"class":219},[192,2216,918],{"class":413},[192,2218,921],{"class":219},[192,2220,924],{"class":198},[192,2222,927],{"class":219},[192,2224,1198],{"class":202},[192,2226,1201],{"class":413},[192,2228,1204],{"class":202},[192,2230,1207],{"class":219},[192,2232,1145],{"class":198},[192,2234,1212],{"class":219},[192,2236,1215],{"class":198},[192,2238,1148],{"class":219},[192,2240,1220],{"class":198},[192,2242,1212],{"class":219},[192,2244,1225],{"class":198},[192,2246,1228],{"class":219},[192,2248,2249,2251,2253,2255,2257,2259,2261,2263,2265,2267,2269,2271],{"class":194,"line":1262},[192,2250,1165],{"class":198},[192,2252,848],{"class":219},[192,2254,918],{"class":413},[192,2256,921],{"class":219},[192,2258,924],{"class":198},[192,2260,927],{"class":219},[192,2262,1246],{"class":202},[192,2264,1249],{"class":413},[192,2266,1204],{"class":202},[192,2268,1254],{"class":219},[192,2270,1257],{"class":198},[192,2272,1228],{"class":219},[192,2274,2275],{"class":194,"line":1268},[192,2276,1265],{"class":219},[192,2278,2279,2281,2283,2285,2287,2289,2291],{"class":194,"line":1291},[192,2280,1271],{"class":212},[192,2282,1274],{"class":219},[192,2284,1277],{"class":212},[192,2286,890],{"class":198},[192,2288,1282],{"class":219},[192,2290,1285],{"class":212},[192,2292,1288],{"class":219},[192,2294,2295],{"class":194,"line":1296},[192,2296,1046],{"class":219},[192,2298,2299,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319,2321],{"class":194,"line":1327},[192,2300,1299],{"class":198},[192,2302,848],{"class":219},[192,2304,918],{"class":413},[192,2306,921],{"class":219},[192,2308,924],{"class":198},[192,2310,927],{"class":219},[192,2312,1312],{"class":202},[192,2314,1201],{"class":413},[192,2316,1204],{"class":202},[192,2318,1319],{"class":219},[192,2320,1322],{"class":198},[192,2322,1228],{"class":219},[192,2324,2325,2327],{"class":194,"line":1335},[192,2326,1330],{"class":212},[192,2328,902],{"class":219},[192,2330,2331],{"class":194,"line":1340},[192,2332,1265],{"class":219},[192,2334,2335],{"class":194,"line":1345},[192,2336,255],{"emptyLinePlaceholder":254},[192,2338,2339],{"class":194,"line":1351},[192,2340,1348],{"class":261},[192,2342,2343,2346,2348,2350,2352,2354],{"class":194,"line":1369},[192,2344,2345],{"class":219},"    receive_timer_ ",[192,2347,896],{"class":212},[192,2349,1359],{"class":413},[192,2351,921],{"class":219},[192,2353,1364],{"class":198},[192,2355,963],{"class":219},[192,2357,2358,2360,2362,2364,2366,2368,2370,2373],{"class":194,"line":1392},[192,2359,1372],{"class":198},[192,2361,821],{"class":219},[192,2363,1377],{"class":198},[192,2365,821],{"class":219},[192,2367,747],{"class":198},[192,2369,848],{"class":219},[192,2371,2372],{"class":413},"3",[192,2374,1389],{"class":219},[192,2376,2377,2379,2381,2383,2385,2387,2389,2392,2394],{"class":194,"line":1417},[192,2378,1372],{"class":198},[192,2380,821],{"class":219},[192,2382,1399],{"class":198},[192,2384,848],{"class":219},[192,2386,1285],{"class":212},[192,2388,1406],{"class":198},[192,2390,2391],{"class":219},"::receive_message_timer_callback, ",[192,2393,918],{"class":413},[192,2395,1414],{"class":219},[192,2397,2398],{"class":194,"line":1423},[192,2399,1420],{"class":219},[192,2401,2402],{"class":194,"line":1428},[192,2403,255],{"emptyLinePlaceholder":254},[192,2405,2406],{"class":194,"line":1434},[192,2407,1431],{"class":212},[192,2409,2410,2412,2415],{"class":194,"line":1446},[192,2411,1437],{"class":212},[192,2413,2414],{"class":198}," receive_message_timer_callback",[192,2416,1443],{"class":219},[192,2418,2419],{"class":194,"line":1451},[192,2420,859],{"class":219},[192,2422,2423,2425,2427,2429,2431,2433,2436,2439],{"class":194,"line":1457},[192,2424,1482],{"class":198},[192,2426,1485],{"class":219},[192,2428,1488],{"class":212},[192,2430,1491],{"class":198},[192,2432,848],{"class":219},[192,2434,2435],{"class":413},"100",[192,2437,2438],{"class":219},");",[192,2440,1514],{"class":261},[192,2442,2443,2445,2447,2449,2451,2453],{"class":194,"line":1479},[192,2444,1520],{"class":212},[192,2446,1523],{"class":219},[192,2448,896],{"class":212},[192,2450,1528],{"class":219},[192,2452,1145],{"class":198},[192,2454,1154],{"class":219},[192,2456,2457],{"class":194,"line":1508},[192,2458,255],{"emptyLinePlaceholder":254},[192,2460,2461],{"class":194,"line":1517},[192,2462,1040],{"class":212},[192,2464,2465],{"class":194,"line":1535},[192,2466,1046],{"class":219},[192,2468,2469,2471,2474,2476,2478,2481],{"class":194,"line":1540},[192,2470,1553],{"class":212},[192,2472,2473],{"class":219}," bytes_receive_size ",[192,2475,896],{"class":212},[192,2477,1561],{"class":219},[192,2479,2480],{"class":198},"receive",[192,2482,1566],{"class":219},[192,2484,2485,2488,2491,2493,2495],{"class":194,"line":1545},[192,2486,2487],{"class":212},"      if",[192,2489,2490],{"class":219},"(bytes_receive_size ",[192,2492,223],{"class":212},[192,2494,1868],{"class":413},[192,2496,854],{"class":219},[192,2498,2499],{"class":194,"line":1550},[192,2500,2501],{"class":219},"      {\n",[192,2503,2504,2506,2509,2512,2515,2517,2520,2522,2525,2528],{"class":194,"line":1569},[192,2505,1372],{"class":198},[192,2507,2508],{"class":219},"::string ",[192,2510,2511],{"class":198},"message",[192,2513,2514],{"class":219},"(data.",[192,2516,1497],{"class":198},[192,2518,2519],{"class":219},"(),data.",[192,2521,1497],{"class":198},[192,2523,2524],{"class":219},"() ",[192,2526,2527],{"class":212},"+",[192,2529,2530],{"class":219}," bytes_receive_size);\n",[192,2532,2533,2536,2538,2540,2542,2544,2546,2549,2551,2553,2555,2557,2559,2561],{"class":194,"line":1605},[192,2534,2535],{"class":198},"        RCLCPP_INFO",[192,2537,848],{"class":219},[192,2539,918],{"class":413},[192,2541,921],{"class":219},[192,2543,924],{"class":198},[192,2545,927],{"class":219},[192,2547,2548],{"class":202},"\"Receive: ",[192,2550,1201],{"class":413},[192,2552,1274],{"class":202},[192,2554,1591],{"class":413},[192,2556,1594],{"class":202},[192,2558,1597],{"class":219},[192,2560,1225],{"class":198},[192,2562,2563],{"class":219},"(), bytes_receive_size);\n",[192,2565,2566],{"class":194,"line":1610},[192,2567,2568],{"class":219},"      }\n",[192,2570,2571],{"class":194,"line":1627},[192,2572,1265],{"class":219},[192,2574,2575,2577,2579,2581,2583,2585,2587],{"class":194,"line":1632},[192,2576,1271],{"class":212},[192,2578,848],{"class":219},[192,2580,1277],{"class":212},[192,2582,890],{"class":198},[192,2584,1282],{"class":219},[192,2586,1285],{"class":212},[192,2588,1288],{"class":219},[192,2590,2591],{"class":194,"line":1661},[192,2592,1046],{"class":219},[192,2594,2595,2597,2599,2601,2603,2605,2607,2610,2612,2614,2616,2618],{"class":194,"line":1666},[192,2596,1299],{"class":198},[192,2598,848],{"class":219},[192,2600,918],{"class":413},[192,2602,921],{"class":219},[192,2604,924],{"class":198},[192,2606,927],{"class":219},[192,2608,2609],{"class":202},"\"Error Receiving from serial port:",[192,2611,1201],{"class":413},[192,2613,1204],{"class":202},[192,2615,1654],{"class":219},[192,2617,1322],{"class":198},[192,2619,1228],{"class":219},[192,2621,2622],{"class":194,"line":1671},[192,2623,1265],{"class":219},[192,2625,2626],{"class":194,"line":1676},[192,2627,1420],{"class":219},[192,2629,2630],{"class":194,"line":1701},[192,2631,255],{"emptyLinePlaceholder":254},[192,2633,2634,2636,2638,2640,2642,2644,2646,2648,2650],{"class":194,"line":1724},[192,2635,1679],{"class":198},[192,2637,1682],{"class":219},[192,2639,213],{"class":212},[192,2641,1066],{"class":198},[192,2643,821],{"class":219},[192,2645,155],{"class":198},[192,2647,1693],{"class":219},[192,2649,223],{"class":212},[192,2651,1698],{"class":219},[192,2653,2654,2656,2658,2660,2662,2664,2666,2668,2670],{"class":194,"line":1738},[192,2655,1679],{"class":198},[192,2657,1682],{"class":219},[192,2659,213],{"class":212},[192,2661,1066],{"class":198},[192,2663,821],{"class":219},[192,2665,1071],{"class":198},[192,2667,1716],{"class":219},[192,2669,223],{"class":212},[192,2671,1721],{"class":219},[192,2673,2674,2676,2678,2680],{"class":194,"line":1744},[192,2675,1727],{"class":198},[192,2677,821],{"class":219},[192,2679,1732],{"class":198},[192,2681,2682],{"class":219},"::SharedPtr receive_timer_;\n",[192,2684,2685],{"class":194,"line":1749},[192,2686,1741],{"class":219},[192,2688,2689],{"class":194,"line":1780},[192,2690,255],{"emptyLinePlaceholder":254},[192,2692,2693,2695,2697,2699,2701,2703,2705,2707,2709,2711],{"class":194,"line":1785},[192,2694,1752],{"class":212},[192,2696,1755],{"class":198},[192,2698,848],{"class":219},[192,2700,1752],{"class":212},[192,2702,1763],{"class":1762},[192,2704,1766],{"class":219},[192,2706,1769],{"class":212},[192,2708,1772],{"class":212},[192,2710,1775],{"class":1762},[192,2712,854],{"class":219},[192,2714,2715],{"class":194,"line":1798},[192,2716,829],{"class":219},[192,2718,2719,2721,2723,2725],{"class":194,"line":1803},[192,2720,1727],{"class":198},[192,2722,821],{"class":219},[192,2724,1792],{"class":198},[192,2726,1795],{"class":219},[192,2728,2729],{"class":194,"line":1827},[192,2730,255],{"emptyLinePlaceholder":254},[192,2732,2733,2735,2737,2739,2741,2743,2745,2747,2749],{"class":194,"line":1832},[192,2734,1806],{"class":212},[192,2736,1809],{"class":219},[192,2738,896],{"class":212},[192,2740,890],{"class":198},[192,2742,821],{"class":219},[192,2744,1061],{"class":198},[192,2746,213],{"class":219},[192,2748,1406],{"class":198},[192,2750,1824],{"class":219},[192,2752,2753],{"class":194,"line":1845},[192,2754,255],{"emptyLinePlaceholder":254},[192,2756,2757,2759,2761,2763],{"class":194,"line":1850},[192,2758,1727],{"class":198},[192,2760,821],{"class":219},[192,2762,1839],{"class":198},[192,2764,1842],{"class":219},[192,2766,2767],{"class":194,"line":1862},[192,2768,255],{"emptyLinePlaceholder":254},[192,2770,2771,2773,2775,2777],{"class":194,"line":1873},[192,2772,1727],{"class":198},[192,2774,821],{"class":219},[192,2776,1857],{"class":198},[192,2778,1154],{"class":219},[192,2780,2782,2784,2786],{"class":194,"line":2781},85,[192,2783,1865],{"class":212},[192,2785,1868],{"class":413},[192,2787,902],{"class":219},[192,2789,2791],{"class":194,"line":2790},86,[192,2792,1876],{"class":219},[15,2794,2795],{},[598,2796],{"alt":188,"src":2797},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1785.webp",[176,2799,2801],{"id":2800},"asynchronous-method-efficient","Asynchronous method (efficient)",[183,2803,2805],{"className":779,"code":2804,"language":781,"meta":188,"style":188},"#include \"rclcpp\u002Frclcpp.hpp\"\n#include \"serial_driver\u002Fserial_driver.hpp\"\n#include \u003Cstring>\n\nclass Serial_Node : public rclcpp::Node\n{\npublic:\n  Serial_Node() : Node(\"serial_node_cpp\")\n  {\n    \u002F\u002F 等设备准备好再初始化\n    \u002F\u002F std::this_thread::sleep_for(std::chrono::milliseconds(500));\n\n    \u002F\u002F 串口设备名（根据实际设备调整）\n    const std::string device_name = \"\u002Fdev\u002FttyUSB0\";\n\n    RCLCPP_INFO(this->get_logger(), \"Serial port Node Open!\");\n    \u002F\u002F 创建串口配置对象\n    \u002F\u002F 波特率115200；不开启流控制；无奇偶效验；停止位1。\n    drivers::serial_driver::SerialPortConfig config(\n        9600,\n        drivers::serial_driver::FlowControl::NONE,\n        drivers::serial_driver::Parity::NONE,\n        drivers::serial_driver::StopBits::ONE);\n\n    \u002F\u002F 初始化串口\n    try\n    {\n      io_context_ = std::make_shared\u003Cdrivers::common::IoContext>(1);\n      \u002F\u002F 初始化 serial_driver_\n      serial_driver_ = std::make_shared\u003Cdrivers::serial_driver::SerialDriver>(*io_context_);\n      serial_driver_->init_port(device_name, config);\n      serial_driver_->port()->open();\n\n      RCLCPP_INFO(this->get_logger(), \"Serial port initialized successfully\");\n      RCLCPP_INFO(this->get_logger(), \"Using device: %s\", serial_driver_->port().get()->device_name().c_str());\n      RCLCPP_INFO(this->get_logger(), \"Baud_rate: %d\", config.get_baud_rate());\n    }\n    catch (const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Failed to initialize serial port: %s\", ex.what());\n      return;\n    }\n\n    async_receive_message();\n  }\n\nprivate:\n  void async_receive_message()  \u002F\u002F创建一个函数更方便重新调用\n  {\n    auto port = serial_driver_->port();\n\n    \u002F\u002F 设置接收回调函数\n    port->async_receive([this](const std::vector\u003Cuint8_t> &data,const size_t &size) \n    {\n        if (size > 0)\n        {\n            \u002F\u002F 处理接收到的数据\n            std::string received_message(data.begin(), data.begin() + size);\n            RCLCPP_INFO(this->get_logger(), \"Received: %s (%ld bytes)\", received_message.c_str(),size);\n        }\n        \u002F\u002F 继续监听新的数据\n        async_receive_message();\n    }\n    );\n  }\n\n  std::shared_ptr\u003Cdrivers::serial_driver::SerialDriver> serial_driver_;\n  std::shared_ptr\u003Cdrivers::common::IoContext> io_context_;\n  std::vector\u003Cuint8_t> receive_data_buffer = std::vector\u003Cuint8_t>(1024); \u002F\u002F 接收缓冲区\n};\n\nint main(int argc, char **argv)\n{\n  rclcpp::init(argc, argv);\n\n  auto node = std::make_shared\u003CSerial_Node>();\n\n  rclcpp::spin(node);\n\n  rclcpp::shutdown();\n  return 0;\n}\n",[70,2806,2807,2813,2819,2825,2829,2845,2849,2853,2867,2871,2875,2879,2883,2887,2901,2905,2923,2927,2931,2945,2951,2965,2979,2993,2997,3001,3005,3009,3039,3043,3073,3081,3093,3097,3115,3153,3179,3183,3199,3203,3229,3235,3239,3243,3250,3254,3258,3262,3275,3279,3293,3297,3302,3355,3359,3373,3378,3383,3409,3443,3448,3453,3460,3464,3469,3473,3477,3497,3517,3550,3554,3558,3580,3584,3594,3598,3618,3622,3632,3636,3646,3654],{"__ignoreMap":188},[192,2808,2809,2811],{"class":194,"line":195},[192,2810,788],{"class":212},[192,2812,791],{"class":202},[192,2814,2815,2817],{"class":194,"line":229},[192,2816,788],{"class":212},[192,2818,798],{"class":202},[192,2820,2821,2823],{"class":194,"line":251},[192,2822,788],{"class":212},[192,2824,1918],{"class":202},[192,2826,2827],{"class":194,"line":258},[192,2828,255],{"emptyLinePlaceholder":254},[192,2830,2831,2833,2835,2837,2839,2841,2843],{"class":194,"line":265},[192,2832,807],{"class":212},[192,2834,810],{"class":198},[192,2836,813],{"class":219},[192,2838,816],{"class":212},[192,2840,574],{"class":198},[192,2842,821],{"class":219},[192,2844,824],{"class":198},[192,2846,2847],{"class":194,"line":277},[192,2848,829],{"class":219},[192,2850,2851],{"class":194,"line":289},[192,2852,834],{"class":212},[192,2854,2855,2857,2859,2861,2863,2865],{"class":194,"line":295},[192,2856,839],{"class":198},[192,2858,842],{"class":219},[192,2860,845],{"class":198},[192,2862,848],{"class":219},[192,2864,851],{"class":202},[192,2866,854],{"class":219},[192,2868,2869],{"class":194,"line":307},[192,2870,859],{"class":219},[192,2872,2873],{"class":194,"line":867},[192,2874,864],{"class":261},[192,2876,2877],{"class":194,"line":873},[192,2878,870],{"class":261},[192,2880,2881],{"class":194,"line":878},[192,2882,255],{"emptyLinePlaceholder":254},[192,2884,2885],{"class":194,"line":884},[192,2886,881],{"class":261},[192,2888,2889,2891,2893,2895,2897,2899],{"class":194,"line":905},[192,2890,887],{"class":212},[192,2892,890],{"class":198},[192,2894,893],{"class":219},[192,2896,896],{"class":212},[192,2898,899],{"class":202},[192,2900,902],{"class":219},[192,2902,2903],{"class":194,"line":910},[192,2904,255],{"emptyLinePlaceholder":254},[192,2906,2907,2909,2911,2913,2915,2917,2919,2921],{"class":194,"line":936},[192,2908,913],{"class":198},[192,2910,848],{"class":219},[192,2912,918],{"class":413},[192,2914,921],{"class":219},[192,2916,924],{"class":198},[192,2918,927],{"class":219},[192,2920,930],{"class":202},[192,2922,933],{"class":219},[192,2924,2925],{"class":194,"line":942},[192,2926,939],{"class":261},[192,2928,2929],{"class":194,"line":948},[192,2930,945],{"class":261},[192,2932,2933,2935,2937,2939,2941,2943],{"class":194,"line":966},[192,2934,951],{"class":198},[192,2936,821],{"class":219},[192,2938,155],{"class":198},[192,2940,958],{"class":219},[192,2942,631],{"class":198},[192,2944,963],{"class":219},[192,2946,2947,2949],{"class":194,"line":975},[192,2948,969],{"class":413},[192,2950,972],{"class":219},[192,2952,2953,2955,2957,2959,2961,2963],{"class":194,"line":993},[192,2954,978],{"class":198},[192,2956,821],{"class":219},[192,2958,155],{"class":198},[192,2960,821],{"class":219},[192,2962,987],{"class":198},[192,2964,990],{"class":219},[192,2966,2967,2969,2971,2973,2975,2977],{"class":194,"line":1009},[192,2968,978],{"class":198},[192,2970,821],{"class":219},[192,2972,155],{"class":198},[192,2974,821],{"class":219},[192,2976,1004],{"class":198},[192,2978,990],{"class":219},[192,2980,2981,2983,2985,2987,2989,2991],{"class":194,"line":1026},[192,2982,978],{"class":198},[192,2984,821],{"class":219},[192,2986,155],{"class":198},[192,2988,821],{"class":219},[192,2990,1020],{"class":198},[192,2992,1023],{"class":219},[192,2994,2995],{"class":194,"line":1031},[192,2996,255],{"emptyLinePlaceholder":254},[192,2998,2999],{"class":194,"line":1037},[192,3000,1034],{"class":261},[192,3002,3003],{"class":194,"line":1043},[192,3004,1040],{"class":212},[192,3006,3007],{"class":194,"line":1049},[192,3008,1046],{"class":219},[192,3010,3011,3013,3015,3017,3019,3021,3023,3025,3027,3029,3031,3033,3035,3037],{"class":194,"line":1087},[192,3012,1052],{"class":219},[192,3014,896],{"class":212},[192,3016,890],{"class":198},[192,3018,821],{"class":219},[192,3020,1061],{"class":198},[192,3022,213],{"class":219},[192,3024,1066],{"class":198},[192,3026,821],{"class":219},[192,3028,1071],{"class":198},[192,3030,821],{"class":219},[192,3032,1076],{"class":198},[192,3034,1079],{"class":219},[192,3036,1082],{"class":413},[192,3038,933],{"class":219},[192,3040,3041],{"class":194,"line":1093},[192,3042,1090],{"class":261},[192,3044,3045,3047,3049,3051,3053,3055,3057,3059,3061,3063,3065,3067,3069,3071],{"class":194,"line":1128},[192,3046,1096],{"class":219},[192,3048,896],{"class":212},[192,3050,890],{"class":198},[192,3052,821],{"class":219},[192,3054,1061],{"class":198},[192,3056,213],{"class":219},[192,3058,1066],{"class":198},[192,3060,821],{"class":219},[192,3062,155],{"class":198},[192,3064,821],{"class":219},[192,3066,1117],{"class":198},[192,3068,1079],{"class":219},[192,3070,1122],{"class":212},[192,3072,1125],{"class":219},[192,3074,3075,3077,3079],{"class":194,"line":1140},[192,3076,1131],{"class":219},[192,3078,1134],{"class":198},[192,3080,1137],{"class":219},[192,3082,3083,3085,3087,3089,3091],{"class":194,"line":1157},[192,3084,1131],{"class":219},[192,3086,1145],{"class":198},[192,3088,1148],{"class":219},[192,3090,1151],{"class":198},[192,3092,1154],{"class":219},[192,3094,3095],{"class":194,"line":1162},[192,3096,255],{"emptyLinePlaceholder":254},[192,3098,3099,3101,3103,3105,3107,3109,3111,3113],{"class":194,"line":1183},[192,3100,1165],{"class":198},[192,3102,848],{"class":219},[192,3104,918],{"class":413},[192,3106,921],{"class":219},[192,3108,924],{"class":198},[192,3110,927],{"class":219},[192,3112,1178],{"class":202},[192,3114,933],{"class":219},[192,3116,3117,3119,3121,3123,3125,3127,3129,3131,3133,3135,3137,3139,3141,3143,3145,3147,3149,3151],{"class":194,"line":1231},[192,3118,1165],{"class":198},[192,3120,848],{"class":219},[192,3122,918],{"class":413},[192,3124,921],{"class":219},[192,3126,924],{"class":198},[192,3128,927],{"class":219},[192,3130,1198],{"class":202},[192,3132,1201],{"class":413},[192,3134,1204],{"class":202},[192,3136,1207],{"class":219},[192,3138,1145],{"class":198},[192,3140,1212],{"class":219},[192,3142,1215],{"class":198},[192,3144,1148],{"class":219},[192,3146,1220],{"class":198},[192,3148,1212],{"class":219},[192,3150,1225],{"class":198},[192,3152,1228],{"class":219},[192,3154,3155,3157,3159,3161,3163,3165,3167,3169,3171,3173,3175,3177],{"class":194,"line":1262},[192,3156,1165],{"class":198},[192,3158,848],{"class":219},[192,3160,918],{"class":413},[192,3162,921],{"class":219},[192,3164,924],{"class":198},[192,3166,927],{"class":219},[192,3168,1246],{"class":202},[192,3170,1249],{"class":413},[192,3172,1204],{"class":202},[192,3174,1254],{"class":219},[192,3176,1257],{"class":198},[192,3178,1228],{"class":219},[192,3180,3181],{"class":194,"line":1268},[192,3182,1265],{"class":219},[192,3184,3185,3187,3189,3191,3193,3195,3197],{"class":194,"line":1291},[192,3186,1271],{"class":212},[192,3188,1274],{"class":219},[192,3190,1277],{"class":212},[192,3192,890],{"class":198},[192,3194,1282],{"class":219},[192,3196,1285],{"class":212},[192,3198,1288],{"class":219},[192,3200,3201],{"class":194,"line":1296},[192,3202,1046],{"class":219},[192,3204,3205,3207,3209,3211,3213,3215,3217,3219,3221,3223,3225,3227],{"class":194,"line":1327},[192,3206,1299],{"class":198},[192,3208,848],{"class":219},[192,3210,918],{"class":413},[192,3212,921],{"class":219},[192,3214,924],{"class":198},[192,3216,927],{"class":219},[192,3218,1312],{"class":202},[192,3220,1201],{"class":413},[192,3222,1204],{"class":202},[192,3224,1319],{"class":219},[192,3226,1322],{"class":198},[192,3228,1228],{"class":219},[192,3230,3231,3233],{"class":194,"line":1335},[192,3232,1330],{"class":212},[192,3234,902],{"class":219},[192,3236,3237],{"class":194,"line":1340},[192,3238,1265],{"class":219},[192,3240,3241],{"class":194,"line":1345},[192,3242,255],{"emptyLinePlaceholder":254},[192,3244,3245,3248],{"class":194,"line":1351},[192,3246,3247],{"class":198},"    async_receive_message",[192,3249,1154],{"class":219},[192,3251,3252],{"class":194,"line":1369},[192,3253,1420],{"class":219},[192,3255,3256],{"class":194,"line":1392},[192,3257,255],{"emptyLinePlaceholder":254},[192,3259,3260],{"class":194,"line":1417},[192,3261,1431],{"class":212},[192,3263,3264,3266,3269,3272],{"class":194,"line":1423},[192,3265,1437],{"class":212},[192,3267,3268],{"class":198}," async_receive_message",[192,3270,3271],{"class":219},"()",[192,3273,3274],{"class":261},"  \u002F\u002F创建一个函数更方便重新调用\n",[192,3276,3277],{"class":194,"line":1428},[192,3278,859],{"class":219},[192,3280,3281,3283,3285,3287,3289,3291],{"class":194,"line":1434},[192,3282,1520],{"class":212},[192,3284,1523],{"class":219},[192,3286,896],{"class":212},[192,3288,1528],{"class":219},[192,3290,1145],{"class":198},[192,3292,1154],{"class":219},[192,3294,3295],{"class":194,"line":1446},[192,3296,255],{"emptyLinePlaceholder":254},[192,3298,3299],{"class":194,"line":1451},[192,3300,3301],{"class":261},"    \u002F\u002F 设置接收回调函数\n",[192,3303,3304,3307,3309,3312,3314,3317,3319,3321,3323,3325,3327,3330,3333,3335,3338,3341,3343,3346,3349,3352],{"class":194,"line":1457},[192,3305,3306],{"class":219},"    port->",[192,3308,86],{"class":198},[192,3310,3311],{"class":219},"([",[192,3313,918],{"class":413},[192,3315,3316],{"class":219},"](",[192,3318,1277],{"class":212},[192,3320,890],{"class":198},[192,3322,821],{"class":219},[192,3324,771],{"class":198},[192,3326,213],{"class":219},[192,3328,3329],{"class":212},"uint8_t",[192,3331,3332],{"class":219},"> ",[192,3334,1285],{"class":212},[192,3336,3337],{"class":1762},"data",[192,3339,3340],{"class":219},",",[192,3342,1277],{"class":212},[192,3344,3345],{"class":212}," size_t",[192,3347,3348],{"class":212}," &",[192,3350,3351],{"class":1762},"size",[192,3353,3354],{"class":219},") \n",[192,3356,3357],{"class":194,"line":1479},[192,3358,1046],{"class":219},[192,3360,3361,3364,3367,3369,3371],{"class":194,"line":1508},[192,3362,3363],{"class":212},"        if",[192,3365,3366],{"class":219}," (size ",[192,3368,223],{"class":212},[192,3370,1868],{"class":413},[192,3372,854],{"class":219},[192,3374,3375],{"class":194,"line":1517},[192,3376,3377],{"class":219},"        {\n",[192,3379,3380],{"class":194,"line":1535},[192,3381,3382],{"class":261},"            \u002F\u002F 处理接收到的数据\n",[192,3384,3385,3388,3390,3393,3395,3397,3400,3402,3404,3406],{"class":194,"line":1540},[192,3386,3387],{"class":198},"            std",[192,3389,2508],{"class":219},[192,3391,3392],{"class":198},"received_message",[192,3394,2514],{"class":219},[192,3396,1497],{"class":198},[192,3398,3399],{"class":219},"(), data.",[192,3401,1497],{"class":198},[192,3403,2524],{"class":219},[192,3405,2527],{"class":212},[192,3407,3408],{"class":219}," size);\n",[192,3410,3411,3414,3416,3418,3420,3422,3424,3427,3429,3431,3433,3435,3438,3440],{"class":194,"line":1545},[192,3412,3413],{"class":198},"            RCLCPP_INFO",[192,3415,848],{"class":219},[192,3417,918],{"class":413},[192,3419,921],{"class":219},[192,3421,924],{"class":198},[192,3423,927],{"class":219},[192,3425,3426],{"class":202},"\"Received: ",[192,3428,1201],{"class":413},[192,3430,1274],{"class":202},[192,3432,1591],{"class":413},[192,3434,1594],{"class":202},[192,3436,3437],{"class":219},", received_message.",[192,3439,1225],{"class":198},[192,3441,3442],{"class":219},"(),size);\n",[192,3444,3445],{"class":194,"line":1550},[192,3446,3447],{"class":219},"        }\n",[192,3449,3450],{"class":194,"line":1569},[192,3451,3452],{"class":261},"        \u002F\u002F 继续监听新的数据\n",[192,3454,3455,3458],{"class":194,"line":1605},[192,3456,3457],{"class":198},"        async_receive_message",[192,3459,1154],{"class":219},[192,3461,3462],{"class":194,"line":1610},[192,3463,1265],{"class":219},[192,3465,3466],{"class":194,"line":1627},[192,3467,3468],{"class":219},"    );\n",[192,3470,3471],{"class":194,"line":1632},[192,3472,1420],{"class":219},[192,3474,3475],{"class":194,"line":1661},[192,3476,255],{"emptyLinePlaceholder":254},[192,3478,3479,3481,3483,3485,3487,3489,3491,3493,3495],{"class":194,"line":1666},[192,3480,1679],{"class":198},[192,3482,1682],{"class":219},[192,3484,213],{"class":212},[192,3486,1066],{"class":198},[192,3488,821],{"class":219},[192,3490,155],{"class":198},[192,3492,1693],{"class":219},[192,3494,223],{"class":212},[192,3496,1698],{"class":219},[192,3498,3499,3501,3503,3505,3507,3509,3511,3513,3515],{"class":194,"line":1671},[192,3500,1679],{"class":198},[192,3502,1682],{"class":219},[192,3504,213],{"class":212},[192,3506,1066],{"class":198},[192,3508,821],{"class":219},[192,3510,1071],{"class":198},[192,3512,1716],{"class":219},[192,3514,223],{"class":212},[192,3516,1721],{"class":219},[192,3518,3519,3521,3523,3525,3528,3530,3532,3534,3536,3538,3540,3542,3545,3547],{"class":194,"line":1676},[192,3520,1679],{"class":198},[192,3522,1485],{"class":219},[192,3524,1488],{"class":212},[192,3526,3527],{"class":219}," receive_data_buffer ",[192,3529,896],{"class":212},[192,3531,890],{"class":198},[192,3533,821],{"class":219},[192,3535,771],{"class":198},[192,3537,213],{"class":219},[192,3539,3329],{"class":212},[192,3541,1079],{"class":219},[192,3543,3544],{"class":413},"1024",[192,3546,2438],{"class":219},[192,3548,3549],{"class":261}," \u002F\u002F 接收缓冲区\n",[192,3551,3552],{"class":194,"line":1701},[192,3553,1741],{"class":219},[192,3555,3556],{"class":194,"line":1724},[192,3557,255],{"emptyLinePlaceholder":254},[192,3559,3560,3562,3564,3566,3568,3570,3572,3574,3576,3578],{"class":194,"line":1738},[192,3561,1752],{"class":212},[192,3563,1755],{"class":198},[192,3565,848],{"class":219},[192,3567,1752],{"class":212},[192,3569,1763],{"class":1762},[192,3571,1766],{"class":219},[192,3573,1769],{"class":212},[192,3575,1772],{"class":212},[192,3577,1775],{"class":1762},[192,3579,854],{"class":219},[192,3581,3582],{"class":194,"line":1744},[192,3583,829],{"class":219},[192,3585,3586,3588,3590,3592],{"class":194,"line":1749},[192,3587,1727],{"class":198},[192,3589,821],{"class":219},[192,3591,1792],{"class":198},[192,3593,1795],{"class":219},[192,3595,3596],{"class":194,"line":1780},[192,3597,255],{"emptyLinePlaceholder":254},[192,3599,3600,3602,3604,3606,3608,3610,3612,3614,3616],{"class":194,"line":1785},[192,3601,1806],{"class":212},[192,3603,1809],{"class":219},[192,3605,896],{"class":212},[192,3607,890],{"class":198},[192,3609,821],{"class":219},[192,3611,1061],{"class":198},[192,3613,213],{"class":219},[192,3615,1406],{"class":198},[192,3617,1824],{"class":219},[192,3619,3620],{"class":194,"line":1798},[192,3621,255],{"emptyLinePlaceholder":254},[192,3623,3624,3626,3628,3630],{"class":194,"line":1803},[192,3625,1727],{"class":198},[192,3627,821],{"class":219},[192,3629,1839],{"class":198},[192,3631,1842],{"class":219},[192,3633,3634],{"class":194,"line":1827},[192,3635,255],{"emptyLinePlaceholder":254},[192,3637,3638,3640,3642,3644],{"class":194,"line":1832},[192,3639,1727],{"class":198},[192,3641,821],{"class":219},[192,3643,1857],{"class":198},[192,3645,1154],{"class":219},[192,3647,3648,3650,3652],{"class":194,"line":1845},[192,3649,1865],{"class":212},[192,3651,1868],{"class":413},[192,3653,902],{"class":219},[192,3655,3656],{"class":194,"line":1850},[192,3657,1876],{"class":219},[15,3659,3660],{},[598,3661],{"alt":188,"src":3662},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1786.webp",[55,3664,3666],{"id":3665},"total-code-both-transmit-and-receive","Total code (both transmit and receive)",[183,3668,3670],{"className":779,"code":3669,"language":781,"meta":188,"style":188},"#include \"rclcpp\u002Frclcpp.hpp\"\n#include \"serial_driver\u002Fserial_driver.hpp\"\n#include \u003Cstring>\n\nclass Serial_Node : public rclcpp::Node\n{\npublic:\n  Serial_Node() : Node(\"serial_node_cpp\")\n  {\n    \u002F\u002F 等设备准备好再初始化\n    \u002F\u002F std::this_thread::sleep_for(std::chrono::milliseconds(500));\n\n    \u002F\u002F 串口设备名（根据实际设备调整）\n    const std::string device_name = \"\u002Fdev\u002FttyUSB0\";\n\n    RCLCPP_INFO(this->get_logger(), \"Serial port Node Open!\");\n    \u002F\u002F 创建串口配置对象\n    \u002F\u002F 波特率115200；不开启流控制；无奇偶效验；停止位1。\n    drivers::serial_driver::SerialPortConfig config(\n        9600,\n        drivers::serial_driver::FlowControl::NONE,\n        drivers::serial_driver::Parity::NONE,\n        drivers::serial_driver::StopBits::ONE);\n\n    \u002F\u002F 初始化串口\n    try\n    {\n      io_context_ = std::make_shared\u003Cdrivers::common::IoContext>(1);\n      \u002F\u002F 初始化 serial_driver_\n      serial_driver_ = std::make_shared\u003Cdrivers::serial_driver::SerialDriver>(*io_context_);\n      serial_driver_->init_port(device_name, config);\n      serial_driver_->port()->open();\n\n      RCLCPP_INFO(this->get_logger(), \"Serial port initialized successfully\");\n      RCLCPP_INFO(this->get_logger(), \"Using device: %s\", serial_driver_->port().get()->device_name().c_str());\n      RCLCPP_INFO(this->get_logger(), \"Baud_rate: %d\", config.get_baud_rate());\n    }\n    catch (const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Failed to initialize serial port: %s\", ex.what());\n      return;\n    }\n\n        \u002F\u002F 设置发送定时器\n    transmit_timer_ = this->create_wall_timer(\n        std::chrono::milliseconds(5000),\n        std::bind(&Serial_Node::send_message_timer_callback, this));\n\n    async_receive_message();   \u002F\u002F进入异步接收\n  }\n\nprivate:\n\n  void send_message_timer_callback()\n  {\n    \u002F\u002F 发送一串字符串\n    const std::string transmitted_message = \"Hello from ROS 2!\\n\";\n    transmit_data_buffer = std::vector\u003Cuint8_t>(transmitted_message.begin(), transmitted_message.end());\n    \u002F\u002F std::vector\u003Cuint8_t> hex_data = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; \u002F\u002F \"Hello\" in ASCII\n    auto port = serial_driver_->port();\n\n    try\n    {\n      size_t bytes_transmit_size = port->send(transmit_data_buffer);\n      RCLCPP_INFO(this->get_logger(), \"Transmitted: %s (%ld bytes)\", transmitted_message.c_str(), bytes_transmit_size);\n    }\n    catch(const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Error Transmiting from serial port:%s\",ex.what());\n    }\n  }\n\n  void async_receive_message()  \u002F\u002F创建一个函数更方便重新调用\n  {\n    auto port = serial_driver_->port();\n\n    \u002F\u002F 设置接收回调函数\n    port->async_receive([this](const std::vector\u003Cuint8_t> &data,const size_t &size) \n    {\n        if (size > 0)\n        {\n            \u002F\u002F 处理接收到的数据\n            std::string received_message(data.begin(), data.begin() + size);\n            RCLCPP_INFO(this->get_logger(), \"Received: %s (%ld bytes)\", received_message.c_str(),size);\n        }\n        \u002F\u002F 继续监听新的数据\n        async_receive_message();\n    }\n    );\n  }\n\n  std::shared_ptr\u003Cdrivers::serial_driver::SerialDriver> serial_driver_;\n  std::shared_ptr\u003Cdrivers::common::IoContext> io_context_;\n  rclcpp::TimerBase::SharedPtr transmit_timer_;\n  std::vector\u003Cuint8_t> transmit_data_buffer = std::vector\u003Cuint8_t>(1024); \u002F\u002F 发送缓冲区\n  std::vector\u003Cuint8_t> receive_data_buffer = std::vector\u003Cuint8_t>(1024);  \u002F\u002F 接收缓冲区\n};\n\nint main(int argc, char **argv)\n{\n  rclcpp::init(argc, argv);\n\n  auto node = std::make_shared\u003CSerial_Node>();\n\n  rclcpp::spin(node);\n\n  rclcpp::shutdown();\n  return 0;\n}\n",[70,3671,3672,3678,3684,3690,3694,3710,3714,3718,3732,3736,3740,3744,3748,3752,3766,3770,3788,3792,3796,3810,3816,3830,3844,3858,3862,3866,3870,3874,3904,3908,3938,3946,3958,3962,3980,4018,4044,4048,4064,4068,4094,4100,4104,4108,4113,4128,4147,4167,4171,4181,4185,4189,4193,4197,4205,4209,4213,4232,4261,4267,4281,4285,4289,4293,4309,4342,4346,4362,4366,4392,4396,4400,4404,4414,4418,4432,4436,4440,4482,4486,4498,4502,4506,4528,4558,4562,4566,4573,4578,4583,4588,4593,4614,4635,4647,4680,4712,4717,4722,4745,4750,4761,4766,4787,4792,4803,4808,4819,4828],{"__ignoreMap":188},[192,3673,3674,3676],{"class":194,"line":195},[192,3675,788],{"class":212},[192,3677,791],{"class":202},[192,3679,3680,3682],{"class":194,"line":229},[192,3681,788],{"class":212},[192,3683,798],{"class":202},[192,3685,3686,3688],{"class":194,"line":251},[192,3687,788],{"class":212},[192,3689,1918],{"class":202},[192,3691,3692],{"class":194,"line":258},[192,3693,255],{"emptyLinePlaceholder":254},[192,3695,3696,3698,3700,3702,3704,3706,3708],{"class":194,"line":265},[192,3697,807],{"class":212},[192,3699,810],{"class":198},[192,3701,813],{"class":219},[192,3703,816],{"class":212},[192,3705,574],{"class":198},[192,3707,821],{"class":219},[192,3709,824],{"class":198},[192,3711,3712],{"class":194,"line":277},[192,3713,829],{"class":219},[192,3715,3716],{"class":194,"line":289},[192,3717,834],{"class":212},[192,3719,3720,3722,3724,3726,3728,3730],{"class":194,"line":295},[192,3721,839],{"class":198},[192,3723,842],{"class":219},[192,3725,845],{"class":198},[192,3727,848],{"class":219},[192,3729,851],{"class":202},[192,3731,854],{"class":219},[192,3733,3734],{"class":194,"line":307},[192,3735,859],{"class":219},[192,3737,3738],{"class":194,"line":867},[192,3739,864],{"class":261},[192,3741,3742],{"class":194,"line":873},[192,3743,870],{"class":261},[192,3745,3746],{"class":194,"line":878},[192,3747,255],{"emptyLinePlaceholder":254},[192,3749,3750],{"class":194,"line":884},[192,3751,881],{"class":261},[192,3753,3754,3756,3758,3760,3762,3764],{"class":194,"line":905},[192,3755,887],{"class":212},[192,3757,890],{"class":198},[192,3759,893],{"class":219},[192,3761,896],{"class":212},[192,3763,899],{"class":202},[192,3765,902],{"class":219},[192,3767,3768],{"class":194,"line":910},[192,3769,255],{"emptyLinePlaceholder":254},[192,3771,3772,3774,3776,3778,3780,3782,3784,3786],{"class":194,"line":936},[192,3773,913],{"class":198},[192,3775,848],{"class":219},[192,3777,918],{"class":413},[192,3779,921],{"class":219},[192,3781,924],{"class":198},[192,3783,927],{"class":219},[192,3785,930],{"class":202},[192,3787,933],{"class":219},[192,3789,3790],{"class":194,"line":942},[192,3791,939],{"class":261},[192,3793,3794],{"class":194,"line":948},[192,3795,945],{"class":261},[192,3797,3798,3800,3802,3804,3806,3808],{"class":194,"line":966},[192,3799,951],{"class":198},[192,3801,821],{"class":219},[192,3803,155],{"class":198},[192,3805,958],{"class":219},[192,3807,631],{"class":198},[192,3809,963],{"class":219},[192,3811,3812,3814],{"class":194,"line":975},[192,3813,969],{"class":413},[192,3815,972],{"class":219},[192,3817,3818,3820,3822,3824,3826,3828],{"class":194,"line":993},[192,3819,978],{"class":198},[192,3821,821],{"class":219},[192,3823,155],{"class":198},[192,3825,821],{"class":219},[192,3827,987],{"class":198},[192,3829,990],{"class":219},[192,3831,3832,3834,3836,3838,3840,3842],{"class":194,"line":1009},[192,3833,978],{"class":198},[192,3835,821],{"class":219},[192,3837,155],{"class":198},[192,3839,821],{"class":219},[192,3841,1004],{"class":198},[192,3843,990],{"class":219},[192,3845,3846,3848,3850,3852,3854,3856],{"class":194,"line":1026},[192,3847,978],{"class":198},[192,3849,821],{"class":219},[192,3851,155],{"class":198},[192,3853,821],{"class":219},[192,3855,1020],{"class":198},[192,3857,1023],{"class":219},[192,3859,3860],{"class":194,"line":1031},[192,3861,255],{"emptyLinePlaceholder":254},[192,3863,3864],{"class":194,"line":1037},[192,3865,1034],{"class":261},[192,3867,3868],{"class":194,"line":1043},[192,3869,1040],{"class":212},[192,3871,3872],{"class":194,"line":1049},[192,3873,1046],{"class":219},[192,3875,3876,3878,3880,3882,3884,3886,3888,3890,3892,3894,3896,3898,3900,3902],{"class":194,"line":1087},[192,3877,1052],{"class":219},[192,3879,896],{"class":212},[192,3881,890],{"class":198},[192,3883,821],{"class":219},[192,3885,1061],{"class":198},[192,3887,213],{"class":219},[192,3889,1066],{"class":198},[192,3891,821],{"class":219},[192,3893,1071],{"class":198},[192,3895,821],{"class":219},[192,3897,1076],{"class":198},[192,3899,1079],{"class":219},[192,3901,1082],{"class":413},[192,3903,933],{"class":219},[192,3905,3906],{"class":194,"line":1093},[192,3907,1090],{"class":261},[192,3909,3910,3912,3914,3916,3918,3920,3922,3924,3926,3928,3930,3932,3934,3936],{"class":194,"line":1128},[192,3911,1096],{"class":219},[192,3913,896],{"class":212},[192,3915,890],{"class":198},[192,3917,821],{"class":219},[192,3919,1061],{"class":198},[192,3921,213],{"class":219},[192,3923,1066],{"class":198},[192,3925,821],{"class":219},[192,3927,155],{"class":198},[192,3929,821],{"class":219},[192,3931,1117],{"class":198},[192,3933,1079],{"class":219},[192,3935,1122],{"class":212},[192,3937,1125],{"class":219},[192,3939,3940,3942,3944],{"class":194,"line":1140},[192,3941,1131],{"class":219},[192,3943,1134],{"class":198},[192,3945,1137],{"class":219},[192,3947,3948,3950,3952,3954,3956],{"class":194,"line":1157},[192,3949,1131],{"class":219},[192,3951,1145],{"class":198},[192,3953,1148],{"class":219},[192,3955,1151],{"class":198},[192,3957,1154],{"class":219},[192,3959,3960],{"class":194,"line":1162},[192,3961,255],{"emptyLinePlaceholder":254},[192,3963,3964,3966,3968,3970,3972,3974,3976,3978],{"class":194,"line":1183},[192,3965,1165],{"class":198},[192,3967,848],{"class":219},[192,3969,918],{"class":413},[192,3971,921],{"class":219},[192,3973,924],{"class":198},[192,3975,927],{"class":219},[192,3977,1178],{"class":202},[192,3979,933],{"class":219},[192,3981,3982,3984,3986,3988,3990,3992,3994,3996,3998,4000,4002,4004,4006,4008,4010,4012,4014,4016],{"class":194,"line":1231},[192,3983,1165],{"class":198},[192,3985,848],{"class":219},[192,3987,918],{"class":413},[192,3989,921],{"class":219},[192,3991,924],{"class":198},[192,3993,927],{"class":219},[192,3995,1198],{"class":202},[192,3997,1201],{"class":413},[192,3999,1204],{"class":202},[192,4001,1207],{"class":219},[192,4003,1145],{"class":198},[192,4005,1212],{"class":219},[192,4007,1215],{"class":198},[192,4009,1148],{"class":219},[192,4011,1220],{"class":198},[192,4013,1212],{"class":219},[192,4015,1225],{"class":198},[192,4017,1228],{"class":219},[192,4019,4020,4022,4024,4026,4028,4030,4032,4034,4036,4038,4040,4042],{"class":194,"line":1262},[192,4021,1165],{"class":198},[192,4023,848],{"class":219},[192,4025,918],{"class":413},[192,4027,921],{"class":219},[192,4029,924],{"class":198},[192,4031,927],{"class":219},[192,4033,1246],{"class":202},[192,4035,1249],{"class":413},[192,4037,1204],{"class":202},[192,4039,1254],{"class":219},[192,4041,1257],{"class":198},[192,4043,1228],{"class":219},[192,4045,4046],{"class":194,"line":1268},[192,4047,1265],{"class":219},[192,4049,4050,4052,4054,4056,4058,4060,4062],{"class":194,"line":1291},[192,4051,1271],{"class":212},[192,4053,1274],{"class":219},[192,4055,1277],{"class":212},[192,4057,890],{"class":198},[192,4059,1282],{"class":219},[192,4061,1285],{"class":212},[192,4063,1288],{"class":219},[192,4065,4066],{"class":194,"line":1296},[192,4067,1046],{"class":219},[192,4069,4070,4072,4074,4076,4078,4080,4082,4084,4086,4088,4090,4092],{"class":194,"line":1327},[192,4071,1299],{"class":198},[192,4073,848],{"class":219},[192,4075,918],{"class":413},[192,4077,921],{"class":219},[192,4079,924],{"class":198},[192,4081,927],{"class":219},[192,4083,1312],{"class":202},[192,4085,1201],{"class":413},[192,4087,1204],{"class":202},[192,4089,1319],{"class":219},[192,4091,1322],{"class":198},[192,4093,1228],{"class":219},[192,4095,4096,4098],{"class":194,"line":1335},[192,4097,1330],{"class":212},[192,4099,902],{"class":219},[192,4101,4102],{"class":194,"line":1340},[192,4103,1265],{"class":219},[192,4105,4106],{"class":194,"line":1345},[192,4107,255],{"emptyLinePlaceholder":254},[192,4109,4110],{"class":194,"line":1351},[192,4111,4112],{"class":261},"        \u002F\u002F 设置发送定时器\n",[192,4114,4115,4118,4120,4122,4124,4126],{"class":194,"line":1369},[192,4116,4117],{"class":219},"    transmit_timer_ ",[192,4119,896],{"class":212},[192,4121,1359],{"class":413},[192,4123,921],{"class":219},[192,4125,1364],{"class":198},[192,4127,963],{"class":219},[192,4129,4130,4132,4134,4136,4138,4140,4142,4145],{"class":194,"line":1392},[192,4131,1372],{"class":198},[192,4133,821],{"class":219},[192,4135,1377],{"class":198},[192,4137,821],{"class":219},[192,4139,747],{"class":198},[192,4141,848],{"class":219},[192,4143,4144],{"class":413},"5000",[192,4146,1389],{"class":219},[192,4148,4149,4151,4153,4155,4157,4159,4161,4163,4165],{"class":194,"line":1417},[192,4150,1372],{"class":198},[192,4152,821],{"class":219},[192,4154,1399],{"class":198},[192,4156,848],{"class":219},[192,4158,1285],{"class":212},[192,4160,1406],{"class":198},[192,4162,1409],{"class":219},[192,4164,918],{"class":413},[192,4166,1414],{"class":219},[192,4168,4169],{"class":194,"line":1423},[192,4170,255],{"emptyLinePlaceholder":254},[192,4172,4173,4175,4178],{"class":194,"line":1428},[192,4174,3247],{"class":198},[192,4176,4177],{"class":219},"();",[192,4179,4180],{"class":261},"   \u002F\u002F进入异步接收\n",[192,4182,4183],{"class":194,"line":1434},[192,4184,1420],{"class":219},[192,4186,4187],{"class":194,"line":1446},[192,4188,255],{"emptyLinePlaceholder":254},[192,4190,4191],{"class":194,"line":1451},[192,4192,1431],{"class":212},[192,4194,4195],{"class":194,"line":1457},[192,4196,255],{"emptyLinePlaceholder":254},[192,4198,4199,4201,4203],{"class":194,"line":1479},[192,4200,1437],{"class":212},[192,4202,1440],{"class":198},[192,4204,1443],{"class":219},[192,4206,4207],{"class":194,"line":1508},[192,4208,859],{"class":219},[192,4210,4211],{"class":194,"line":1517},[192,4212,1454],{"class":261},[192,4214,4215,4217,4219,4222,4224,4226,4228,4230],{"class":194,"line":1535},[192,4216,887],{"class":212},[192,4218,890],{"class":198},[192,4220,4221],{"class":219},"::string transmitted_message ",[192,4223,896],{"class":212},[192,4225,1469],{"class":202},[192,4227,1472],{"class":413},[192,4229,1204],{"class":202},[192,4231,902],{"class":219},[192,4233,4234,4237,4239,4241,4243,4245,4247,4249,4252,4254,4257,4259],{"class":194,"line":1540},[192,4235,4236],{"class":219},"    transmit_data_buffer ",[192,4238,896],{"class":212},[192,4240,890],{"class":198},[192,4242,821],{"class":219},[192,4244,771],{"class":198},[192,4246,213],{"class":219},[192,4248,3329],{"class":212},[192,4250,4251],{"class":219},">(transmitted_message.",[192,4253,1497],{"class":198},[192,4255,4256],{"class":219},"(), transmitted_message.",[192,4258,1503],{"class":198},[192,4260,1228],{"class":219},[192,4262,4263,4265],{"class":194,"line":1545},[192,4264,1511],{"class":261},[192,4266,1514],{"class":261},[192,4268,4269,4271,4273,4275,4277,4279],{"class":194,"line":1550},[192,4270,1520],{"class":212},[192,4272,1523],{"class":219},[192,4274,896],{"class":212},[192,4276,1528],{"class":219},[192,4278,1145],{"class":198},[192,4280,1154],{"class":219},[192,4282,4283],{"class":194,"line":1569},[192,4284,255],{"emptyLinePlaceholder":254},[192,4286,4287],{"class":194,"line":1605},[192,4288,1040],{"class":212},[192,4290,4291],{"class":194,"line":1610},[192,4292,1046],{"class":219},[192,4294,4295,4297,4300,4302,4304,4306],{"class":194,"line":1627},[192,4296,1553],{"class":212},[192,4298,4299],{"class":219}," bytes_transmit_size ",[192,4301,896],{"class":212},[192,4303,1561],{"class":219},[192,4305,767],{"class":198},[192,4307,4308],{"class":219},"(transmit_data_buffer);\n",[192,4310,4311,4313,4315,4317,4319,4321,4323,4326,4328,4330,4332,4334,4337,4339],{"class":194,"line":1632},[192,4312,1165],{"class":198},[192,4314,848],{"class":219},[192,4316,918],{"class":413},[192,4318,921],{"class":219},[192,4320,924],{"class":198},[192,4322,927],{"class":219},[192,4324,4325],{"class":202},"\"Transmitted: ",[192,4327,1201],{"class":413},[192,4329,1274],{"class":202},[192,4331,1591],{"class":413},[192,4333,1594],{"class":202},[192,4335,4336],{"class":219},", transmitted_message.",[192,4338,1225],{"class":198},[192,4340,4341],{"class":219},"(), bytes_transmit_size);\n",[192,4343,4344],{"class":194,"line":1661},[192,4345,1265],{"class":219},[192,4347,4348,4350,4352,4354,4356,4358,4360],{"class":194,"line":1666},[192,4349,1271],{"class":212},[192,4351,848],{"class":219},[192,4353,1277],{"class":212},[192,4355,890],{"class":198},[192,4357,1282],{"class":219},[192,4359,1285],{"class":212},[192,4361,1288],{"class":219},[192,4363,4364],{"class":194,"line":1671},[192,4365,1046],{"class":219},[192,4367,4368,4370,4372,4374,4376,4378,4380,4382,4384,4386,4388,4390],{"class":194,"line":1676},[192,4369,1299],{"class":198},[192,4371,848],{"class":219},[192,4373,918],{"class":413},[192,4375,921],{"class":219},[192,4377,924],{"class":198},[192,4379,927],{"class":219},[192,4381,1647],{"class":202},[192,4383,1201],{"class":413},[192,4385,1204],{"class":202},[192,4387,1654],{"class":219},[192,4389,1322],{"class":198},[192,4391,1228],{"class":219},[192,4393,4394],{"class":194,"line":1701},[192,4395,1265],{"class":219},[192,4397,4398],{"class":194,"line":1724},[192,4399,1420],{"class":219},[192,4401,4402],{"class":194,"line":1738},[192,4403,255],{"emptyLinePlaceholder":254},[192,4405,4406,4408,4410,4412],{"class":194,"line":1744},[192,4407,1437],{"class":212},[192,4409,3268],{"class":198},[192,4411,3271],{"class":219},[192,4413,3274],{"class":261},[192,4415,4416],{"class":194,"line":1749},[192,4417,859],{"class":219},[192,4419,4420,4422,4424,4426,4428,4430],{"class":194,"line":1780},[192,4421,1520],{"class":212},[192,4423,1523],{"class":219},[192,4425,896],{"class":212},[192,4427,1528],{"class":219},[192,4429,1145],{"class":198},[192,4431,1154],{"class":219},[192,4433,4434],{"class":194,"line":1785},[192,4435,255],{"emptyLinePlaceholder":254},[192,4437,4438],{"class":194,"line":1798},[192,4439,3301],{"class":261},[192,4441,4442,4444,4446,4448,4450,4452,4454,4456,4458,4460,4462,4464,4466,4468,4470,4472,4474,4476,4478,4480],{"class":194,"line":1803},[192,4443,3306],{"class":219},[192,4445,86],{"class":198},[192,4447,3311],{"class":219},[192,4449,918],{"class":413},[192,4451,3316],{"class":219},[192,4453,1277],{"class":212},[192,4455,890],{"class":198},[192,4457,821],{"class":219},[192,4459,771],{"class":198},[192,4461,213],{"class":219},[192,4463,3329],{"class":212},[192,4465,3332],{"class":219},[192,4467,1285],{"class":212},[192,4469,3337],{"class":1762},[192,4471,3340],{"class":219},[192,4473,1277],{"class":212},[192,4475,3345],{"class":212},[192,4477,3348],{"class":212},[192,4479,3351],{"class":1762},[192,4481,3354],{"class":219},[192,4483,4484],{"class":194,"line":1827},[192,4485,1046],{"class":219},[192,4487,4488,4490,4492,4494,4496],{"class":194,"line":1832},[192,4489,3363],{"class":212},[192,4491,3366],{"class":219},[192,4493,223],{"class":212},[192,4495,1868],{"class":413},[192,4497,854],{"class":219},[192,4499,4500],{"class":194,"line":1845},[192,4501,3377],{"class":219},[192,4503,4504],{"class":194,"line":1850},[192,4505,3382],{"class":261},[192,4507,4508,4510,4512,4514,4516,4518,4520,4522,4524,4526],{"class":194,"line":1862},[192,4509,3387],{"class":198},[192,4511,2508],{"class":219},[192,4513,3392],{"class":198},[192,4515,2514],{"class":219},[192,4517,1497],{"class":198},[192,4519,3399],{"class":219},[192,4521,1497],{"class":198},[192,4523,2524],{"class":219},[192,4525,2527],{"class":212},[192,4527,3408],{"class":219},[192,4529,4530,4532,4534,4536,4538,4540,4542,4544,4546,4548,4550,4552,4554,4556],{"class":194,"line":1873},[192,4531,3413],{"class":198},[192,4533,848],{"class":219},[192,4535,918],{"class":413},[192,4537,921],{"class":219},[192,4539,924],{"class":198},[192,4541,927],{"class":219},[192,4543,3426],{"class":202},[192,4545,1201],{"class":413},[192,4547,1274],{"class":202},[192,4549,1591],{"class":413},[192,4551,1594],{"class":202},[192,4553,3437],{"class":219},[192,4555,1225],{"class":198},[192,4557,3442],{"class":219},[192,4559,4560],{"class":194,"line":2781},[192,4561,3447],{"class":219},[192,4563,4564],{"class":194,"line":2790},[192,4565,3452],{"class":261},[192,4567,4569,4571],{"class":194,"line":4568},87,[192,4570,3457],{"class":198},[192,4572,1154],{"class":219},[192,4574,4576],{"class":194,"line":4575},88,[192,4577,1265],{"class":219},[192,4579,4581],{"class":194,"line":4580},89,[192,4582,3468],{"class":219},[192,4584,4586],{"class":194,"line":4585},90,[192,4587,1420],{"class":219},[192,4589,4591],{"class":194,"line":4590},91,[192,4592,255],{"emptyLinePlaceholder":254},[192,4594,4596,4598,4600,4602,4604,4606,4608,4610,4612],{"class":194,"line":4595},92,[192,4597,1679],{"class":198},[192,4599,1682],{"class":219},[192,4601,213],{"class":212},[192,4603,1066],{"class":198},[192,4605,821],{"class":219},[192,4607,155],{"class":198},[192,4609,1693],{"class":219},[192,4611,223],{"class":212},[192,4613,1698],{"class":219},[192,4615,4617,4619,4621,4623,4625,4627,4629,4631,4633],{"class":194,"line":4616},93,[192,4618,1679],{"class":198},[192,4620,1682],{"class":219},[192,4622,213],{"class":212},[192,4624,1066],{"class":198},[192,4626,821],{"class":219},[192,4628,1071],{"class":198},[192,4630,1716],{"class":219},[192,4632,223],{"class":212},[192,4634,1721],{"class":219},[192,4636,4638,4640,4642,4644],{"class":194,"line":4637},94,[192,4639,1727],{"class":198},[192,4641,821],{"class":219},[192,4643,1732],{"class":198},[192,4645,4646],{"class":219},"::SharedPtr transmit_timer_;\n",[192,4648,4650,4652,4654,4656,4659,4661,4663,4665,4667,4669,4671,4673,4675,4677],{"class":194,"line":4649},95,[192,4651,1679],{"class":198},[192,4653,1485],{"class":219},[192,4655,1488],{"class":212},[192,4657,4658],{"class":219}," transmit_data_buffer ",[192,4660,896],{"class":212},[192,4662,890],{"class":198},[192,4664,821],{"class":219},[192,4666,771],{"class":198},[192,4668,213],{"class":219},[192,4670,3329],{"class":212},[192,4672,1079],{"class":219},[192,4674,3544],{"class":413},[192,4676,2438],{"class":219},[192,4678,4679],{"class":261}," \u002F\u002F 发送缓冲区\n",[192,4681,4683,4685,4687,4689,4691,4693,4695,4697,4699,4701,4703,4705,4707,4709],{"class":194,"line":4682},96,[192,4684,1679],{"class":198},[192,4686,1485],{"class":219},[192,4688,1488],{"class":212},[192,4690,3527],{"class":219},[192,4692,896],{"class":212},[192,4694,890],{"class":198},[192,4696,821],{"class":219},[192,4698,771],{"class":198},[192,4700,213],{"class":219},[192,4702,3329],{"class":212},[192,4704,1079],{"class":219},[192,4706,3544],{"class":413},[192,4708,2438],{"class":219},[192,4710,4711],{"class":261},"  \u002F\u002F 接收缓冲区\n",[192,4713,4715],{"class":194,"line":4714},97,[192,4716,1741],{"class":219},[192,4718,4720],{"class":194,"line":4719},98,[192,4721,255],{"emptyLinePlaceholder":254},[192,4723,4725,4727,4729,4731,4733,4735,4737,4739,4741,4743],{"class":194,"line":4724},99,[192,4726,1752],{"class":212},[192,4728,1755],{"class":198},[192,4730,848],{"class":219},[192,4732,1752],{"class":212},[192,4734,1763],{"class":1762},[192,4736,1766],{"class":219},[192,4738,1769],{"class":212},[192,4740,1772],{"class":212},[192,4742,1775],{"class":1762},[192,4744,854],{"class":219},[192,4746,4748],{"class":194,"line":4747},100,[192,4749,829],{"class":219},[192,4751,4753,4755,4757,4759],{"class":194,"line":4752},101,[192,4754,1727],{"class":198},[192,4756,821],{"class":219},[192,4758,1792],{"class":198},[192,4760,1795],{"class":219},[192,4762,4764],{"class":194,"line":4763},102,[192,4765,255],{"emptyLinePlaceholder":254},[192,4767,4769,4771,4773,4775,4777,4779,4781,4783,4785],{"class":194,"line":4768},103,[192,4770,1806],{"class":212},[192,4772,1809],{"class":219},[192,4774,896],{"class":212},[192,4776,890],{"class":198},[192,4778,821],{"class":219},[192,4780,1061],{"class":198},[192,4782,213],{"class":219},[192,4784,1406],{"class":198},[192,4786,1824],{"class":219},[192,4788,4790],{"class":194,"line":4789},104,[192,4791,255],{"emptyLinePlaceholder":254},[192,4793,4795,4797,4799,4801],{"class":194,"line":4794},105,[192,4796,1727],{"class":198},[192,4798,821],{"class":219},[192,4800,1839],{"class":198},[192,4802,1842],{"class":219},[192,4804,4806],{"class":194,"line":4805},106,[192,4807,255],{"emptyLinePlaceholder":254},[192,4809,4811,4813,4815,4817],{"class":194,"line":4810},107,[192,4812,1727],{"class":198},[192,4814,821],{"class":219},[192,4816,1857],{"class":198},[192,4818,1154],{"class":219},[192,4820,4822,4824,4826],{"class":194,"line":4821},108,[192,4823,1865],{"class":212},[192,4825,1868],{"class":413},[192,4827,902],{"class":219},[192,4829,4831],{"class":194,"line":4830},109,[192,4832,1876],{"class":219},[15,4834,4835],{},[598,4836],{"alt":188,"src":4837},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1787.webp",[15,4839,4840,4843],{},[598,4841],{"alt":188,"src":4842},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1788.webp",[598,4844],{"alt":188,"src":4845},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1789.webp",[55,4847,4849],{"id":4848},"precautions","Precautions",[539,4851,4852],{},[105,4853,4854,4855,4858,4859,4861],{},"Do not reference ",[70,4856,4857],{},"boost\u002Fasio.hpp",": Since the library's principle is based on the boost library, and it is the boost library that comes with ROS2, using the general version of ",[70,4860,4857],{}," will cause errors with many duplicate flag issues.",[4863,4864,4865],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":188,"searchDepth":229,"depth":229,"links":4867},[4868,4869],{"id":12,"depth":251,"text":13},{"id":28,"depth":251,"text":29},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver","1300-0100-0200","2023-12-30","wiki\u002F2023-12-30-ros2-tutorial","en-us:2023-12-30-ros2-tutorial","\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial","Ros2 Tutorial","md","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2_serial_driver",false,null,"en-US","en-us",{},{"title":5,"description":188},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2_serial_driver","RxedFxnSdcWRCG92phUcm7GJ5wE1GTdndc1zEeAP_3w",[4889,4895,4900,4905,4910,4915,4920,4925,4930,4935,4940,4945,4950,4955,4960,4965,4970,4975,4980,4985,4990,4991,4996,5001,5006,5011,5015,5020,5024,5029,5034,5039,5044,5049,5054,5059,5064,5069,5074,5079,5084,5089,5094,5099,5104,5109,5114,5119,5124,5129,5134,5139,5144,5149,5154,5159,5164,5169,5174,5179],{"path":4890,"stem":4891,"title":4892,"date":4872,"chapterOrder":4893,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0100-ros2-jie-shao","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0100-ROS2介绍","Introduction to ROS2","0100",0,{"path":4896,"stem":4897,"title":4898,"date":4872,"chapterOrder":4899,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0200-ru-men-cao-zuo","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0200-入门操作","Getting Started","0200",{"path":4901,"stem":4902,"title":4903,"date":4872,"chapterOrder":4904,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0300-gong-zuo-kong-jian-yu-gong-neng-bao","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0300-工作空间与功能包","Workspace and Function Packages","0300",{"path":4906,"stem":4907,"title":4908,"date":4872,"chapterOrder":4909,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0400-si-da-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0400-四大通信","Four Major Communications","0400",{"path":4911,"stem":4912,"title":4913,"date":4872,"chapterOrder":4914,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0500-ros2-qi-ta-tong-xin-ji-zhi","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0500-ROS2其他通信机制","ROS2 Other Communication Mechanisms","0500",{"path":4916,"stem":4917,"title":4918,"date":4872,"chapterOrder":4919,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0600-launch","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0600-Launch","Launch","0600",{"path":4921,"stem":4922,"title":4923,"date":4872,"chapterOrder":4924,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0700-hui-su-rosbag2","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0700-回溯rosbag2","Replaying rosbag2","0700",{"path":4926,"stem":4927,"title":4928,"date":4872,"chapterOrder":4929,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0800-zuo-biao-bian-huan-tf","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0800-坐标变换TF","Coordinate Transformation TF","0800",{"path":4931,"stem":4932,"title":4933,"date":4872,"chapterOrder":4934,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0900-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0900-可视化平台RVIZ2与URDF建模语言","Visualization Platform RVIZ2 and URDF Modeling Language","0900",{"path":4936,"stem":4937,"title":4938,"date":4872,"chapterOrder":4939,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1000-stage-ros2-fang-zhen-ping-tai","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1000-Stage_Ros2仿真平台","Stage_Ros2 Simulation Platform","1000",{"path":4941,"stem":4942,"title":4943,"date":4872,"chapterOrder":4944,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-gazeboclassic","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-GazeboClassic","Gezebo Classic","1100-0100",{"path":4946,"stem":4947,"title":4948,"date":4872,"chapterOrder":4949,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-ignitiongazebo","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-IgnitionGazebo","Ignition Gazebo（Gazebo Fortress）","1100-0200",{"path":4951,"stem":4952,"title":4953,"date":4872,"chapterOrder":4954,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-gazebosim","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-GazeboSim","Gz Sim（Gazebo Harmonic）","1100-0300",{"path":4956,"stem":4957,"title":4958,"date":4872,"chapterOrder":4959,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-igngz2gzsim","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-Igngz2gzsim","Migrate Ign Gazebo to Gz Sim","1100-0400",{"path":4961,"stem":4962,"title":4963,"date":4872,"chapterOrder":4964,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-gezebo-fang-zhen-ping-tai","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-Gezebo仿真平台","Gazebo simulation platform","1100",{"path":4966,"stem":4967,"title":4968,"date":4872,"chapterOrder":4969,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-humble-ban-ben","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-Humble版本","Humble Navigation Simulation","1200-0100",{"path":4971,"stem":4972,"title":4973,"date":4872,"chapterOrder":4974,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-jazzy-ban-ben","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-Jazzy版本","Jazzy Navigation Simulation","1200-0200",{"path":4976,"stem":4977,"title":4978,"date":4872,"chapterOrder":4979,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-humble2jazzy","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-Humble2Jazzy","Differences in Navigation between Humble and Jazzy","1200-0300",{"path":4981,"stem":4982,"title":4983,"date":4872,"chapterOrder":4984,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-机器人导航Navigation2(仿真篇)","Robot Navigation with Navigation2 (Simulation)","1200",{"path":4986,"stem":4987,"title":4988,"date":4872,"chapterOrder":4989,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-boost-aiso","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-Boost.Aiso","Boost.Asio库","1300-0100-0100",{"path":4870,"stem":4886,"title":5,"date":4872,"chapterOrder":4871,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},{"path":4992,"stem":4993,"title":4994,"date":4872,"chapterOrder":4995,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-chuan-kou-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-串口通信","UART serial communication","1300-0100",{"path":4997,"stem":4998,"title":4999,"date":4872,"chapterOrder":5000,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","SocketCAN","1300-0200-0100",{"path":5002,"stem":5003,"title":5004,"date":4872,"chapterOrder":5005,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2-socketcan","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2_socketcan","ROS2_SocketCAN","1300-0200-0200",{"path":5007,"stem":5008,"title":5009,"date":4872,"chapterOrder":5010,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-can-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-CAN通信","CAN communication","1300-0200",{"path":5012,"stem":5013,"title":4988,"date":4872,"chapterOrder":5014,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-boost-aiso","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-Boost.Aiso","1300-0300-0100",{"path":5016,"stem":5017,"title":5018,"date":4872,"chapterOrder":5019,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-tcp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-TCP通信","TCP communication","1300-0300",{"path":5021,"stem":5022,"title":4988,"date":4872,"chapterOrder":5023,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-boost-aiso","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-Boost.Aiso","1300-0400-0100",{"path":5025,"stem":5026,"title":5027,"date":4872,"chapterOrder":5028,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-udp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-UDP通信","UDP communication","1300-0400",{"path":5030,"stem":5031,"title":5032,"date":4872,"chapterOrder":5033,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-linux-ying-jian-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-Linux硬件通信","Linux hardware communication","1300",{"path":5035,"stem":5036,"title":5037,"date":4872,"chapterOrder":5038,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-ji-qi-ren-zu-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-机器人组成","Robot Composition","1400-0100",{"path":5040,"stem":5041,"title":5042,"date":4872,"chapterOrder":5043,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-yuan-cheng-kai-fa-ssh","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-远程开发SSH","Remote Development SSH","1400-0200-0100",{"path":5045,"stem":5046,"title":5047,"date":4872,"chapterOrder":5048,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-yuan-cheng-fang-wen-zhuo-mian","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-远程访问桌面","Remote Desktop Access","1400-0200-0200",{"path":5050,"stem":5051,"title":5052,"date":4872,"chapterOrder":5053,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-gong-kong-ji-zhi-yuan-cheng-kai-fa-huan-jing","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-工控机之远程开发环境","Remote Development Environment for Industrial PC","1400-0200",{"path":5055,"stem":5056,"title":5057,"date":4872,"chapterOrder":5058,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-gong-kong-ji-zhi-wai-jie-usb-she-bei","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-工控机之外接USB设备","External USB Devices for the Industrial PC","1400-0300",{"path":5060,"stem":5061,"title":5062,"date":4872,"chapterOrder":5063,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-fen-bu-shi-da-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-分布式搭建","Distributed setup","1400-0400",{"path":5065,"stem":5066,"title":5067,"date":4872,"chapterOrder":5068,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-you-hua-ri-zhi","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-优化日志","Optimize logs","1400-0500",{"path":5070,"stem":5071,"title":5072,"date":4872,"chapterOrder":5073,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-li-cheng-ji-odom","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-里程计Odom","odometry","1400-0600-0100",{"path":5075,"stem":5076,"title":5077,"date":4872,"chapterOrder":5078,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-guan-xing-ji-imu","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-惯性计IMU","Inertial Measurement Unit (IMU)","1400-0600-0200",{"path":5080,"stem":5081,"title":5082,"date":4872,"chapterOrder":5083,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-ji-guang-lei-da-lidar","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-激光雷达LiDAR","LiDAR","1400-0600-0300",{"path":5085,"stem":5086,"title":5087,"date":4872,"chapterOrder":5088,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-xiang-ji-camera","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-相机Camera","Camera","1400-0600-0400",{"path":5090,"stem":5091,"title":5092,"date":4872,"chapterOrder":5093,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-quan-qiu-ding-wei-gnss","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-全球定位GNSS","Global Navigation Satellite System (GNSS)","1400-0600-0500",{"path":5095,"stem":5096,"title":5097,"date":4872,"chapterOrder":5098,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-shou-bing-joy","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-手柄joy","The query \"手柄JOY\" is a bit ambiguous. To help you better, could you please provide more details? For example:","1400-0600-0600",{"path":5100,"stem":5101,"title":5102,"date":4872,"chapterOrder":5103,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-jian-pan-kong-zhi-jie-dian","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-键盘控制节点","Keyboard control node","1400-0600-0700",{"path":5105,"stem":5106,"title":5107,"date":4872,"chapterOrder":5108,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-ying-jian-ping-tai","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-硬件平台","Hardware platform","1400-0600",{"path":5110,"stem":5111,"title":5112,"date":4872,"chapterOrder":5113,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-zuo-biao-xi-yu-hua-ti-guan-xi","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-坐标系与话题关系","Coordinate System and Topic Relationship","1400-0700",{"path":5115,"stem":5116,"title":5117,"date":4872,"chapterOrder":5118,"chapterDepth":251,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-lun-shi-li-cheng-ji-biao-ding","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-轮式里程计标定","Wheel odometry calibration","1400-0800-0100-0100",{"path":5120,"stem":5121,"title":5122,"date":4872,"chapterOrder":5123,"chapterDepth":251,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-lun-shi-li-cheng-ji-yu-imu-rong-he","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-轮式里程计与IMU融合","Fusion of Wheel Odometry and IMU","1400-0800-0100-0200",{"path":5125,"stem":5126,"title":5127,"date":4872,"chapterOrder":5128,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-lun-shi-li-cheng-ji-biao-ding-yu-rong-he","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-轮式里程计标定与融合","Wheel odometry calibration and fusion","1400-0800-0100",{"path":5130,"stem":5131,"title":5132,"date":4872,"chapterOrder":5133,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-ji-guang-lei-da-gong-ju","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-激光雷达工具","Lidar Tool","1400-0800-0200",{"path":5135,"stem":5136,"title":5137,"date":4872,"chapterOrder":5138,"chapterDepth":229,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-xiang-ji-shi-yong-jin-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-相机使用进阶","Advanced Camera Usage","1400-0800-0300",{"path":5140,"stem":5141,"title":5142,"date":4872,"chapterOrder":5143,"chapterDepth":195,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-ying-jian-ping-tai-jin-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-硬件平台进阶","Advanced Hardware Platform","1400-0800",{"path":5145,"stem":5146,"title":5147,"date":4872,"chapterOrder":5148,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-ji-qi-ren-ying-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-机器人硬件","Robot hardware","1400",{"path":5150,"stem":5151,"title":5152,"date":4872,"chapterOrder":5153,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1500-ros2-control","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1500-ROS2_Control","ROS2_Control","1500",{"path":5155,"stem":5156,"title":5157,"date":4872,"chapterOrder":5158,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1600-moveit2-gong-ye-ji-qi-ren-ji-xie-bi","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1600-Moveit2工业机器人机械臂","MoveIt2 industrial robot arm","1600",{"path":5160,"stem":5161,"title":5162,"date":4872,"chapterOrder":5163,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1700-ji-qi-ren-dao-hang-navigation2-shi-ti-pian","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1700-机器人导航Navigation2(实体篇)","Robot Navigation with Navigation2 (Physical Robot)","1700",{"path":5165,"stem":5166,"title":5167,"date":4872,"chapterOrder":5168,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1800-microros","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1800-MicroROS","MicroROS","1800",{"path":5170,"stem":5171,"title":5172,"date":4872,"chapterOrder":5173,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1900-webots-fang-zhen-ping-tai","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1900-Webots仿真平台","Webots simulation platform","1900",{"path":5175,"stem":5176,"title":5177,"date":4872,"chapterOrder":5178,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":4879},"\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F2000-opencv","_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F2000-OpenCV","OpenCV","2000",{"path":4875,"stem":5180,"title":5181,"date":4872,"chapterOrder":4880,"chapterDepth":4894,"docKey":4874,"docRoot":4875,"docTitle":4876,"isWikiDoc":254,"isWikiIndex":254},"_i18n\u002Fen-us\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002Findex","ROS2 Robot Operating System Tutorial",{"variants":5183},[5184,5185,5188,5191,5194],{"path":4870,"localeSlug":4882,"i18nKey":4878},{"path":5186,"localeSlug":5187,"i18nKey":4878},"\u002Fzh-hant\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver","zh-hant",{"path":5189,"localeSlug":5190,"i18nKey":4878},"\u002Fzh-hk\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver","zh-hk",{"path":5192,"localeSlug":5193,"i18nKey":4878},"\u002Fzh-tw\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver","zh-tw",{"path":5195,"localeSlug":5196,"i18nKey":4878},"\u002Fzh-cn\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver","zh-cn",[4870,4885,5186,4885,5189,4885,5192,4885,5195,4885],1784646855363]