[{"data":1,"prerenderedAt":1808},["ShallowReactive",2],{"wiki-page-/wiki/2023-12-30-ros2-tutorial/ch7-hui-su-rosbag2":3,"wiki-doc-items-/wiki/2023-12-30-ros2-tutorial/ch7-hui-su-rosbag2":1665},{"id":4,"title":5,"body":6,"chapter":1651,"chapterSort":1652,"date":1653,"description":19,"docKey":1654,"docRoot":1655,"docTitle":1656,"extension":1657,"isWikiDoc":326,"isWikiIndex":1658,"layout":1659,"meta":1660,"navigation":326,"path":1661,"seo":1662,"stem":1663,"wikiDepth":76,"__hash__":1664},"content/wiki/2023-12-30-ros2-tutorial/ch7-回溯rosbag2.md","回溯rosbag2",{"type":7,"value":8,"toc":1644},"minimark",[9,13,21,24,27,30,33,36,41,44,47,52,57,60,63,116,119,124,131,134,139,142,150,155,158,163,166,169,172,175,178,181,186,189,192,195,198,203,208,211,216,219,222,227,232,235,240,245,248,251,254,258,263,268,402,406,1056,1061,1064,1069,1072,1077,1080,1085,1088,1093,1098,1103,1106,1111,1114,1119,1122,1125,1130,1133,1136,1139,1160,1165,1168,1173,1176,1179,1183,1611,1616,1621,1624,1629,1632,1637,1640],[10,11,12],"h3",{"id":12},"概述",[14,15,16],"p",{},[17,18],"img",{"alt":19,"src":20},"","https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1228.webp",[14,22,23],{},"方式1一边采集数据，一边生成地图信息。",[14,25,26],{},"方式2是将采集数据和生成地图信息分割开来了，方式2做到了解耦合，所以更灵活一些。用同一套数据，可能用不同的算法处理，总之，非常灵活。",[14,28,29],{},"留存的过程咱们也可以叫做序列化。（转化为磁盘文件）",[14,31,32],{},"留存一般叫录制（序列化）。",[14,34,35],{},"读取一般叫回放(反序列化)。",[14,37,38],{},[17,39],{"alt":19,"src":40},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1229.webp",[14,42,43],{},"留存时也可以将文件进行分卷，也就是每个文件最大能占多大的大小，如果超过该大小，就新建一个文件继续留存。（类似于压缩文件的分卷）",[14,45,46],{},"这样的话，存的数据太大，我们一次性打开太慢，就可以分段打开。",[14,48,49],{},[17,50],{"alt":19,"src":51},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1230.webp",[14,53,54],{},[17,55],{"alt":19,"src":56},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1231.webp",[14,58,59],{},"需要依赖于rosbag2_cpp或者rosbag2_py",[14,61,62],{},"然后还要依赖于geometry_msgs，这个是因为我们要序列化的数据是这个包下的速度指令。",[64,65,69],"pre",{"className":66,"code":67,"language":68,"meta":19,"style":19},"language-bash shiki shiki-themes github-light github-dark","ros2 pkg create cpp02_rosbag --build-type ament_cmake --dependencies rclcpp rosbag2_cpp geometry_msgs --node-name cpp01_writer\n","bash",[70,71,72],"code",{"__ignoreMap":19},[73,74,77,81,85,88,91,95,98,101,104,107,110,113],"span",{"class":75,"line":76},"line",1,[73,78,80],{"class":79},"sScJk","ros2",[73,82,84],{"class":83},"sZZnC"," pkg",[73,86,87],{"class":83}," create",[73,89,90],{"class":83}," cpp02_rosbag",[73,92,94],{"class":93},"sj4cs"," --build-type",[73,96,97],{"class":83}," ament_cmake",[73,99,100],{"class":93}," --dependencies",[73,102,103],{"class":83}," rclcpp",[73,105,106],{"class":83}," rosbag2_cpp",[73,108,109],{"class":83}," geometry_msgs",[73,111,112],{"class":93}," --node-name",[73,114,115],{"class":83}," cpp01_writer\n",[10,117,118],{"id":118},"rosbag2的命令工具",[14,120,121],{},[17,122],{"alt":19,"src":123},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1232.webp",[14,125,126,127],{},"一般ROSBAG2的使用有命令行工具和编码两种使用方式，",[128,129,130],"strong",{},"命令行工具功能比较齐全，够用。",[14,132,133],{},"查看帮助文档ros2 bag -h",[14,135,136],{},[17,137],{"alt":19,"src":138},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1233.webp",[14,140,141],{},"主要有6个指令。",[14,143,144,147],{},[17,145],{"alt":19,"src":146},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1234.webp",[17,148],{"alt":19,"src":149},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1235.webp",[14,151,152],{},[17,153],{"alt":19,"src":154},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1236.webp",[14,156,157],{},"可以看record的详细用法。",[14,159,160],{},[17,161],{"alt":19,"src":162},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1237.webp",[14,164,165],{},"record是用来将消息序列化的。(录制)",[14,167,168],{},"play是用来反序列化消息的。(回放)",[14,170,171],{},"info是用来输出bag文件的相关信息的。比如有多少条消息，录制起始时间和终止时间以及持续时间。",[14,173,174],{},"reindex是重建bag文件，可以修改bag源数据文件。",[14,176,177],{},"list是输出rosbag2中可用的插件(高阶应用)。",[14,179,180],{},"convert我们可以用这个给bag文件修改扩展名，也可以把多个bag文件合并成一个文件。",[14,182,183],{},[17,184],{"alt":19,"src":185},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1238.webp",[14,187,188],{},"打开小乌龟节点与键盘控制小乌龟节点。",[14,190,191],{},"我们用键盘控制小乌龟，然后把速度指令通过rosbag2给序列化。",[14,193,194],{},"然后我们关掉两个节点，再重启小乌龟节点，然后这次不通过键盘控制，而是通过play bag文件让小乌龟运动。",[14,196,197],{},"record指令后面要跟一个话题组成的列表，但是在咱们下面的操作中，只用到了一个话题。",[14,199,200],{},[17,201],{"alt":19,"src":202},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1239.webp",[14,204,205],{},[17,206],{"alt":19,"src":207},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1240.webp",[14,209,210],{},"然后再用output，把序列化后的文件写出到一个磁盘目录中去。",[14,212,213],{},[17,214],{"alt":19,"src":215},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1241.webp",[14,217,218],{},"cd进想保存bag的目录，然输入record指令，后面跟话题名称，然后-o +bag文件名，这里也可以不重新命名bag文件，这样会用默认的名字，默认的名称是年月日命名的。",[14,220,221],{},"这样就已经开始录制了。",[14,223,224],{},[17,225],{"alt":19,"src":226},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1242.webp",[14,228,229],{},[17,230],{"alt":19,"src":231},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1243.webp",[14,233,234],{},"按Ctrl + C进行结束，结束有个提示，说正在将消息写入bag，需要一段时间。",[14,236,237],{},[17,238],{"alt":19,"src":239},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1244.webp",[14,241,242],{},[17,243],{"alt":19,"src":244},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1245.webp",[14,246,247],{},"这个yaml文件是源数据文件。",[14,249,250],{},"db3是SQLite数据库，这个是移动端(比如手机)常用的数据库。",[14,252,253],{},"这个数据库就存储了录制的数据。",[10,255,257],{"id":256},"rosbag2-c案例分析及框架搭建","rosbag2 C++案例分析及框架搭建",[14,259,260],{},[17,261],{"alt":19,"src":262},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1246.webp",[14,264,265],{},[17,266],{"alt":19,"src":267},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1247.webp",[64,269,273],{"className":270,"code":271,"language":272,"meta":19,"style":19},"language-cmake shiki shiki-themes github-light github-dark","add_executable(demo01_writer src/demo01_writer.cpp)\nament_target_dependencies(\n  demo01_writer\n  \"rclcpp\"\n  \"rosbag2_cpp\"\n  \"geometry_msgs\"\n)\n\nadd_executable(demo02_reader src/demo02_reader.cpp)\nament_target_dependencies(\n  demo02_reader\n  \"rclcpp\"\n  \"rosbag2_cpp\"\n  \"geometry_msgs\"\n)\n\ninstall(TARGETS \n  demo01_writer\n  demo02_reader\n  DESTINATION lib/${PROJECT_NAME})\n","cmake",[70,274,275,285,291,297,303,309,315,321,328,336,341,347,352,357,362,367,372,381,386,391],{"__ignoreMap":19},[73,276,277,281],{"class":75,"line":76},[73,278,280],{"class":279},"szBVR","add_executable",[73,282,284],{"class":283},"sVt8B","(demo01_writer src/demo01_writer.cpp)\n",[73,286,288],{"class":75,"line":287},2,[73,289,290],{"class":283},"ament_target_dependencies(\n",[73,292,294],{"class":75,"line":293},3,[73,295,296],{"class":283},"  demo01_writer\n",[73,298,300],{"class":75,"line":299},4,[73,301,302],{"class":83},"  \"rclcpp\"\n",[73,304,306],{"class":75,"line":305},5,[73,307,308],{"class":83},"  \"rosbag2_cpp\"\n",[73,310,312],{"class":75,"line":311},6,[73,313,314],{"class":83},"  \"geometry_msgs\"\n",[73,316,318],{"class":75,"line":317},7,[73,319,320],{"class":283},")\n",[73,322,324],{"class":75,"line":323},8,[73,325,327],{"emptyLinePlaceholder":326},true,"\n",[73,329,331,333],{"class":75,"line":330},9,[73,332,280],{"class":279},[73,334,335],{"class":283},"(demo02_reader src/demo02_reader.cpp)\n",[73,337,339],{"class":75,"line":338},10,[73,340,290],{"class":283},[73,342,344],{"class":75,"line":343},11,[73,345,346],{"class":283},"  demo02_reader\n",[73,348,350],{"class":75,"line":349},12,[73,351,302],{"class":83},[73,353,355],{"class":75,"line":354},13,[73,356,308],{"class":83},[73,358,360],{"class":75,"line":359},14,[73,361,314],{"class":83},[73,363,365],{"class":75,"line":364},15,[73,366,320],{"class":283},[73,368,370],{"class":75,"line":369},16,[73,371,327],{"emptyLinePlaceholder":326},[73,373,375,378],{"class":75,"line":374},17,[73,376,377],{"class":279},"install",[73,379,380],{"class":283},"(TARGETS \n",[73,382,384],{"class":75,"line":383},18,[73,385,296],{"class":283},[73,387,389],{"class":75,"line":388},19,[73,390,346],{"class":283},[73,392,394,397,400],{"class":75,"line":393},20,[73,395,396],{"class":283},"  DESTINATION lib/",[73,398,399],{"class":279},"${PROJECT_NAME}",[73,401,320],{"class":283},[10,403,405],{"id":404},"rosbag2-c-录制数据","rosbag2 C++ 录制数据",[64,407,411],{"className":408,"code":409,"language":410,"meta":19,"style":19},"language-cpp shiki shiki-themes github-light github-dark","/* \n  需求：录制 turtle_teleop_key 节点发布的速度指令。\n  步骤：\n    1.包含头文件；\n    2.初始化 ROS 客户端；\n    3.定义节点类；\n      3-1.创建写出对象指针；\n      3-2.设置写出的目标文件；\n      3-3.写出消息。\n    4.调用 spin 函数，并传入对象指针；\n    5.释放资源。\n\n */\n// 1.包含头文件；\n#include \"rclcpp/rclcpp.hpp\"\n#include \"rosbag2_cpp/writer.hpp\"\n#include \"geometry_msgs/msg/twist.hpp\"\n\nusing std::placeholders::_1;\n\n// 3.定义节点类；\nclass SimpleBagRecorder : public rclcpp::Node\n{\npublic:\n  SimpleBagRecorder()\n  : Node(\"simple_bag_recorder\")\n  {\n    // 3-1.创建写出对象指针；\n    writer_ = std::make_unique\u003Crosbag2_cpp::Writer>();\n    // 3-2.设置写出的目标文件；(目录为ws目录)\n    writer_->open(\"src/cpp02_rosbag/my_bag\");\n    subscription_ = create_subscription\u003Cgeometry_msgs::msg::Twist>(\n      \"/turtle1/cmd_vel\", 10, std::bind(&SimpleBagRecorder::topic_callback, this, _1));\n  }\n\nprivate:\n  void topic_callback(std::shared_ptr\u003Crclcpp::SerializedMessage> msg) const\n  {\n    rclcpp::Time time_stamp = this->now();\n    // 3-3.写出消息。\n    RCLCPP_INFO(this->get_logger(),\"数据写出... ...\");\n    writer_->write(msg, \"/turtle1/cmd_vel\", \"geometry_msgs/msg/Twist\", time_stamp);\n  }\n\n  rclcpp::Subscription\u003Cgeometry_msgs::msg::Twist>::SharedPtr subscription_;\n  std::unique_ptr\u003Crosbag2_cpp::Writer> writer_;\n};\n\nint main(int argc, char * argv[])\n{\n  // 2.初始化 ROS 客户端；\n  rclcpp::init(argc, argv);\n  // 4.调用 spin 函数，并传入对象指针；\n  rclcpp::spin(std::make_shared\u003CSimpleBagRecorder>());\n  // 5.释放资源。\n  rclcpp::shutdown();\n  return 0;\n}\n","cpp",[70,412,413,419,424,429,434,439,444,449,454,459,464,469,473,478,483,491,498,505,509,526,530,536,558,564,570,579,596,602,608,638,644,661,690,729,735,740,746,786,791,814,820,843,865,870,875,901,923,929,934,964,969,975,988,994,1020,1026,1038,1050],{"__ignoreMap":19},[73,414,415],{"class":75,"line":76},[73,416,418],{"class":417},"sJ8bj","/* \n",[73,420,421],{"class":75,"line":287},[73,422,423],{"class":417},"  需求：录制 turtle_teleop_key 节点发布的速度指令。\n",[73,425,426],{"class":75,"line":293},[73,427,428],{"class":417},"  步骤：\n",[73,430,431],{"class":75,"line":299},[73,432,433],{"class":417},"    1.包含头文件；\n",[73,435,436],{"class":75,"line":305},[73,437,438],{"class":417},"    2.初始化 ROS 客户端；\n",[73,440,441],{"class":75,"line":311},[73,442,443],{"class":417},"    3.定义节点类；\n",[73,445,446],{"class":75,"line":317},[73,447,448],{"class":417},"      3-1.创建写出对象指针；\n",[73,450,451],{"class":75,"line":323},[73,452,453],{"class":417},"      3-2.设置写出的目标文件；\n",[73,455,456],{"class":75,"line":330},[73,457,458],{"class":417},"      3-3.写出消息。\n",[73,460,461],{"class":75,"line":338},[73,462,463],{"class":417},"    4.调用 spin 函数，并传入对象指针；\n",[73,465,466],{"class":75,"line":343},[73,467,468],{"class":417},"    5.释放资源。\n",[73,470,471],{"class":75,"line":349},[73,472,327],{"emptyLinePlaceholder":326},[73,474,475],{"class":75,"line":354},[73,476,477],{"class":417}," */\n",[73,479,480],{"class":75,"line":359},[73,481,482],{"class":417},"// 1.包含头文件；\n",[73,484,485,488],{"class":75,"line":364},[73,486,487],{"class":279},"#include",[73,489,490],{"class":83}," \"rclcpp/rclcpp.hpp\"\n",[73,492,493,495],{"class":75,"line":369},[73,494,487],{"class":279},[73,496,497],{"class":83}," \"rosbag2_cpp/writer.hpp\"\n",[73,499,500,502],{"class":75,"line":374},[73,501,487],{"class":279},[73,503,504],{"class":83}," \"geometry_msgs/msg/twist.hpp\"\n",[73,506,507],{"class":75,"line":383},[73,508,327],{"emptyLinePlaceholder":326},[73,510,511,514,517,520,523],{"class":75,"line":388},[73,512,513],{"class":279},"using",[73,515,516],{"class":79}," std",[73,518,519],{"class":283},"::",[73,521,522],{"class":79},"placeholders",[73,524,525],{"class":283},"::_1;\n",[73,527,528],{"class":75,"line":393},[73,529,327],{"emptyLinePlaceholder":326},[73,531,533],{"class":75,"line":532},21,[73,534,535],{"class":417},"// 3.定义节点类；\n",[73,537,539,542,545,548,551,553,555],{"class":75,"line":538},22,[73,540,541],{"class":279},"class",[73,543,544],{"class":79}," SimpleBagRecorder",[73,546,547],{"class":283}," : ",[73,549,550],{"class":279},"public",[73,552,103],{"class":79},[73,554,519],{"class":283},[73,556,557],{"class":79},"Node\n",[73,559,561],{"class":75,"line":560},23,[73,562,563],{"class":283},"{\n",[73,565,567],{"class":75,"line":566},24,[73,568,569],{"class":279},"public:\n",[73,571,573,576],{"class":75,"line":572},25,[73,574,575],{"class":79},"  SimpleBagRecorder",[73,577,578],{"class":283},"()\n",[73,580,582,585,588,591,594],{"class":75,"line":581},26,[73,583,584],{"class":283},"  : ",[73,586,587],{"class":79},"Node",[73,589,590],{"class":283},"(",[73,592,593],{"class":83},"\"simple_bag_recorder\"",[73,595,320],{"class":283},[73,597,599],{"class":75,"line":598},27,[73,600,601],{"class":283},"  {\n",[73,603,605],{"class":75,"line":604},28,[73,606,607],{"class":417},"    // 3-1.创建写出对象指针；\n",[73,609,611,614,617,619,621,624,627,630,632,635],{"class":75,"line":610},29,[73,612,613],{"class":283},"    writer_ ",[73,615,616],{"class":279},"=",[73,618,516],{"class":79},[73,620,519],{"class":283},[73,622,623],{"class":79},"make_unique",[73,625,626],{"class":283},"\u003C",[73,628,629],{"class":79},"rosbag2_cpp",[73,631,519],{"class":283},[73,633,634],{"class":79},"Writer",[73,636,637],{"class":283},">();\n",[73,639,641],{"class":75,"line":640},30,[73,642,643],{"class":417},"    // 3-2.设置写出的目标文件；(目录为ws目录)\n",[73,645,647,650,653,655,658],{"class":75,"line":646},31,[73,648,649],{"class":283},"    writer_->",[73,651,652],{"class":79},"open",[73,654,590],{"class":283},[73,656,657],{"class":83},"\"src/cpp02_rosbag/my_bag\"",[73,659,660],{"class":283},");\n",[73,662,664,667,669,672,674,677,679,682,684,687],{"class":75,"line":663},32,[73,665,666],{"class":283},"    subscription_ ",[73,668,616],{"class":279},[73,670,671],{"class":79}," create_subscription",[73,673,626],{"class":283},[73,675,676],{"class":79},"geometry_msgs",[73,678,519],{"class":283},[73,680,681],{"class":79},"msg",[73,683,519],{"class":283},[73,685,686],{"class":79},"Twist",[73,688,689],{"class":283},">(\n",[73,691,693,696,699,702,704,707,709,712,714,717,720,723,726],{"class":75,"line":692},33,[73,694,695],{"class":83},"      \"/turtle1/cmd_vel\"",[73,697,698],{"class":283},", ",[73,700,701],{"class":93},"10",[73,703,698],{"class":283},[73,705,706],{"class":79},"std",[73,708,519],{"class":283},[73,710,711],{"class":79},"bind",[73,713,590],{"class":283},[73,715,716],{"class":279},"&",[73,718,719],{"class":79},"SimpleBagRecorder",[73,721,722],{"class":283},"::topic_callback, ",[73,724,725],{"class":93},"this",[73,727,728],{"class":283},", _1));\n",[73,730,732],{"class":75,"line":731},34,[73,733,734],{"class":283},"  }\n",[73,736,738],{"class":75,"line":737},35,[73,739,327],{"emptyLinePlaceholder":326},[73,741,743],{"class":75,"line":742},36,[73,744,745],{"class":279},"private:\n",[73,747,749,752,755,757,759,761,764,766,769,771,774,777,780,783],{"class":75,"line":748},37,[73,750,751],{"class":279},"  void",[73,753,754],{"class":79}," topic_callback",[73,756,590],{"class":283},[73,758,706],{"class":79},[73,760,519],{"class":283},[73,762,763],{"class":79},"shared_ptr",[73,765,626],{"class":283},[73,767,768],{"class":79},"rclcpp",[73,770,519],{"class":283},[73,772,773],{"class":79},"SerializedMessage",[73,775,776],{"class":283},"> ",[73,778,681],{"class":779},"s4XuR",[73,781,782],{"class":283},") ",[73,784,785],{"class":279},"const\n",[73,787,789],{"class":75,"line":788},38,[73,790,601],{"class":283},[73,792,794,797,800,802,805,808,811],{"class":75,"line":793},39,[73,795,796],{"class":79},"    rclcpp",[73,798,799],{"class":283},"::Time time_stamp ",[73,801,616],{"class":279},[73,803,804],{"class":93}," this",[73,806,807],{"class":283},"->",[73,809,810],{"class":79},"now",[73,812,813],{"class":283},"();\n",[73,815,817],{"class":75,"line":816},40,[73,818,819],{"class":417},"    // 3-3.写出消息。\n",[73,821,823,826,828,830,832,835,838,841],{"class":75,"line":822},41,[73,824,825],{"class":79},"    RCLCPP_INFO",[73,827,590],{"class":283},[73,829,725],{"class":93},[73,831,807],{"class":283},[73,833,834],{"class":79},"get_logger",[73,836,837],{"class":283},"(),",[73,839,840],{"class":83},"\"数据写出... ...\"",[73,842,660],{"class":283},[73,844,846,848,851,854,857,859,862],{"class":75,"line":845},42,[73,847,649],{"class":283},[73,849,850],{"class":79},"write",[73,852,853],{"class":283},"(msg, ",[73,855,856],{"class":83},"\"/turtle1/cmd_vel\"",[73,858,698],{"class":283},[73,860,861],{"class":83},"\"geometry_msgs/msg/Twist\"",[73,863,864],{"class":283},", time_stamp);\n",[73,866,868],{"class":75,"line":867},43,[73,869,734],{"class":283},[73,871,873],{"class":75,"line":872},44,[73,874,327],{"emptyLinePlaceholder":326},[73,876,878,881,883,886,888,890,892,894,896,898],{"class":75,"line":877},45,[73,879,880],{"class":79},"  rclcpp",[73,882,519],{"class":283},[73,884,885],{"class":79},"Subscription",[73,887,626],{"class":283},[73,889,676],{"class":79},[73,891,519],{"class":283},[73,893,681],{"class":79},[73,895,519],{"class":283},[73,897,686],{"class":79},[73,899,900],{"class":283},">::SharedPtr subscription_;\n",[73,902,904,907,910,912,914,917,920],{"class":75,"line":903},46,[73,905,906],{"class":79},"  std",[73,908,909],{"class":283},"::unique_ptr",[73,911,626],{"class":279},[73,913,629],{"class":79},[73,915,916],{"class":283},"::Writer",[73,918,919],{"class":279},">",[73,921,922],{"class":283}," writer_;\n",[73,924,926],{"class":75,"line":925},47,[73,927,928],{"class":283},"};\n",[73,930,932],{"class":75,"line":931},48,[73,933,327],{"emptyLinePlaceholder":326},[73,935,937,940,943,945,947,950,952,955,958,961],{"class":75,"line":936},49,[73,938,939],{"class":279},"int",[73,941,942],{"class":79}," main",[73,944,590],{"class":283},[73,946,939],{"class":279},[73,948,949],{"class":779}," argc",[73,951,698],{"class":283},[73,953,954],{"class":279},"char",[73,956,957],{"class":279}," *",[73,959,960],{"class":779}," argv",[73,962,963],{"class":283},"[])\n",[73,965,967],{"class":75,"line":966},50,[73,968,563],{"class":283},[73,970,972],{"class":75,"line":971},51,[73,973,974],{"class":417},"  // 2.初始化 ROS 客户端；\n",[73,976,978,980,982,985],{"class":75,"line":977},52,[73,979,880],{"class":79},[73,981,519],{"class":283},[73,983,984],{"class":79},"init",[73,986,987],{"class":283},"(argc, argv);\n",[73,989,991],{"class":75,"line":990},53,[73,992,993],{"class":417},"  // 4.调用 spin 函数，并传入对象指针；\n",[73,995,997,999,1001,1004,1006,1008,1010,1013,1015,1017],{"class":75,"line":996},54,[73,998,880],{"class":79},[73,1000,519],{"class":283},[73,1002,1003],{"class":79},"spin",[73,1005,590],{"class":283},[73,1007,706],{"class":79},[73,1009,519],{"class":283},[73,1011,1012],{"class":79},"make_shared",[73,1014,626],{"class":283},[73,1016,719],{"class":79},[73,1018,1019],{"class":283},">());\n",[73,1021,1023],{"class":75,"line":1022},55,[73,1024,1025],{"class":417},"  // 5.释放资源。\n",[73,1027,1029,1031,1033,1036],{"class":75,"line":1028},56,[73,1030,880],{"class":79},[73,1032,519],{"class":283},[73,1034,1035],{"class":79},"shutdown",[73,1037,813],{"class":283},[73,1039,1041,1044,1047],{"class":75,"line":1040},57,[73,1042,1043],{"class":279},"  return",[73,1045,1046],{"class":93}," 0",[73,1048,1049],{"class":283},";\n",[73,1051,1053],{"class":75,"line":1052},58,[73,1054,1055],{"class":283},"}\n",[14,1057,1058],{},[17,1059],{"alt":19,"src":1060},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1248.webp",[14,1062,1063],{},"这是一个相对目录，目录位置是工作空间目录。",[14,1065,1066],{},[17,1067],{"alt":19,"src":1068},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1249.webp",[14,1070,1071],{},"写数据之前，要先创建一个订阅方，订阅方要建立一个回调函数。",[14,1073,1074],{},[17,1075],{"alt":19,"src":1076},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1250.webp",[14,1078,1079],{},"回调函数入口参数，消息类型用write函数的入口参数。",[14,1081,1082],{},[17,1083],{"alt":19,"src":1084},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1251.webp",[14,1086,1087],{},"这里要用斜杠代替冒号，因为入口是string类型。",[14,1089,1090],{},[17,1091],{"alt":19,"src":1092},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1252.webp",[14,1094,1095],{},[17,1096],{"alt":19,"src":1097},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1253.webp",[14,1099,1100],{},[17,1101],{"alt":19,"src":1102},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1254.webp",[14,1104,1105],{},"创建乌龟节点。",[14,1107,1108],{},[17,1109],{"alt":19,"src":1110},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1255.webp",[14,1112,1113],{},"启动writer节点",[14,1115,1116],{},[17,1117],{"alt":19,"src":1118},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1256.webp",[14,1120,1121],{},"运行小乌龟",[14,1123,1124],{},"运行一会儿后，关掉所有节点。",[14,1126,1127],{},[17,1128],{"alt":19,"src":1129},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1257.webp",[14,1131,1132],{},"成功生成了文件",[14,1134,1135],{},"验证录制文件是否成功。",[14,1137,1138],{},"在验证前，先创建一个乌龟节点，不用创建控制节点。",[64,1140,1142],{"className":408,"code":1141,"language":410,"meta":19,"style":19},"ros2 bag play src/cpp02_rosbag/my_bag\n",[70,1143,1144],{"__ignoreMap":19},[73,1145,1146,1149,1152,1155,1157],{"class":75,"line":76},[73,1147,1148],{"class":283},"ros2 bag play src",[73,1150,1151],{"class":279},"/",[73,1153,1154],{"class":283},"cpp02_rosbag",[73,1156,1151],{"class":279},[73,1158,1159],{"class":283},"my_bag\n",[14,1161,1162],{},[17,1163],{"alt":19,"src":1164},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1258.webp",[14,1166,1167],{},"可以看到乌龟正常走了。回放成功！",[14,1169,1170],{},[17,1171],{"alt":19,"src":1172},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1259.webp",[14,1174,1175],{},"如果已经生成了一遍my_bag，再想生成新的会显示不能覆盖。",[14,1177,1178],{},"解决方案，可以把my_bag设置为动态的，加个时间戳或者直接按功能命名。",[10,1180,1182],{"id":1181},"rosbag2-c-读取数据","rosbag2 C++ 读取数据",[64,1184,1186],{"className":408,"code":1185,"language":410,"meta":19,"style":19},"/* \n  需求：读取 bag 文件数据。\n  步骤：\n    1.包含头文件；\n    2.初始化 ROS 客户端；\n    3.定义节点类；\n      3-1.创建读取对象指针；\n      3-2.设置读取的目标文件；\n      3-3.读消息；\n      3-4.关闭文件。\n    4.调用 spin 函数，并传入对象指针；\n    5.释放资源。\n\n */\n // 1.包含头文件；\n #include \"rclcpp/rclcpp.hpp\"\n #include \"rosbag2_cpp/reader.hpp\"\n #include \"geometry_msgs/msg/twist.hpp\"\n // 3.定义节点类；\nclass SimpleBagPlayer: public rclcpp::Node {\npublic:\n    SimpleBagPlayer():Node(\"simple_bag_player\"){\n        // 3-1.创建读取对象指针；\n        reader_ = std::make_unique\u003Crosbag2_cpp::Reader>();\n        // 3-2.设置读取的目标文件；\n        reader_->open(\"src/cpp02_rosbag/my_bag\");\n        // 3-3.读消息；\n        while (reader_->has_next())\n        {\n            auto twist = reader_->read_next\u003Cgeometry_msgs::msg::Twist>();\n            RCLCPP_INFO(this->get_logger(),\"线速度:%.2f, 角速度: %.2f\",twist.linear.x, twist.angular.z);\n        }\n        // 3-4.关闭文件。\n        reader_->close();\n    }\nprivate:\n    std::unique_ptr\u003Crosbag2_cpp::Reader> reader_;\n\n};\n\nint main(int argc, char const *argv[]){\n    // 2.初始化 ROS 客户端；\n    rclcpp::init(argc,argv);\n    // 4.调用 spin 函数，并传入对象指针；\n    rclcpp::spin(std::make_shared\u003CSimpleBagPlayer>());\n    // 5.释放资源。\n    rclcpp::shutdown();\n    return 0;\n}\n",[70,1187,1188,1192,1197,1201,1205,1209,1213,1218,1223,1228,1233,1237,1241,1245,1249,1254,1261,1268,1274,1279,1300,1304,1322,1327,1351,1356,1369,1374,1388,1393,1421,1453,1458,1463,1472,1477,1481,1500,1504,1508,1512,1539,1544,1555,1560,1583,1588,1598,1607],{"__ignoreMap":19},[73,1189,1190],{"class":75,"line":76},[73,1191,418],{"class":417},[73,1193,1194],{"class":75,"line":287},[73,1195,1196],{"class":417},"  需求：读取 bag 文件数据。\n",[73,1198,1199],{"class":75,"line":293},[73,1200,428],{"class":417},[73,1202,1203],{"class":75,"line":299},[73,1204,433],{"class":417},[73,1206,1207],{"class":75,"line":305},[73,1208,438],{"class":417},[73,1210,1211],{"class":75,"line":311},[73,1212,443],{"class":417},[73,1214,1215],{"class":75,"line":317},[73,1216,1217],{"class":417},"      3-1.创建读取对象指针；\n",[73,1219,1220],{"class":75,"line":323},[73,1221,1222],{"class":417},"      3-2.设置读取的目标文件；\n",[73,1224,1225],{"class":75,"line":330},[73,1226,1227],{"class":417},"      3-3.读消息；\n",[73,1229,1230],{"class":75,"line":338},[73,1231,1232],{"class":417},"      3-4.关闭文件。\n",[73,1234,1235],{"class":75,"line":343},[73,1236,463],{"class":417},[73,1238,1239],{"class":75,"line":349},[73,1240,468],{"class":417},[73,1242,1243],{"class":75,"line":354},[73,1244,327],{"emptyLinePlaceholder":326},[73,1246,1247],{"class":75,"line":359},[73,1248,477],{"class":417},[73,1250,1251],{"class":75,"line":364},[73,1252,1253],{"class":417}," // 1.包含头文件；\n",[73,1255,1256,1259],{"class":75,"line":369},[73,1257,1258],{"class":279}," #include",[73,1260,490],{"class":83},[73,1262,1263,1265],{"class":75,"line":374},[73,1264,1258],{"class":279},[73,1266,1267],{"class":83}," \"rosbag2_cpp/reader.hpp\"\n",[73,1269,1270,1272],{"class":75,"line":383},[73,1271,1258],{"class":279},[73,1273,504],{"class":83},[73,1275,1276],{"class":75,"line":388},[73,1277,1278],{"class":417}," // 3.定义节点类；\n",[73,1280,1281,1283,1286,1289,1291,1293,1295,1297],{"class":75,"line":393},[73,1282,541],{"class":279},[73,1284,1285],{"class":79}," SimpleBagPlayer",[73,1287,1288],{"class":283},": ",[73,1290,550],{"class":279},[73,1292,103],{"class":79},[73,1294,519],{"class":283},[73,1296,587],{"class":79},[73,1298,1299],{"class":283}," {\n",[73,1301,1302],{"class":75,"line":532},[73,1303,569],{"class":279},[73,1305,1306,1309,1312,1314,1316,1319],{"class":75,"line":538},[73,1307,1308],{"class":79},"    SimpleBagPlayer",[73,1310,1311],{"class":283},"():",[73,1313,587],{"class":79},[73,1315,590],{"class":283},[73,1317,1318],{"class":83},"\"simple_bag_player\"",[73,1320,1321],{"class":283},"){\n",[73,1323,1324],{"class":75,"line":560},[73,1325,1326],{"class":417},"        // 3-1.创建读取对象指针；\n",[73,1328,1329,1332,1334,1336,1338,1340,1342,1344,1346,1349],{"class":75,"line":566},[73,1330,1331],{"class":283},"        reader_ ",[73,1333,616],{"class":279},[73,1335,516],{"class":79},[73,1337,519],{"class":283},[73,1339,623],{"class":79},[73,1341,626],{"class":283},[73,1343,629],{"class":79},[73,1345,519],{"class":283},[73,1347,1348],{"class":79},"Reader",[73,1350,637],{"class":283},[73,1352,1353],{"class":75,"line":572},[73,1354,1355],{"class":417},"        // 3-2.设置读取的目标文件；\n",[73,1357,1358,1361,1363,1365,1367],{"class":75,"line":581},[73,1359,1360],{"class":283},"        reader_->",[73,1362,652],{"class":79},[73,1364,590],{"class":283},[73,1366,657],{"class":83},[73,1368,660],{"class":283},[73,1370,1371],{"class":75,"line":598},[73,1372,1373],{"class":417},"        // 3-3.读消息；\n",[73,1375,1376,1379,1382,1385],{"class":75,"line":604},[73,1377,1378],{"class":279},"        while",[73,1380,1381],{"class":283}," (reader_->",[73,1383,1384],{"class":79},"has_next",[73,1386,1387],{"class":283},"())\n",[73,1389,1390],{"class":75,"line":610},[73,1391,1392],{"class":283},"        {\n",[73,1394,1395,1398,1401,1403,1406,1408,1410,1412,1414,1417,1419],{"class":75,"line":640},[73,1396,1397],{"class":279},"            auto",[73,1399,1400],{"class":283}," twist ",[73,1402,616],{"class":279},[73,1404,1405],{"class":283}," reader_->read_next",[73,1407,626],{"class":279},[73,1409,676],{"class":79},[73,1411,519],{"class":283},[73,1413,681],{"class":79},[73,1415,1416],{"class":283},"::Twist",[73,1418,919],{"class":279},[73,1420,813],{"class":283},[73,1422,1423,1426,1428,1430,1432,1434,1436,1439,1442,1445,1447,1450],{"class":75,"line":646},[73,1424,1425],{"class":79},"            RCLCPP_INFO",[73,1427,590],{"class":283},[73,1429,725],{"class":93},[73,1431,807],{"class":283},[73,1433,834],{"class":79},[73,1435,837],{"class":283},[73,1437,1438],{"class":83},"\"线速度:",[73,1440,1441],{"class":93},"%.2f",[73,1443,1444],{"class":83},", 角速度: ",[73,1446,1441],{"class":93},[73,1448,1449],{"class":83},"\"",[73,1451,1452],{"class":283},",twist.linear.x, twist.angular.z);\n",[73,1454,1455],{"class":75,"line":663},[73,1456,1457],{"class":283},"        }\n",[73,1459,1460],{"class":75,"line":692},[73,1461,1462],{"class":417},"        // 3-4.关闭文件。\n",[73,1464,1465,1467,1470],{"class":75,"line":731},[73,1466,1360],{"class":283},[73,1468,1469],{"class":79},"close",[73,1471,813],{"class":283},[73,1473,1474],{"class":75,"line":737},[73,1475,1476],{"class":283},"    }\n",[73,1478,1479],{"class":75,"line":742},[73,1480,745],{"class":279},[73,1482,1483,1486,1488,1490,1492,1495,1497],{"class":75,"line":748},[73,1484,1485],{"class":79},"    std",[73,1487,909],{"class":283},[73,1489,626],{"class":279},[73,1491,629],{"class":79},[73,1493,1494],{"class":283},"::Reader",[73,1496,919],{"class":279},[73,1498,1499],{"class":283}," reader_;\n",[73,1501,1502],{"class":75,"line":788},[73,1503,327],{"emptyLinePlaceholder":326},[73,1505,1506],{"class":75,"line":793},[73,1507,928],{"class":283},[73,1509,1510],{"class":75,"line":816},[73,1511,327],{"emptyLinePlaceholder":326},[73,1513,1514,1516,1518,1520,1522,1524,1526,1528,1531,1533,1536],{"class":75,"line":822},[73,1515,939],{"class":279},[73,1517,942],{"class":79},[73,1519,590],{"class":283},[73,1521,939],{"class":279},[73,1523,949],{"class":779},[73,1525,698],{"class":283},[73,1527,954],{"class":279},[73,1529,1530],{"class":279}," const",[73,1532,957],{"class":279},[73,1534,1535],{"class":779},"argv",[73,1537,1538],{"class":283},"[]){\n",[73,1540,1541],{"class":75,"line":845},[73,1542,1543],{"class":417},"    // 2.初始化 ROS 客户端；\n",[73,1545,1546,1548,1550,1552],{"class":75,"line":867},[73,1547,796],{"class":79},[73,1549,519],{"class":283},[73,1551,984],{"class":79},[73,1553,1554],{"class":283},"(argc,argv);\n",[73,1556,1557],{"class":75,"line":872},[73,1558,1559],{"class":417},"    // 4.调用 spin 函数，并传入对象指针；\n",[73,1561,1562,1564,1566,1568,1570,1572,1574,1576,1578,1581],{"class":75,"line":877},[73,1563,796],{"class":79},[73,1565,519],{"class":283},[73,1567,1003],{"class":79},[73,1569,590],{"class":283},[73,1571,706],{"class":79},[73,1573,519],{"class":283},[73,1575,1012],{"class":79},[73,1577,626],{"class":283},[73,1579,1580],{"class":79},"SimpleBagPlayer",[73,1582,1019],{"class":283},[73,1584,1585],{"class":75,"line":903},[73,1586,1587],{"class":417},"    // 5.释放资源。\n",[73,1589,1590,1592,1594,1596],{"class":75,"line":925},[73,1591,796],{"class":79},[73,1593,519],{"class":283},[73,1595,1035],{"class":79},[73,1597,813],{"class":283},[73,1599,1600,1603,1605],{"class":75,"line":931},[73,1601,1602],{"class":279},"    return",[73,1604,1046],{"class":93},[73,1606,1049],{"class":283},[73,1608,1609],{"class":75,"line":936},[73,1610,1055],{"class":283},[14,1612,1613],{},[17,1614],{"alt":19,"src":1615},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1260.webp",[14,1617,1618],{},[17,1619],{"alt":19,"src":1620},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1261.webp",[14,1622,1623],{},"编译",[14,1625,1626],{},[17,1627],{"alt":19,"src":1628},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1262.webp",[14,1630,1631],{},"这显示能读出来几条信息。能读出来8条。",[14,1633,1634],{},[17,1635],{"alt":19,"src":1636},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1263.webp",[14,1638,1639],{},"正好8条",[1641,1642,1643],"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 .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .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 pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":19,"searchDepth":287,"depth":287,"links":1645},[1646,1647,1648,1649,1650],{"id":12,"depth":293,"text":12},{"id":118,"depth":293,"text":118},{"id":256,"depth":293,"text":257},{"id":404,"depth":293,"text":405},{"id":1181,"depth":293,"text":1182},"7",7000000,"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/ch7-hui-su-rosbag2",{"title":5,"description":19},"wiki/2023-12-30-ros2-tutorial/ch7-回溯rosbag2","DAAmCGThUZK4JtXQOgmTJki9NZ_MSAifnNO22P-am30",[1666,1672,1677,1683,1689,1695,1701,1707,1713,1719,1725,1731,1737,1743,1749,1755,1761,1767,1773,1779,1785,1791,1792,1798,1804],{"path":1667,"stem":1668,"title":1669,"date":1653,"chapter":1670,"chapterSort":1671,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch1-ros2-jie-shao","wiki/2023-12-30-ros2-tutorial/ch1-ROS2介绍","ROS2介绍","1",1000000,{"path":1673,"stem":1674,"title":1675,"date":1653,"chapter":701,"chapterSort":1676,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai","wiki/2023-12-30-ros2-tutorial/ch10-Stage_Ros2仿真平台","Stage_Ros2仿真平台",10000000,{"path":1678,"stem":1679,"title":1680,"date":1653,"chapter":1681,"chapterSort":1682,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch11-1-gazeboclassic","wiki/2023-12-30-ros2-tutorial/ch11-1-GazeboClassic","Gezebo Classic","11.1",11010000,{"path":1684,"stem":1685,"title":1686,"date":1653,"chapter":1687,"chapterSort":1688,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/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":1690,"stem":1691,"title":1692,"date":1653,"chapter":1693,"chapterSort":1694,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/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":1696,"stem":1697,"title":1698,"date":1653,"chapter":1699,"chapterSort":1700,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/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":1702,"stem":1703,"title":1704,"date":1653,"chapter":1705,"chapterSort":1706,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch11-gezebo-fang-zhen-ping-tai","wiki/2023-12-30-ros2-tutorial/ch11-Gezebo仿真平台","Gezebo仿真平台","11",11000000,{"path":1708,"stem":1709,"title":1710,"date":1653,"chapter":1711,"chapterSort":1712,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/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":1714,"stem":1715,"title":1716,"date":1653,"chapter":1717,"chapterSort":1718,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch13-ros2serial","wiki/2023-12-30-ros2-tutorial/ch13-ROS2Serial","ROS2 Serial","13",13000000,{"path":1720,"stem":1721,"title":1722,"date":1653,"chapter":1723,"chapterSort":1724,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch14-ji-qi-ren-ying-jian","wiki/2023-12-30-ros2-tutorial/ch14-机器人硬件","机器人硬件","14",14000000,{"path":1726,"stem":1727,"title":1728,"date":1653,"chapter":1729,"chapterSort":1730,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch15-ros2-control","wiki/2023-12-30-ros2-tutorial/ch15-ROS2_Control","ROS2_Control","15",15000000,{"path":1732,"stem":1733,"title":1734,"date":1653,"chapter":1735,"chapterSort":1736,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/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":1738,"stem":1739,"title":1740,"date":1653,"chapter":1741,"chapterSort":1742,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/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":1744,"stem":1745,"title":1746,"date":1653,"chapter":1747,"chapterSort":1748,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch18-microros","wiki/2023-12-30-ros2-tutorial/ch18-MicroROS","MicroROS","18",18000000,{"path":1750,"stem":1751,"title":1752,"date":1653,"chapter":1753,"chapterSort":1754,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch19-webots-fang-zhen-ping-tai","wiki/2023-12-30-ros2-tutorial/ch19-Webots仿真平台","Webots仿真平台","19",19000000,{"path":1756,"stem":1757,"title":1758,"date":1653,"chapter":1759,"chapterSort":1760,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch2-ru-men-cao-zuo","wiki/2023-12-30-ros2-tutorial/ch2-入门操作","入门操作","2",2000000,{"path":1762,"stem":1763,"title":1764,"date":1653,"chapter":1765,"chapterSort":1766,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch20-opencv","wiki/2023-12-30-ros2-tutorial/ch20-OpenCV","OpenCV","20",20000000,{"path":1768,"stem":1769,"title":1770,"date":1653,"chapter":1771,"chapterSort":1772,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch3-gong-zuo-kong-jian-yu-gong-neng-bao","wiki/2023-12-30-ros2-tutorial/ch3-工作空间与功能包","工作空间与功能包","3",3000000,{"path":1774,"stem":1775,"title":1776,"date":1653,"chapter":1777,"chapterSort":1778,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch4-si-da-tong-xin","wiki/2023-12-30-ros2-tutorial/ch4-四大通信","四大通信","4",4000000,{"path":1780,"stem":1781,"title":1782,"date":1653,"chapter":1783,"chapterSort":1784,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/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":1786,"stem":1787,"title":1788,"date":1653,"chapter":1789,"chapterSort":1790,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch6-launch","wiki/2023-12-30-ros2-tutorial/ch6-Launch","Launch","6",6000000,{"path":1661,"stem":1663,"title":5,"date":1653,"chapter":1651,"chapterSort":1652,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},{"path":1793,"stem":1794,"title":1795,"date":1653,"chapter":1796,"chapterSort":1797,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/wiki/2023-12-30-ros2-tutorial/ch8-zuo-biao-bian-huan-tf","wiki/2023-12-30-ros2-tutorial/ch8-坐标变换TF","坐标变换TF","8",8000000,{"path":1799,"stem":1800,"title":1801,"date":1653,"chapter":1802,"chapterSort":1803,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":1658},"/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":1655,"stem":1805,"title":1806,"date":1653,"chapter":1659,"chapterSort":1807,"docKey":1654,"docRoot":1655,"docTitle":1656,"isWikiDoc":326,"isWikiIndex":326},"wiki/2023-12-30-ros2-tutorial/index","ROS2机器人操作系统教程",0,1778560328774]