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