Gmapping从开始到放弃—写一个TF 广播
這是一個關于實現把機器人的位姿廣播到TF中,這是對ROS 有一定的熟悉之后教程
(1)cd catkin_ws/src 進入我們的ROS 的工作空間
(2)catkin_create_pkg my_tf tf roscpp rospy turtlesim 這一句是新建一個ROS 的包,也就是一個ROS的工程,并添加他的依賴項,主要依賴tf和C++以及你可以使用python開發
(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;//定義一個廣播,相當于發布話題時定義一個發布器broadcastertf::Transform transform;//定義存放轉換信息(平動,轉動)的變量transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) ); //設置坐標原點 2D位置并轉換為3D位置,添加了一個z系,但是設為0.0tf::Quaternion q; //聲明一個四元數q.setRPY(0, 0, msg->theta); //這里因為turtlesim在二維平面所以只有RPY的Yaw的信息,其他兩個都設置為0transform.setRotation(q); //設置旋轉也就是把RPY信息轉為四元數br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));//將變換廣播出去 發布到tf廣播中 StampedTransform四個參數我們可以知道 transform的setOrigin 和 setRotation就是設置小烏龜的位姿,Time時間戳也就是現在的時間, “world”我們需要將創建的link的父框架的名字傳輸過去,在這個例子中是world,最后,我們需要將創建的link的子框架的名字傳輸過去,在這里就是turtle本身}int main(int argc, char** argv){ros::init(argc, argv, "my_tf_broadcaster"); ////初始化ros,命名節點為my_tf_broadcasterif (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;};turtle_name = argv[1]; //烏龜的名字可以輸入ros::NodeHandle node; ////NodeHandle是與ROS系統交流的最主要的接入點,是一個句柄ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);////從master訂閱某烏龜的“/pose”話題,當消息到來時,即當烏龜位置改變時產生新的消息時,ROS將會調用poseCallback ros::spin();return 0;
};
總結: 假設你在機器人上應用,如果你知道機器人的位置x,y,z,與三個旋轉角roll,pitch,yaw就可以廣播一個tf了,如果在是平面移動機器人,則只需要知道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 編譯
編譯完成之后,會發現會生成一個二進制文件,這個文件就是生成的可執行文件
(8)在my_tf文件下新建一個文件命名為launch之后新建一個命名為
start_demo.launch,并把下面的這段代碼復制進去
<launch><!-- Turtlesim Node--><node pkg="turtlesim" type="turtlesim_node" name="sim"/><!-- 解釋一下,這個是啟動小烏龜的--><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"/>
<!-- 以上是對小烏龜的線速度和角速度的一個尺度的參數 --><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" />
<!-- 是程序中我們需要輸入的需要創建的link的子框架的名字傳輸過去--></launch>
(9)運行此程序
roslaunch learning_tf start_demo.launch
(10 )箭頭按鍵就可以移動小烏龜,我們可以監聽TF廣播
rosrun tf tf_echo /world /turtle1
還有一篇在博客園的TF總結:
http://www.cnblogs.com/li-yao7758258/p/7672521.html
總結
以上是生活随笔為你收集整理的Gmapping从开始到放弃—写一个TF 广播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PCL常见错误集锦
- 下一篇: Gmapping从开始到放弃—写一个TF