Gmapping从开始到放弃—写一个TF 广播
這是一個關(guān)于實(shí)現(xiàn)把機(jī)器人的位姿廣播到TF中,這是對ROS 有一定的熟悉之后教程
(1)cd catkin_ws/src 進(jìn)入我們的ROS 的工作空間
(2)catkin_create_pkg my_tf tf roscpp rospy turtlesim 這一句是新建一個ROS 的包,也就是一個ROS的工程,并添加他的依賴項(xiàng),主要依賴tf和C++以及你可以使用python開發(fā)
(3) cd %YOUR_CATKIN_WORKSPACE_HOME%/
(4)catkin_make 編譯一次
(5)source ./devel/setup.bash
然后在my_tf的src文件下新建一個文件,可以自由命名 但是后面也是要用的,這里就命名是turtle_tf_broadcaster.cpp
添加以下程序
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>std::string turtle_name;void poseCallback(const turtlesim::PoseConstPtr& msg){static tf::TransformBroadcaster br;//定義一個廣播,相當(dāng)于發(fā)布話題時定義一個發(fā)布器broadcastertf::Transform transform;//定義存放轉(zhuǎn)換信息(平動,轉(zhuǎn)動)的變量transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) ); //設(shè)置坐標(biāo)原點(diǎn) 2D位置并轉(zhuǎn)換為3D位置,添加了一個z系,但是設(shè)為0.0tf::Quaternion q; //聲明一個四元數(shù)q.setRPY(0, 0, msg->theta); //這里因?yàn)閠urtlesim在二維平面所以只有RPY的Yaw的信息,其他兩個都設(shè)置為0transform.setRotation(q); //設(shè)置旋轉(zhuǎn)也就是把RPY信息轉(zhuǎn)為四元數(shù)br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));//將變換廣播出去 發(fā)布到tf廣播中 StampedTransform四個參數(shù)我們可以知道 transform的setOrigin 和 setRotation就是設(shè)置小烏龜?shù)奈蛔?#xff0c;Time時間戳也就是現(xiàn)在的時間, “world”我們需要將創(chuàng)建的link的父框架的名字傳輸過去,在這個例子中是world,最后,我們需要將創(chuàng)建的link的子框架的名字傳輸過去,在這里就是turtle本身}int main(int argc, char** argv){ros::init(argc, argv, "my_tf_broadcaster"); ////初始化ros,命名節(jié)點(diǎn)為my_tf_broadcasterif (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;};turtle_name = argv[1]; //烏龜?shù)拿挚梢暂斎?span id="ze8trgl8bvbq" class="hljs-symbol">ros::NodeHandle node; ////NodeHandle是與ROS系統(tǒng)交流的最主要的接入點(diǎn),是一個句柄ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);////從master訂閱某烏龜?shù)摹?pose”話題,當(dāng)消息到來時,即當(dāng)烏龜位置改變時產(chǎn)生新的消息時,ROS將會調(diào)用poseCallback ros::spin();return 0;
};
總結(jié): 假設(shè)你在機(jī)器人上應(yīng)用,如果你知道機(jī)器人的位置x,y,z,與三個旋轉(zhuǎn)角roll,pitch,yaw就可以廣播一個tf了,如果在是平面移動機(jī)器人,則只需要知道x,y與yaw即可
(6)在CMakeLists.txt添加如下的兩行
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})
(7)catkin_make 編譯
編譯完成之后,會發(fā)現(xiàn)會生成一個二進(jìn)制文件,這個文件就是生成的可執(zhí)行文件
(8)在my_tf文件下新建一個文件命名為launch之后新建一個命名為
start_demo.launch,并把下面的這段代碼復(fù)制進(jìn)去
<launch><!-- Turtlesim Node--><node pkg="turtlesim" type="turtlesim_node" name="sim"/><!-- 解釋一下,這個是啟動小烏龜?shù)?-><node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/><!-- 這是啟動移動小烏龜需要控制的鍵盤--><!-- Axes --><param name="scale_linear" value="2" type="double"/><param name="scale_angular" value="2" type="double"/>
<!-- 以上是對小烏龜?shù)木€速度和角速度的一個尺度的參數(shù) --><node pkg="my_tf" type="turtle_tf_broadcaster"args="/turtle1" name="turtle1_tf_broadcaster" /><node pkg="my_tf" type="turtle_tf_broadcaster"args="/turtle2" name="turtle2_tf_broadcaster" />
<!-- 是程序中我們需要輸入的需要創(chuàng)建的link的子框架的名字傳輸過去--></launch>
(9)運(yùn)行此程序
roslaunch learning_tf start_demo.launch
(10 )箭頭按鍵就可以移動小烏龜,我們可以監(jiān)聽TF廣播
rosrun tf tf_echo /world /turtle1
還有一篇在博客園的TF總結(jié):
http://www.cnblogs.com/li-yao7758258/p/7672521.html
總結(jié)
以上是生活随笔為你收集整理的Gmapping从开始到放弃—写一个TF 广播的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PCL常见错误集锦
- 下一篇: Gmapping从开始到放弃—写一个TF