{"id":105,"date":"2021-11-21T11:21:43","date_gmt":"2021-11-21T11:21:43","guid":{"rendered":"http:\/\/47.103.123.166\/?p=105"},"modified":"2021-11-21T13:12:36","modified_gmt":"2021-11-21T13:12:36","slug":"%e8%bf%90%e5%8a%a8%e8%a7%84%e5%88%92%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b02-ros%e5%8c%85_tf2","status":"publish","type":"post","link":"http:\/\/47.103.123.166\/?p=105","title":{"rendered":"\u8fd0\u52a8\u89c4\u5212\u5b66\u4e60\u7b14\u8bb05\u2014\u2014ROS\u5305_tf2"},"content":{"rendered":"<p>\u5728\u8fd9\u91cc\u5206\u4eab\u4e86\u8fd0\u52a8\u89c4\u5212\u65b9\u9762\u7684\u4e00\u4e9b\u57fa\u672c\u7684\u7b97\u6cd5\u539f\u7406\u548c\u4f2a\u4ee3\u7801\u5b9e\u73b0\uff0c\u5176\u4e2d\u5185\u5bb9\u53ef\u80fd\u5b58\u5728\u4e0d\u5b8c\u5584\u548c\u9519\u8bef\u4e4b\u5904\uff0c\u5982\u6709\u8bfb\u8005\u53d1\u73b0\uff0c\u6b22\u8fce\u6279\u8bc4\u6307\u6b63\u3002<\/p>\n<h2>1\u3001\u5750\u6807\u7cfb<\/h2>\n<ol>\n<li>\u4e00\u4e2a\u673a\u5668\u4eba\u62e5\u6709\u591a\u4e2a\u5750\u6807\u7cfb\uff0c\u8fd9\u4e9b\u5750\u6807\u7cfb\u5728tf2\u4e2d\u6784\u6210\u5750\u6807\u6811\uff0ctf2\u901a\u8fc7\u5750\u6807\u6811\u7ef4\u62a4\u591a\u4e2a\u5750\u6807\u7cfb\u4e4b\u95f4\u7684\u5750\u6807\u53d8\u6362\u3002<\/li>\n<li>ROS\u5750\u6807\u7cfb\u4e3a\u53f3\u624b\u5750\u6807\u7cfb\uff0c\u524dX\u3001\u5de6Y\u3001\u4e0aZ\u3002<\/li>\n<li>\u4e24\u5750\u6807\u7cfb\u4e4b\u95f4\u5173\u7cfb\u75286\u81ea\u7531\u5ea6\u76f8\u5bf9\u4f4d\u59ff\u8868\u793a\uff0ctf2\u4e2d\u7531<strong>tf2::Vector3<\/strong>\u548c<strong>tf2::Quaternion<\/strong>\u8868\u793a\u3002<\/li>\n<li>\u67e5\u770b\u5750\u6807\u6811\n<pre><code class=\"language-shell\"># \u65b9\u6cd5\u4e00\uff1aview_frames\u5de5\u5177\nrosrun tf view_frames \n# \u65b9\u6cd5\u4e8c\uff1arqt\nrosrun rqt_tf_tree rqt_tf_tree<\/code><\/pre>\n<\/li>\n<li>\u67e5\u770b\u5750\u6807\u8f6c\u6362\u5173\u7cfb\n<pre><code class=\"language-shell\"># \u53d8\u6362\u5173\u7cfb\nrosrun tf tf_echo \/world \/turtle1<\/code><\/pre>\n<\/li>\n<li>\u67e5\u770b\u5750\u6807\u8f6c\u6362\u65f6\u95f4\u5ef6\u8fdf\n<pre><code class=\"language-shell\"># \u65f6\u95f4\u5ef6\u8fdf\nrosrun tf tf_monitor \/world \/turtle1<\/code><\/pre>\n<\/li>\n<\/ol>\n<h2>2\u3001\u5750\u6807\u53d8\u6362<\/h2>\n<h3>2.1\u3001\u5750\u6807\u53d8\u6362<\/h3>\n<ol>\n<li>\u5750\u6807\u53d8\u6362\u5e93\uff1atf2_ros\uff0c<a href=\"http:\/\/docs.ros.org\/en\/jade\/api\/tf2_ros\/html\/c++\/namespacetf2__ros.html\"><a href=\"http:\/\/docs.ros.org\/en\/jade\/api\/tf2_ros\/html\/c++\/namespacetf2__ros.html\">http:\/\/docs.ros.org\/en\/jade\/api\/tf2_ros\/html\/c++\/namespacetf2__ros.html<\/a><\/a>\u3002<\/li>\n<li>\u5750\u6807\u8f6c\u6362\u6d88\u606f\u7c7b\u578b\uff1ageometry_msgs\/TransformStamped\uff0c\u5305\u62ec\u7236\u5750\u6807\u7cfb\u3001\u5b50\u5750\u6807\u7cfb\u3001\u8f6c\u6362\u5173\u7cfb\n<pre><code class=\"language-powershell\">std_msgs\/Header header\nuint32 seq\ntime stamp\nstring frame_id\nstring child_frame_id\ngeometry_msgs\/Transform transform\ngeometry_msgs\/Vector3 translation\nfloat64 x\nfloat64 y\nfloat64 z\ngeometry_msgs\/Quaternion rotation\nfloat64 x\nfloat64 y\nfloat64 z\nfloat64 w<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>2.2\u3001\u5e7f\u64ad\u5750\u6807\u53d8\u6362<\/h3>\n<ol>\n<li>\u5e7f\u64ad\u5750\u6807\u8f6c\u6362\u7684\u4e24\u79cd\u60c5\u51b5\n<pre><code class=\"language-cpp\">\u5e7f\u64ad\u9759\u6001\u5750\u6807\u8f6c\u6362\n\u5e7f\u64ad\u5668\uff1atf2_ros::StaticTransformBroadcaster\n\u5e7f\u64ad\u65b9\u6cd5\uff1atf2_ros::StaticTransformBroadcaster::sendTransform(geometry_msgs\/TransformStamped)\n\u5e7f\u64ad\u52a8\u6001\u5750\u6807\u8f6c\u6362\n\u5e7f\u64ad\u5668\uff1atf2_ros::TransformBroadcaster\n\u5e7f\u64ad\u65b9\u6cd5\uff1atf2_ros::TransformBroadcaster::sendTransform(geometry_msgs\/TransformStamped)\n\u5e7f\u64ad\u65b9\u6cd5\uff1a\n1\u3001\u53d1\u9001\u4e00\u4e2aTransformStamped\u6d88\u606f\nvoid sendTransform (const geometry_msgs::TransformStamped &amp;transform)\n2\u3001\u53d1\u9001\u4e00\u7ec4TransformStamped\u6d88\u606f\nvoid sendTransform (const std::vector&lt; geometry_msgs::TransformStamped &gt; &amp;transforms)<\/code><\/pre>\n<\/li>\n<li>\n<p>\u5e7f\u64ad\u9759\u6001\u5750\u6807\u8f6c\u6362<\/p>\n<pre><code class=\"language-cpp\">static tf2_ros::StaticTransformBroadcaster static_br;\ngeometry_msgs::TransformStamped static_tfStamped;\n\nstatic_tfStamped.header.stamp = ros::Time::now();\nstatic_tfStamped.header.frame_id = \"parent_frame\";\nstatic_tfStamped.child_frame_id = \"child_frame\";\nstatic_tfStamped.transform.translation.x = atof(x);\nstatic_tfStamped.transform.translation.y = atof(y);\nstatic_tfStamped.transform.translation.z = atof(z);\n\ntf2::Quaternion quat;\nquat.setRPY(atof(wx), atof(wy), atof(wz);\nstatic_tfStamped.transform.rotation.x = quat.x();\nstatic_tfStamped.transform.rotation.y = quat.y();\nstatic_tfStamped.transform.rotation.z = quat.z();\nstatic_tfStamped.transform.rotation.w = quat.w();\n\nstatic_br.sendTransform(static_tfStamped);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u5e7f\u64ad\u52a8\u6001\u5750\u6807\u8f6c\u6362<\/p>\n<pre><code class=\"language-cpp\">void callback(const xxx&amp; msg)\n{\n static tf2_ros::TransformBroadcaster br;\n geometry_msgs::TransformStamped tfStamped;\n\n tfStamped.header.stamp = ros::Time::now();\n tfStamped.header.frame_id = \"parent_frame\";\n tfStamped.child_frame_id = \"child_frame\";\n tfStamped.transform.translation.x = msg-&gt;x;\n tfStamped.transform.translation.y = msg-&gt;y;\n tfStamped.transform.translation.z = msg-&gt;z;\n\n tf2::Quaternion q;\n q.setRPY(msg-&gt;wx, msg-&gt;wy, msg-&gt;wz);\n tfStamped.transform.rotation.x = q.x();\n tfStamped.transform.rotation.y = q.y();\n tfStamped.transform.rotation.z = q.z();\n tfStamped.transform.rotation.w = q.w();\n\n br.sendTransform(tfStamped);\n}<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>2.3\u3001\u76d1\u542c\u5750\u6807\u8f6c\u6362<\/h3>\n<ol>\n<li>\n<p>\u76d1\u542c\u5750\u6807\u8f6c\u6362<\/p>\n<pre><code class=\"language-cpp\">\u76d1\u542c\u5750\u6807\u8f6c\u6362\n\u76d1\u542c\u5668\uff1atf2_ros::TransformListener\n\u76d1\u542c\u7f13\u5b58\u8bbe\u7f6e\n\u7f13\u5b58\u5668\uff1atf2_ros::Buffer \u9ed8\u8ba410s\u7f13\u5b58\n\u76d1\u542c\u65b9\u6cd5\ngeometry_msgs::TransformStamped     lookupTransform (const std::string &amp;target_frame, const std::string &amp;source_frame, const ros::Time &amp;time, const ros::Duration timeout) const<\/code><\/pre>\n<pre><code class=\"language-cpp\">#include &lt;tf2_ros\/transform_listener.h&gt;\n\ntf2_ros::Buffer tfBuffer;\ntf2_ros::TransformListener tfListener(tfBuffer);\n\ntry\n{\n    transformStamped = tfBuffer.lookupTransform(\"turtle2\", \"turtle1\",ros::Time(0));\n}\ncatch (tf2::TransformException &amp;ex) \n{\n    ROS_WARN(\"%s\",ex.what());\n    ros::Duration(1.0).sleep();\n    continue;\n}<\/code><\/pre>\n<\/li>\n<\/ol>\n<h2>3\u3001\u95ee\u9898<\/h2>\n<h3>\/usr\/bin\/env: \u201cpython\u201d: \u6ca1\u6709\u90a3\u4e2a\u6587\u4ef6\u6216\u76ee\u5f55<\/h3>\n<ol>\n<li>\u80cc\u666f\n<pre><code class=\"language-bash\">ubuntu20.04\nroslaunch turtle_tf turtle_tf_demo.launch<\/code><\/pre>\n<\/li>\n<li>\u89e3\u51b3\n<pre><code class=\"language-bash\">sudo update-alternatives --install \/usr\/bin\/python python \/usr\/bin\/python3 1000<\/code><\/pre>\n<h3>TypeError: cannot use a string pattern on a bytes-like object<\/h3>\n<p><a href=\"https:\/\/blog.csdn.net\/xiaowang_tongxue\/article\/details\/108298544\"><a href=\"https:\/\/blog.csdn.net\/xiaowang_tongxue\/article\/details\/108298544\">https:\/\/blog.csdn.net\/xiaowang_tongxue\/article\/details\/108298544<\/a><\/a><\/p>\n<\/li>\n<li>\u95ee\u9898\n<pre><code class=\"language-bash\">Listening to \/tf for 5.0 seconds\nDone Listening\nb'dot - graphviz version 2.43.0 (0)\\n'\nTraceback (most recent call last):\nFile \"\/opt\/ros\/noetic\/lib\/tf\/view_frames\", line 119, in &lt;module&gt;\ngenerate(dot_graph)\nFile \"\/opt\/ros\/noetic\/lib\/tf\/view_frames\", line 89, in generate\nm = r.search(vstr)\nTypeError: cannot use a string pattern on a bytes-like object<\/code><\/pre>\n<\/li>\n<li>\u89e3\u51b3\n<pre><code class=\"language-bash\">sudo gedit \/opt\/ros\/noetic\/lib\/tf\/view_frames<\/code><\/pre>\n<pre><code class=\"language-python\">88       print(vstr)\n      vstr=str(vstr)  \/\/\u52a0\u5165\u8fd9\u4e2a...\n89       m = r.search(vstr)<\/code><\/pre>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u5728\u8fd9\u91cc\u5206\u4eab\u4e86\u8fd0\u52a8\u89c4\u5212\u65b9\u9762\u7684\u4e00\u4e9b\u57fa\u672c\u7684\u7b97\u6cd5\u539f\u7406\u548c\u4f2a\u4ee3\u7801\u5b9e\u73b0\uff0c\u5176\u4e2d\u5185\u5bb9\u53ef\u80fd\u5b58\u5728\u4e0d\u5b8c\u5584\u548c\u9519\u8bef\u4e4b\u5904\uff0c\u5982\u6709\u8bfb\u8005\u53d1\u73b0\uff0c\u6b22\u8fce\u6279\u8bc4\u6307\u6b63\u3002 1\u3001\u5750\u6807\u7cfb \u4e00\u4e2a\u673a\u5668\u4eba\u62e5\u6709\u591a\u4e2a\u5750\u6807\u7cfb\uff0c\u8fd9\u4e9b\u5750\u6807\u7cfb\u5728tf2\u4e2d\u6784\u6210\u5750\u6807\u6811\uff0ctf2\u901a\u8fc7\u5750\u6807\u6811\u7ef4\u62a4\u591a\u4e2a\u5750\u6807\u7cfb\u4e4b\u95f4\u7684\u5750\u6807\u53d8\u6362\u3002 ROS\u5750\u6807\u7cfb\u4e3a\u53f3\u624b\u5750\u6807\u7cfb\uff0c\u524dX\u3001\u5de6Y\u3001\u4e0aZ\u3002 \u4e24\u5750\u6807\u7cfb\u4e4b\u95f4\u5173\u7cfb\u75286\u81ea\u7531\u5ea6\u76f8\u5bf9\u4f4d\u59ff\u8868\u793a\uff0ctf2\u4e2d\u7531tf2::Vector3\u548ctf2::Quaternion\u8868\u793a\u3002 \u67e5\u770b\u5750\u6807\u6811 # \u65b9\u6cd5\u4e00\uff1aview_frames\u5de5\u5177 rosrun tf view_frames # \u65b9\u6cd5\u4e8c\uff1arqt rosrun rqt_tf_tree rqt_tf_tree \u67e5\u770b\u5750\u6807\u8f6c\u6362\u5173\u7cfb # \u53d8\u6362\u5173\u7cfb rosrun tf tf_echo \/world \/turtle1 \u67e5\u770b\u5750\u6807\u8f6c\u6362\u65f6\u95f4\u5ef6\u8fdf # \u65f6\u95f4\u5ef6\u8fdf rosrun tf tf_monitor \/world \/turtle1 2\u3001\u5750\u6807\u53d8\u6362 2.1\u3001\u5750\u6807\u53d8\u6362 \u5750\u6807\u53d8\u6362\u5e93\uff1atf2_ros\uff0chttp:\/\/docs.ros.org\/en\/jade\/api\/tf2_ros\/html\/c++\/namespacetf2__ros.html\u3002 \u5750\u6807\u8f6c\u6362\u6d88\u606f\u7c7b\u578b\uff1ageometry_msgs\/TransformStamped\uff0c\u5305\u62ec\u7236\u5750\u6807\u7cfb\u3001\u5b50\u5750\u6807\u7cfb\u3001\u8f6c\u6362\u5173\u7cfb std_msgs\/Header header uint32 seq time stamp string frame_id string child_frame_id geometry_msgs\/Transform transform geometry_msgs\/Vector3 translation float64 x float64 y float64 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2,4],"tags":[],"_links":{"self":[{"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/posts\/105"}],"collection":[{"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/47.103.123.166\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=105"}],"version-history":[{"count":6,"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/posts\/105\/revisions"}],"predecessor-version":[{"id":196,"href":"http:\/\/47.103.123.166\/index.php?rest_route=\/wp\/v2\/posts\/105\/revisions\/196"}],"wp:attachment":[{"href":"http:\/\/47.103.123.166\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/47.103.123.166\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=105"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/47.103.123.166\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}