白给的ROS编程笔记——vscode+ros工程建立以及ros package中的python脚本封装成模块被其他脚本调用

动机

能够调用包中写的python文件

1. ros 工作空间的创建和包的创建

1.1 ros 工作空间初始化

 mkdir -p learn_ros_ws/src
 cd learn_ros_ws/src/
 catkin_init_workspace
 cd ..
 catkin_make

然后我们在命令行中输入

tree  -L 1

查看文件夹中的一级目录结构
在这里插入图片描述
下面我们将会选用vscode作为集成开发环境,继续创建ros包。

1.2 设置编译指令(ctrl+shift+B)

使用vscide中的ros插件创建包

code .

如果之前已经给vscode安装了ros插件,它会识别出这是一个ros工程,自动生成.vscode文件夹。如果事先没有安装,则可以安装后重新打开这个工程。文件结构如下:
在这里插入图片描述
其中, c_cpp_properties.json文件记录了编程过程中,头文件和python模块的语法搜索路径,关系到变量名是否会有提示。但,跟编译的时候的搜索路径(CMakeLists.txt中规定的文件搜索路径)不是一回事。

接着我们需要创建 tasks.json文件,编辑编译的指令。
在这里插入图片描述
选择catkin_make: build
在这里插入图片描述
这时会弹出一个自动生成的tasks文件, 把红框的部分改为Release
在这里插入图片描述
这时,我们只需要使用快捷键ctrl+shift+B就能够编译ros工程了,其中args 可以添加更多指令, 达到在命令行中敲指令编译一样的效果。

1.2 创建ros包

在src文件夹下右键,选择Create Catkin Package,
在这里插入图片描述
依次输入新建包的名字,依赖的包的名字。如名字设为foo_package_1, ros依赖包输入为roscpp rospy std_msgs sensor_msgs geometry_msgs, 这样就建好一个ros包了。结果如图所示:
在这里插入图片描述
这里有一点可以稍微留意的是,每一个ros package里面会一个src文件和src外面有一个CMakeLists.txt文件和package.xml文件。这两个文件是需要根据需求改动的。而工作空间learn_ros_ws文件夹src下的CMakeLists.txt让他做个安静的美男子就好了,不需要做任何改动。对于devel和build文件是catkin_make huild的时候自动生成的,如果想重新编译工程,可以直接把这两个文件都删掉再重新编译。值得注意的是,在执行ros空间中的可执行文件前需要在终端source一下devel文件夹下的setup.bash文件,如:

source devel/setup.bash

下面我们按照同样的流程,创建一个名为python_recall_test的包。然后ctrl+shift+B编译一下。最终我们整个ros工程的结构如下。

在这里插入图片描述
好,现在万事俱备,下一节我们将会介绍怎么配置建好的ros包,将其封装为一个modules供ros工程里的其他包的python脚本调用。

2. 调用自己创建的python包示例

2.1 文件配置

2.1.1 新建被调用的文件

在这里插入图片描述

新建一个scripts/python_recall_test文件夹,然后在其下面新建一个带有utils_foo.py文件的utils文件夹,以及一个foo.py文件。utils_foo.py文件

#! /usr/bin/env python
class WhoAreYou(object):
    def __init__(self) -> None:
        print('I am python recall test script in utils folder!')

foo.py文件则写为:

#! /usr/bin/env python
class Foo(object):
    def __init__(self) -> None:
        print('I am foo in script folder!')
   
if __name__ == '__main__':
    hello = Foo()

2.1.2 CMakeLists.txt的配置

只需要解注释 catkin_python_setup() 这个命令即可,可以ctrl+F进行搜索。注意这里改写的ros包里面CMakeLists.txt

## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
################################################

2.2 _init_.py

可以是空文件,也可以是一个全局定义的函数。这里我们将它放在scripts文件夹中。就我个人习惯而言,我会喜欢把cpp相关的文件放在include和src文件夹中,而python文件则统统扔到scripts文件夹里面。为了示意,在__init__.py中也写了一点东西。

_init_.py 的出现(只看python脚本的名字)告诉了setup.py 文件,同一目录下的所有python文件的模块都可以被外部调用。

2.3 setup.py

最后,CMakeLists.txt所指向的且在ros包中不可或缺的文件setup.py。在这个文件中规定了packages的类型,实际上也是对应我们生成的modules的名字,和调用方式,它规定了在package_dir下的python文件所在路径(此处是scripts文件夹下)。注意看下图中对应的变量名的位置, python_recall_testpython_recall_test.utils_init_.py 所在的文件目录,这个文件夹下面的所有文件都可以被当成python模块调用。

# ! DO NOT MANUALLY INVOKE THIS setup.py, USE CATKIN INSTEAD!
from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup
# Fetch values from package.xml.
setup_args = generate_distutils_setup(
    packages=["python_recall_test", "python_recall_test.utils",], package_dir={"": "scripts"},
)
setup(**setup_args)

在这里插入图片描述在这里插入图片描述
最后我们按下ctrl+shift+B 对整个工程进行编译,这样相关的python模块就会在工程根目录的builddevel文件夹下生成某种涉及我知识盲区的链接文件。

3. 在其他ros包中调用

3.1 创建python脚本

最后就只差调用我们写好的python_recall_test 包了。同样的我们在foo_package_1中创建一个scripts文件夹,然后再在scripts文件夹下创建一个main.py脚本,脚本内容如下:

#! /usr/bin/env python
import rospy

from python_recall_test.foo import Foo
from python_recall_test.utils.utils_foo import WhoAreYou

if __name__ == '__main__':
    rospy.init_node('test_node')
    hi = Foo()
    hello = WhoAreYou()

注意留意python包导入的方式:
在这里插入图片描述

3.2 执行python脚本

  1. 打开终端,输入
roscore
  1. 打开另一个终端或者ctrl+shift+O如果安装了terminator的话,输入工程所在的路径,然后source一下工作空间
cd learn_ros_ws/
source devel/setup.bash
rosrun foo_package_1 main.py 

在这里插入图片描述
程序正常执行,在同一个工程目录下,A包中python模块可以被B包中的python脚本调用的问题,解决!

3.3 多聊几句

我们再看一下vscode中的截图情况,会发现竟然没有导入路径找不到时出现的波浪号。
在这里插入图片描述这是因为我们在settings.json里面设置了python的外部搜索路径,你看这个路径的写法跟setup.py文件中的package_dir是不是有点熟悉的味道。当然,关于文件索引的问题,c++的头文件路径也可以在c_cpp_properties.json 文件中定义。

以上就是,如何实现ros包中自定义的python模块被其他包调用的方法总结,需要注意的是,调用前需要source一下工程目录下devel文件夹内的setup.bash文件。

早睡早起精神好!

2022年8月29日凌晨
Dianye Huang

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在VSCode新建Python包的步骤如下: 1. 在VSCode打开一个Python项目文件夹,例如在左侧的资源管理器选择“打开文件夹”并选择一个Python项目文件夹。 2. 在项目文件夹右键单击,选择“新建文件夹”。 3. 在弹出的对话框输入包的名称,例如“my_package”。 4. 在“my_package”文件夹新建一个名为“__init__.py”的空文件,这个文件是Python包的标志文件。 5. 在“my_package”文件夹新建其他Python模块文件,例如“module1.py”、“module2.py”等。 6. 在其他Python模块文件可以使用“from my_package import module1”等语句来引用“my_package”包模块。 注意:在VSCode新建Python包时,需要手动创建“__init__.py”文件,否则会被视为普通文件夹而不是Python包。 ### 回答2: 在VS Code创建Python包有几个简单的步骤: 1. 在要创建Python包的文件夹新建一个文件夹,这个文件夹的名称就是包的名称。 2. 在创建的文件夹新建一个名为__init__.py的空文件。这是Python定义包的标准方式。 3. 在__init__.py文件添加任何需要的初始化代码和任何需要导入的功能,例如: from . import module1 from . import module2 4. 在包的根目录添加其他Python模块文件并将它们保存在新建的包文件夹。 5. 使用import语句在其他Python程序导入创建的包。 这样就完了在VS Code创建Python包的过程。当然,在实际应用过程,还可以通过设置扩展插件和利用VS Code的自动完功能来加快Python包的开发过程。 ### 回答3: 在VS Code创建Python包,通常需要遵循以下几个步骤: 1. 打开VS Code软件并创建工作空间 为了创建Python包,首先需要打开VS Code软件,并创建一个工作空间。工作空间通常是包含所有项目文件的文件夹,用于保存代码文件和其他相关文件。 2. 创建一个新文件夹来存放Python包 在工作空间,右键单击鼠标并选择“新建文件夹”选项来创建一个新的文件夹。建议将其命名为与包同名的名称。 例如,如果要创建一个名为“my_package”的Python包,那么可以命名它为“my_package”。 3. 在新文件夹创建__init__.py文件 创建Python包的关键步骤之一是创建一个名为“__init__.py”的特殊文件。这个文件用于定义所有Python可导入的模块。在新文件夹新建一个文本文件,并将其命名为“__init__.py”。 4. 在包创建模块 第四步是在Python创建一个或多个模块模块Python程序的单个代码文件。在新文件夹新建一个文件,命名为方法名或任务类型。可以将创建的文件保存为.py文件,已经定义好前缀"def"的python文件。 5. 导入包 要使用新创建的Python包,需要在Python程序导入它。可以使用“import”命令导入整个包,也可以导入包的单个模块。可以在Python程序开头写as关键字与包名同名,如"import Demo_Module as Demo",这就是一个简单可读的包名。 这些步骤是创建Python包的基础步骤。完这些步骤后,可以在Python程序使用自定义包及其模块。另外,调整工程路径和环境变量等要素,也会影响到python类库(package)的调用和解析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值