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