odom到base_link的tf变换
目录
前言
一、使用tf2_ros转换节点
二、编写C++文件并在launch文件中调用
1.新建ROS工作空间
2.tf变换C++代码
3.在launch中添加node标签启动节点
4.通过rqt_tf_tree命令查看ROS中所有发布的TF转换关系的树状结构
前言
在ROS中,通常有一个转换(Transform)节点,用于将来自不同传感器的数据进行协调。对于机器人里程计信息来说,通常需要一个转换节点来将机器人的里程计信息从机器人底盘的局部坐标系(base_link)转换到全局坐标系(odom).
一、使用tf2_ros转换节点
-
首先,确保你已经在Gazebo中加载了你的机器人模型,并已经启动了里程计节点和机器人控制节点。
-
在终端中输入以下命令,启动一个tf2_ros转换节点:
rosrun tf2_ros static_transform_publisher 0 0 0 0 0 0 odom base_link -
这里的static_transfrom_publisher是ROS提供的tf2_ros库中的一个节点,用于将一个静态的转换发布到ROS中。0 0 0是xyz轴的平移值,0 0 0是四元数的旋转值,odom是全局坐标系的名称,base_link是机器人底盘局部坐标系的名称。
-
现在,你应该能够在ROS中订阅odom主题,获取经过转换后的里程计信息,它已经对齐到了机器人底盘的局部坐标系。
注:这种方法虽然简单,但每次启动都要执行这个命令略显麻烦,想一劳永逸可参考方法二。
二、编写C++文件并在launch文件中调用
1.新建ROS工作空间
mkdir -p catkin_ws/src
cd catkin_ws
catkin_make
cd src
catkin_create_pkg odomTobaselink roscpp rospy std_msgs nav_msgs geometry_msgs
2.tf变换C++代码
在odomobaselink功能包里再新建一个src文件夹,下述代码的位置放在odomTobaselink/src下,以下是一个简单的C++代码片段,我将其命名为odomTobaselink.cpp,用于发布tf变换:
#include
#include
#include int main(int argc, char** argv)
{ros::init(argc, argv, "odom_to_base_link_broadcaster");ros::NodeHandle node;// 设置机器人的初始位置和姿态geometry_msgs::TransformStamped odom_to_base_link;odom_to_base_link.header.frame_id = "odom";odom_to_base_link.child_frame_id = "base_link";odom_to_base_link.transform.translation.x = 0.0;odom_to_base_link.transform.translation.y = 0.0;odom_to_base_link.transform.translation.z = 0.0;odom_to_base_link.transform.rotation.x = 0.0;odom_to_base_link.transform.rotation.y = 0.0;odom_to_base_link.transform.rotation.z = 0.0;odom_to_base_link.transform.rotation.w = 1.0;// 发布tf变换static tf2_ros::TransformBroadcaster broadcaster;ros::Rate rate(10.0);while (node.ok()){odom_to_base_link.header.stamp = ros::Time::now();broadcaster.sendTransform(odom_to_base_link);rate.sleep();}return 0;
}
在以上代码中,我们首先定义了一个geometry_msgs::TransformStamped类型的变量odom_to_base_link,用于存储从odom到base_link的tf变换。然后,我们设置了机器人的初始位置和姿态,并将其赋值给odom_to_base_link变量。接着,我们使用tf2_ros::TransformBroadcaster类的sendTransform()函数来发布tf变换。最后,我们使用一个循环来持续地发布tf变换。
需要注意的是,上述代码中的odom_to_base_link变量中的初始位置和姿态需要根据实际情况进行设置。此外,如果你想要将odom_to_base_link_broadcaster节点编译为可执行文件,你需要将它添加到CMakeLists.txt文件中,并进行编译,以下是CMakeLists.txt文件需要修改的代码。
注:需要修改的CMakeLists.txt文件是与odomTobaselink下的src文件同级的
add_executable(odomTobaselink src/odomTobaselink.cpp)
target_link_libraries(odomTobaselink
${catkin_LIBRARIES}
)
3.在launch中添加node标签启动节点
在以上示例中,我们使用node标签来启动一个的节点。该节点的pkg属性指定了该节点所在的软件包,type属性指定了该节点的可执行文件名称(不带.cpp、.py后缀),name属性指定了该节点的名称(可任意取名)。
ERROR: cannot launch node of type [robot_gazebo/odomTobaselink]: Cannot locate node of type [odomTobaselink] in package [robot_gazebo]. Make sure file exists in package path and permission is set to executable (chmod +x)
如果出现上述错误,可以使用catkin_make命令编译ROS工作空间中的程序。
现在可以启动launch文件来显示加载自己的机器人模型
4.通过rqt_tf_tree命令查看ROS中所有发布的TF转换关系的树状结构

tf关系已可在树状图中查看。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
