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