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