ROS Melodic 中使用 Python3 和 tf2 实现位姿的坐标变换

Transform - 变换,Frame - 坐标系,Workspace - 工作空间,Subscriber - 订阅者

写在前面

本文用于在 ROS Melodic 中,使用 Python3 虚拟环境(如 Anaconda),将某一坐标系中的位姿变换到另一坐标系中(即坐标变换)。ROS 中实现该功能的库是 tf(transform 的简称),目前更新至第二代(tf2)。

本文同样适用于解决 tf2_py 出现的 dynamic module does not define module export function (PyInit__tf2) 报错,以及 tf2_ros.Buffer().transform 函数出现的 Type ... if not loaded or supported 报错。

在这里插入图片描述

待解决的问题

创建坐标系

坐标变换前,tf 树中应存在坐标系,例如存在 mapmap_local 两个坐标系,从而我们可以将发布到 map_local 中的位姿(例如 header.frame_id = "map_local"geometry_msgs/PoseStamped)变换到 map 中。

创建坐标系 ROS 有官方教程,参见链接

指定用 Python3 运行节点

针对这个问题 ROS 官方同样发布了教程,参见链接

核心思想就是修改 Python 文件开头的 #!(英文名称为 shebang),#! 后接的是 Python 可执行文件的路径。如果使用的是 Python 虚拟环境,可以在命令行中激活环境,输入 python,然后运行以下指令即可打印出路径,将打印出的路径加在 #! 后放在文件开头即可,例如 #! /home/easy/miniconda3/envs/test/bin/python

import sys
print(sys.executable)

重装 tf2_py 和 tf2_geometry_msgs

对于 ROS Melodic,tf2_py 是针对 Python2写的,如果在 Python3 中 import tf2_py,会出现 dynamic module does not define module export function (PyInit__tf2) 的报错,所以需要重装。我们在 Python3 环境中能够通过 import 找到 tf2_py 这个包是因为安装 ROS 时在 .bashrcsource/opt/ros/melodic/setup.bash

tf2_py 的源码位于 Github,链接,注意链接是 ROS Melodic 分支的,需要下载并取出名为 tf2_py 的文件夹,放到 ROS 工作空间下,上不去 Github 可以下载小节末的百度网盘链接。为了编译生成 Python3 可运行的功能包,需要修改 CMakeLists.txt,在 project 后加入三行,分别是 Python 可执行文件路径、Python 头文件路径、以及 Python 库文件。改好后 catkin build 编译即可,会在 devel/lib/python3/dist-packages 路径下生成 tf2_py 文件夹,注意路径中是 python3,这说明成功生成了 Python3 可运行的功能包。

project(tf2_py)

set(PYTHON_EXECUTABLE /home/easy/miniconda3/envs/test/bin/python)
set(PYTHON_INCLUDE_DIR /home/easy/miniconda3/envs/test/include/python3.9)
set(PYTHON_LIBRARY /home/easy/miniconda3/envs/test/lib/libpython3.9.so)

安装完后,系统同时存在两个 tf2_py,为了使 import 优先引入我们编译生成的 Python3 版本,需要在 import 前加入一行代码,用于在 Python 搜索路径的第一位放入刚刚编译生成功能包的绝对路径,例子如下。当然,使用绝对路径是保证能用的简易方案,这里也可以考虑使用相对路径或环境变量。

sys.path.insert(0,'/home/easy/Repository/ros_ws/devel/lib/python3/dist-packages')
import tf2_ros

tf2_ros.Buffer().transform 函数需要 tf2_geometry_msgs 包,如果在实例化 tf2_ros.Buffer() 前不 import tf2_geometry_msgs 的话,transform 函数会出现 Type ... if not loaded or supported 的报错。import 这个包其实是把能够转换的类型写入了 tf2_ros.TransformRegistration() 中,会在实例化 tf2_ros.Buffer() 的过程中用到。

如果 import tf2_geometry_msgs 显示 no module named 'tf2_geometry_msgs' 的话则需要安装,tf2_geometry_msgs 和 tf2_py 在同一个 Github 仓库中,同样需要放到 ROS 工作空间并编译,tf2_geometry_msgs 的 CMakeLists.txt 无需修改。

tf2_py 和 tf2_geometry_msgs 百度网盘 链接(提取码 y6ze)

实例代码

获取两个坐标系的变换关系

情景:tf 树中存在 mapmap_local 的变换和 mapbase_link 的变换,需要获取 base_linkmap_local 的变换。

#! /home/easy/miniconda3/envs/test/bin/python
import rospy
sys.path.insert(0,'/home/easy/Repository/ros_ws/devel/lib/python3/dist-packages')
import tf2_ros
import tf2_geometry_msgs

tf_buffer = tf2_ros.Buffer()
if tf_buffer.can_transform('map_local', 'base_link', rospy.Time(0)):
    trans = tf_buffer.lookup_transform('map_local', 'base_link', rospy.Time(0))

输出的 trans 中包括 trans.transform.rotation(四元数,表示旋转,包含 xyzw,例如 trans.transform.rotation.x)和 trans.transform.translation(位移,包含 xyz)。如果不加 can_transform 判断的话,在程序运行初期容易报错。

将某一坐标系中的位姿变换到另一坐标系中

情景:将订阅到的 header.frame_id = "base_link"、类型为 visualization_msgs/Marker 的话题数据 data 变换到 map_local 坐标系下。其中 onData 是 Subscriber 的回调函数。

#! /home/easy/miniconda3/envs/test/bin/python
import rospy
sys.path.insert(0,'/home/easy/Repository/ros_ws/devel/lib/python3/dist-packages')
import tf2_ros
import tf2_geometry_msgs
from visualization_msgs.msg import Marker
from geometry_msgs.msg import PoseStamped

def onData(self, data: Marker):
    pose = PoseStamped()
	pose.header = data.header
	pose.pose = data.pose
	
	tf_buffer = tf2_ros.Buffer()
	pose_transformed = tf_buffer.transform(pose, 'map_local')

输出的 pose_transformed 中包括 pose_transformed.pose.orientation(四元数,表示旋转,包含 xyzw,例如 pose_transformed.pose.orientation.x)和 pose_transformed.pose.position(位置,包含 xyz)。

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要在ROS Melodic使用Python 3,需要安装Python 3的相关库和工具。可以按照以下步骤进行操作: 1. 安装Python 3 在Ubuntu 18.04Python 3已经预装。如果没有安装,可以使用以下命令安装: ``` sudo apt-get install python3 ``` 2. 安装Python 3的ROS依赖库 在ROS Melodic,需要安装Python 3的ROS依赖库。可以使用以下命令安装: ``` sudo apt-get install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential ``` 3. 创建Python 3的ROS工作空间 可以使用以下命令创建Python 3的ROS工作空间: ``` mkdir -p ~/catkin_ws_py3/src cd ~/catkin_ws_py3/ catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3 ``` 4. 设置Python 3的ROS环境变量 可以使用以下命令设置Python 3的ROS环境变量: ``` echo "source ~/catkin_ws_py3/devel/setup.bash" >> ~/.bashrc source ~/.bashrc ``` 5. 编写Python 3的ROS程序 现在可以使用Python 3编写ROS程序了。在Python文件的开头,需要添加以下代码: ``` #!/usr/bin/env python3 ``` 这样可以确保使用Python 3来运行程序。 6. 运行Python 3的ROS程序 可以使用以下命令运行Python 3的ROS程序: ``` rosrun package_name node_name.py ``` 其,package_name是ROS包的名称,node_name.py是Python 3的ROS节点文件名。 ### 回答2: ROS是一个机器人操作系统,已经成为许多机器人和自动化领域的标准。ROS的版本很多,其ROS Melodic是针对Ubuntu 18.04操作系统的最新版本。与较老的ROS版本相比,ROS Melodic具有更大的兼容性和更多的功能。值得一提的是,ROS Melodic使用Python版本已经从Python2转移到了Python3PythonROS最常用的编程语言之一。在ROS MelodicPython3被用作默认Python解释器。这意味着你应该使用Python3来编写ROS Melodic的程序,而不是使用Python2。使用Python3编写的ROS程序具有更好的性能和更长的生命周期,因为Python2的支持已经于2020年1月停止。 一些ROS的常用Python库也已经升级到Python3版本,例如rospy,其的一些API与Python2相比略有变化。所以,如果你的代码是用Python2编写的,若想迁移到ROS Melodic,则需要相应地更改它。 总的来说,ROS MelodicPython3支持使得编写ROS应用程序更容易、更深入,并且更适合在现代计算机系统运行。如果你正在使用ROS Melodic,强烈建议开始使用Python3来编写你的ROS程序。 ### 回答3: ROS机器人操作系统)是一个开源的、灵活的、分布式的机器人软件框架,用于构建机器人和其他自动化系统。它包含大量工具和库,可以简化机器人应用程序的开发、测试和部署。ROS支持多种编程语言,如C ++、Python等。ROS MelodicROS的一个版本,它是ROS的第十个正式版本,于2018年5月23日发行。 在ROS MelodicPython 3成为了官方建议的编程语言。这意味着开发者可以使用Python 3编写ROS的节点、消息、服务和其他ROS组件,而无需改变ROS的基本运行原理。在 ROS MelodicPython 3已经默认成为ROSPython的解释器。 此外,ROS还提供了与Python 3兼容的库和工具,如rosbag、rviz、roscore等,他们可以使用Python 3脚本通过ROS API进行控制和交互。Python 3的高级功能可以更好地支持ROS的开发和自动化,例如异步编程和并发执行。 需要注意的是,在ROS MelodicPython 2仍然可以被使用,但是官方建议使用Python 3以便更好地支持未来的ROS版本。此外,一些ROS社区成员和开发者可能仍然使用Python 2来编写他们的ROS组件和应用程序。 因此,当编写ROS应用程序时,需要考虑Python 2和3之间的兼容性问题。 总结来说,ROS Melodic使用Python 3作为官方建议的编程语言,提供了与Python 3兼容的库和工具,并提供了支持异步编程和并发执行的高级功能,以更好地支持ROS的开发和自动化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值