1软件:ros_qtc_plugin
Ubuntu14.04
2运行原理及代码来自http://wiki.ros.org/navigation/Tutorials/RobotSetup/TF
3编写代码:
在利用ros_qtc_plugin建立新的工作空间时,首先要注意运行 gedit ~/.bashrc 进行编辑将启动文件地址加在末尾我的是source /home/adminer/w_test/devel/setup.bash.
进入工作空间的src文件下,否则使用下面代码时失败。
运行 roscreate-pkg robot_setup_tf roscpp tf geometry_msgs
意思是创建robot_setup_tf文件,并添加tf roscpp geometry_msgs 依赖。roscreate-pkg使用方法地址http://wiki.ros.org/roscreate
(1)利用ros_qtc_plugin创建文件tf_broadcaster.cpp
编辑代码:
#include <ros/ros.h>//tf功能包提供tf:TransformBroadcaster,使得发布变换变得容易#include <tf/transform_broadcaster.h>int main(int argc, char** argv){ros::init(argc, argv, "robot_tf_publisher");/** NodeHandle is the main access point to communications with the ROS system.* The first NodeHandle constructed will fully initialize this node, and the last* NodeHandle destructed will close down the node.*/ros::NodeHandle n;ros::Rate r(100);//创建对象,用于发布从哦呢base_link到base_laser的变换tf::TransformBroadcaster broadcaster;//发送带有TransformBroadcaster变换所需要的四个变量while(n.ok()){broadcaster.sendTransform(//发送旋转矩阵,通过btQuaternion指定了两个坐标系的旋转关系,没有旋转,前三变量为零//随后是一个平移变量btVector3tf::StampedTransform(tf::Transform(tf::Quaternion(0, 0, 0, 1), tf::Vector3(0.1, 0.0, 0.2)),//给将要发布的变换指定时间戳ros::Time::now(),传送父节点base_link.子节点base_laserros::Time::now(),"base_link", "base_laser"));r.sleep();}}(2)利用ros_qtc_plugin创建文件tf_listener.cpp添加代码
#include <ros/ros.h>#include <geometry_msgs/PointStamped.h>#include <tf/transform_listener.h>void transformPoint(const tf::TransformListener& listener){/*we'll create a point in the base_laser frame that we'd like to transform*to the base_link frame*/geometry_msgs::PointStamped laser_point;laser_point.header.frame_id = "base_laser";//we'll just use the most recent transform available for our simple examplelaser_point.header.stamp = ros::Time();//just an arbitrary point in spacelaser_point.point.x = 1.0;laser_point.point.y = 0.2;laser_point.point.z = 0.0;try{geometry_msgs::PointStamped base_point;listener.transformPoint("base_link", laser_point, base_point);ROS_INFO("base_laser: (%.2f, %.2f. %.2f) -----> base_link: (%.2f, %.2f, %.2f) at time %.2f",laser_point.point.x, laser_point.point.y, laser_point.point.z,base_point.point.x, base_point.point.y, base_point.point.z, base_point.header.stamp.toSec());}catch(tf::TransformException& ex){ROS_ERROR("Received an exception trying to transform a point from /"base_laser/" to /"base_link/": %s", ex.what());}}int main(int argc, char** argv){ros::init(argc, argv, "robot_tf_listener");ros::NodeHandle n;tf::TransformListener listener(ros::Duration(10));//we'll transform a point once every secondros::Timer timer = n.createTimer(ros::Duration(1.0), boost::bind(&transformPoint, boost::ref(listener)));ros::spin();}4编译代码打开CMakeList.txt文件,末尾添加
rosbuild_add_executable(tf_broadcaster src/tf_broadcaster.cpp)rosbuild_add_executable(tf_listener src/tf_listener.cpp)保存文件 在终端下的robot_setup_tf功能包下运行rosmake,5运行代码
(1)终端运行:roscore
(2)第二个终端运行rosrun robot_setup_tf tf_broadcaster
(2)第三个终端运行(2)第二个终端运行rosrun robot_setup_tf tf_listener
成功后显示:
注意:qt下运行也可以
新闻热点
疑难解答