2025年3月30日 星期日 甲辰(龙)年 月廿九 夜 设为首页 加入收藏
rss
您当前的位置:首页 > 电子 > 机器人与智能物联

ROS与Python入门教程-制作Makefile文件

时间:02-02来源:作者:点击数:59

说明

  • 介绍如果制作Makefile文件

介绍

  • 这两个关于构建包的文件(CMakeLists.txt,Makefile)很简单,但提供非常重要的功能:
    • 自动生成message和service代码
    • 运行测试
  • 测试功能非常重要,因为它可以测试你的包和相关依赖的包(rospack pkg test)
  • 使用catkin, 你只需要一个CMakefile,它在你的build目录可以生成Makefile文件

创建包

  • 在catkin的工作空间,创建新包:
  • $ cd ~/catkin_ws/src
  • $ catkin_create_pkg my_pkg message_generation rospy
  • 上面命令创建my_pkg,它依赖rospy包和message_generation包。
  • message_generation包可以定义message(消息)和service(服务)。
  • 在package.xml文件,需包含:
    <buildtool_depend>catkin</buildtool_depend>
  • 在CMakeLists.txt文件,最少包含:
  • cmake_minimum_required(VERSION 2.8.3)
  • project(my_pkg)
  • find_package(catkin REQUIRED COMPONENTS message_generation rospy ...)
  • catkin_package()

添加message和service

  • 添加message或service 需要更改 package.xml and CMakeLists.txt文件
  • 在package.xml文件,添加:
  • <build_depend>message_generation</build_depend>
  • 在CMakelists.txt文件, 添加:
  • cmake_minimum_required(VERSION 2.8.3)
  • project(my_pkg)
  • find_package(catkin REQUIRED COMPONENTS message_generation rospy)
  • add_message_files(
  • FILES # e.g. Floats.msg HeaderString.msg
  • )
  • add_service_files(
  • DIRECTORY srv
  • FILES AddTwoInts.srv BadTwoInts.srv
  • )
  • ## Generate services in the 'srv' folder
  • # add_service_files(
  • # FILES # e.g. Floats.srv HeaderString.srv
  • #)
  • ## Generate added messages and services with any dependencies
  • generate_messages()
  • catkin_package(
  • CATKIN_DEPENDS message_runtime
  • )

安装脚本和导出模块

  • 使用catkin,ROS包有一个安装目标。这使得其他软件包管理器自动创建安装包比apt-get容易得多,也适用于MacOS,拱,BSD,窗户,等。
  • 开发者的责任就是描述需要安装什么,如果在你的源代码树上的每一个文件都安装在其他人的电脑上,这样不是十分好。
  • 所以对于Python项目,我想安装脚本和python模块在其他的电脑上作为库来使用(其他资源目前还没有支持在setup.py声明,可以使用CMakeLists.txt代替)
  • 在教程里,创建一个作为例子的Python包:
  • $ cd ~/catkin_ws/src/my_pkg # new catkin package, in the workspace
  • $ mkdir bin
  • $ mkdir src
  • $ mkdir src/tutorial_package
  • $ touch src/tutorial_package/__init__.py
  • 这里定义一个python包,叫tutorial_package。通常定义一个名称应该跟catkin包相同名称(如my_pkg),为了避免冲突,我们命名为不一样的名称,这样容易辨别。
  • 在my_pkg,新建src/tutorial_package/hello.py文件
  • def say(name):
  • print('Hello ' + name)
  • 再创建bin/hello文件:
  • #! /usr/bin/env python
  • import tutorial_package.hello
  • if __name__ == '__main__':
  • tutorial_package.hello.say('my friend!')
  • 设置可执行
  • $ chmod u+x bin/hello
  • 如果尝试执行,会报错
  • $ bin/hello
  • Traceback (most recent call last):
  • File "bin/hello", line 3, in <module>
  • import tutorial_package.hello
  • ImportError: No module named tutorial_package.hello
  • 解决1:更改 PYTHONPATH,但只能在你本地执行
  • 解决2:如果要普遍适用,就要定义一个安装程序,移动文件到PYTHONPATH。
  • 对于python包和脚本,catkin提供cmake macro来提取来自setup.py的相关信息。
  • 在my_pkg根目录下创建setup.py,内容如下:
  • ## ! 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=['tutorial_package'],
  • package_dir={'': 'src'},
  • )
  • setup(**setup_args)
  • 记住: setup.py是catkin使用的,而不是用户调用。catkin将确保setup.py文件安装到正确的位置。如果你手动调用setup.py,你可能会破坏你的ROS安装。
  • 第一行,使用distutils (不推荐setuptools,因为它会在src生成文件)
  • 使用generate_distutils_setup函数读取package.xml文件的值,同时也执行一些转换,例如漂亮地列出作者和维护者。
  • 所有我们需要的不在package.xml的信息,如:
    • 想要安装的脚本名称
    • python包的名称
    • 那里可以找到这些包
    • python包的依赖
  • 相比那些在package.xml使用的,以上的会有不同的名称,需要单独列出。
  • 为了catkin能使用到setup.py, 需要去掉在CMakeLists.txt文件注释:
  • ## Uncomment if the package has a setup.py
  • catkin_python_setup()
  • 最后,如果用户安装你的包,你需要修改CMakeLists.txt这一行:
  • catkin_install_python(PROGRAMS bin/hello
  • DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
  • 编译包
  • $ cd ~/catkin_ws
  • $ catkin_make
  • 让环境包含新的devel空间
  • $ . devel/setup.bash
  • 现在你的脚本和模块可通过rosrun来运行,其他用户安装你的包,也同样有效。
  • $ rosrun my_pkg hello
  • Hello my friend!

在beginner_tutorials包里测试

  1. 在beginner_tutorials包,新建bin,src,src/tutorial_package目录,新建init.py
  • $ roscd beginner_tutorials
  • $ mkdir bin
  • $ mkdir src
  • $ mkdir src/tutorial_package
  • $ touch src/tutorial_package/__init__.py
  • $ chmod +x src/tutorial_package/__init__.py
  1. 和src/tutorial_package/hello.py文件
  • $ touch src/tutorial_package/hello.py
  • $ chmod +x src/tutorial_package/hello.py
  1. 手工输入如下代码:
  • def say(name):
  • print('Hello' + name)
  1. 创建bin/hello文件
  • $ roscd beginner_tutorials/bin
  • $ touch hello
  • $ chmod +x hello
  • $ rosed beginner_tutorials hello
  1. 手工输入代码:
  • #! /usr/bin/env python
  • import tutorial_package.hello
  • if __name__ == '__main__':
  • tutorial_package.hello.say('my friend!')
  1. 在beginner_tutorials目录下,新建setup.py
  • $ roscd beginner_tutorials
  • $ touch setup.py
  • $ chmod +x setup.py
  • $ rosed beginner_tutorials setup.py
  1. 手工输入代码:
  • ## ! 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=['tutorial_package'],
  • package_dir={'': 'src'},
  • )
  • setup(**setup_args)
  1. 在CMakeLists.txt文件找到下面行,并去掉注释。让catkin使用setup.py
  • ## Uncomment if the package has a setup.py
  • catkin_python_setup()
  1. 在CMakeLists.txt文件找到下面行,并去掉注释。让用户安装到正确目录:
  • catkin_install_python(PROGRAMS bin/hello
  • DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
  1. 编译代码
  • $ cd ~/catkin_ws
  • $ catkin_make
  1. 让环境识别
  • $ . devel/setup.bash
  1. 测试调用
  • $ rosrun beginner_tutorials hello
  • Hello my friend!
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门