基于python的ROS功能包(对比C++的ROS开发,Python的ROS开发简单和方便的无数倍。)

2023-12-18 05:38

本文主要是介绍基于python的ROS功能包(对比C++的ROS开发,Python的ROS开发简单和方便的无数倍。),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里面让我清楚了几点,python的ROS功能包也是有package.xml和CMakeLists.txt的,但是CMakeLists.txt写起来比C++的简单些。所以怪不得在XTDrone和GAAS的工程里搜CMakeLists还是能搜出一大堆的。

而且里面多次提到  对比C++的ROS开发,Python的ROS开发简单和方便的无数倍。  怪不得GAAS和XTDrone都是用python写的。

讲道理python脚本是可以直接执行的,不用继续编译对吧。

 

摘自:https://www.waveshare.net/study/article-1057-1.html

ROS基础系列教程4:ROS和Python编程认知

2020-9-16 15:36| 发布者: waveshare_yf| 查看: 435| 评论: 0|原作者: waveshare|来自: waveshare

摘要: 上一讲的内容是关于ROS和C++编程的,这一讲我们来聊聊ROS和Python编程。同样,关于工作空间、功能包、CMakeList.txt、package.xml等内容我就不再阐述,这一讲的内容主要在于ROS和Python的接口,以及ROS开发的一个“ ...

  • 上一讲的内容是关于ROS和C++编程的,这一讲我们来聊聊ROS和Python编程。同样,关于工作空间、功能包、CMakeList.txt、package.xml等内容我就不再阐述,这一讲的内容主要在于ROS和Python的接口,以及ROS开发的一个“通性”。

创建功能包learning_python

cd catkin_ws/src 
catkin_create_pkg learning_python rospy roscpp std_msgs
  • 这次的功能包名称叫做learning_python,意在学习ROS下Python开发。我们这次需要在工作空间下创建scripts文件夹,意为“脚本”。这里我们再重复以下,ROS功能包下的src放的是源码,include是引用文件,scritps是脚本文件,这也算是默认的潜规则,我们进入learning_python路径下,建立scripts文件夹。
mkdir scripts

修改CMakeList.txt和package.xml

  • 我们需要对这两个文件进行一些小小的改动,对比C++的ROS开发,Python的ROS开发简单和方便的无数倍。下面是我修改后的package.xml。
<?xml version="1.0"?> 
<package format="2"> 
<name>learning_python</name> 
<version>0.0.0</version> 
<description>这是学习ROS Python编程的功能包</description> <maintainer email="1692697820@qq.com">waveshare</maintainer> 
<license>TODO</license> 
<author email="1692697820@qq.com">waveshare</author> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> 
<build_depend>rospy</build_depend> 
<build_depend>std_msgs</build_depend> 
<build_depend>message_generation</build_depend> 
<build_export_depend>roscpp</build_export_depend><build_export_depend>rospy</build_export_depend> 
<build_export_depend>std_msgs</build_export_depend><exec_depend>roscpp</exec_depend> 
<exec_depend>rospy</exec_depend> 
<exec_depend>std_msgs</exec_depend> 
<exec_depend>message_runtime</exec_depend> <export>
</export>
</package>
  • 这是我修改后的CMakeList.txt。
cmake_minimum_required(VERSION 3.0.2)
project(learning_python) find_package(catkin REQUIRED COMPONENTS
roscpp
rospy 
std_msgs 
message_generation 
) generate_messages( 
DEPENDENCIES 
std_msgs 
) catkin_package(
# INCLUDE_DIRS include 
# LIBRARIES learning_python 
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib 
) include_directories( 
# include 
${catkin_INCLUDE_DIRS} 
)
  • 这些内容和上一节的很相似,唯一不同的就是没有了编译依赖项等待一大堆链接,这就是Python简洁性的体现。

使用Python实现ROS编程

  • 我们这一章实现的功能和上一章相同,可以让大家对比一下C++实现和Python实现的 异同所在。
  • 首先写一个发布节点,我们需要在scritps文件夹下,创建publisher.py,并赋予该文件可执行权限。Python很特别的,它的程序即是源码文件,也是执行文件。如果我们没有给可执行权限的话,1那么我们的rosrun会一直找不到节点(可执行文件)。
roscd learning_python
cd scripts 
touch publisher.py
sudo chmod +777 publisher.py



  • 发布节点Python程序如下。
#!/usr/bin/env python #指定Python运行,即Python2 
#coding:utf‐8 #设置编码格式为utf‐8 import rospy #导入rospy功能包
from std_msgs.msg import String #导入std_msgs/String消息功能包 #定义talker函数 
def talker(): pub = rospy.Publisher('chatter', String, queue_size=10) #定义发布的主题名称chatter,消息类型String,实质是std_msgs.msg.String #设置队列条目个数为10 rospy.init_node('talker', anonymous=True) #初始化节点,节点名称为talker, #anonymous=True,要求每个节点都有唯一的名称,避免冲突rate = rospy.Rate(10) #设置发布的频率,单位是每秒次数,这是每秒10次的频率发布主题 #用于检测程序是否退出,是否按Ctrl‐C 或其他while not rospy.is_shutdown(): hello_str = "hello world %s" % rospy.get_time() rospy.loginfo(hello_str) #在屏幕输出日志信息 pub.publish(hello_str) #发布信息到主题 rate.sleep() #睡眠一定持续时间 if __name__ == '__main__': try: talker() except rospy.ROSInterruptException:pass

然后进行编译。

  • 我们之前在C++下面写有订阅节点,可以来验证一下这个Python发布节点是否正确。我们依次启动ROS Master节点管理器、learning_python下的publisher.py发布节点脚本、learning_cplus下的listener订阅节点。
    • 启动ROS Master节点管理器。
      roscore
    • 启动learning_python下的publisher.py发布节点脚本。
      rosrun learning_python publisher.py
    • 启动learning_cplus下的listener订阅节点。
      rosrun learning_cplus listener



  • 我们来启动一个rqt_graph节点关系图来查看一下节点关系。
rqt_graph



  • 其中的的talker就是我们的Python发布节点,listener就是我们的C++订阅节点。接下来开始写订阅节点,老规矩,进入scripts文件夹,创建listener.py订阅节点文件, 然后赋予可执行权限。
roscd learning_python 
cd scripts 
touch listener.py
sudo chmod +777 listener.py
  • 订阅节点Python程序如下。
#!/usr/bin/env python #指定Python运行,即Python2 
#coding:utf‐8 #设置编码格式为utf‐8 import rospy #导入rospy功能包 
from std_msgs.msg import String #导入std_msgs/String消息功能包 #定义回调函数 
def callback(data):rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data) def listener():rospy.init_node('listener', anonymous=True) #初始化节点,节点名称为talker #anonymous=True,要求每个节点都有唯一的名称,避免冲突 rospy.Subscriber('chatter', String, callback) #订阅函数,订阅chatter主题,内容类型是std_msgs.msgs.String。 #当有新内容,调用callback函数处理。接受到的主题内容作为参数传递给callback. rospy.spin()#保持节点运行,直到节点关闭。#不像roscpp,rospy.spin不影响订阅的回调函数,因为回调函数有自己的线程。 if __name__ == '__main__': listener()
  • 然后来验证一下订阅节点的一个功能。
    • 启动ROS Master节点管理器。
      roscore
    • 启动learning_python下的publisher.py发布节点脚本。
      rosrun learning_python publisher.py
    • 启动learning_cplus下的listener订阅节点。
      rosrun learning_python listener.py



可以看到,这是相当成功的。

  • 我们可以对比一下C++的实现和Python的实现,可以看到原理和过程是一模一样的, 只是在关键字和语法方面有所不同。 初始化节点,发布消息声明,然后发布,延时;再或者就是定义回调函数,监听,延 时。当中的核心重点是在于发布的一个数据的格式。 假如说我现在想做一个惯导IMU,可是你不懂四元数(咳咳,这个不是重点)计算,但 是再这个时候你却发现,ROS有对惯导模块的功能包(比如imu_tools功能包),那么你需 要做的就是搞清楚这个功能包之间关系,看陀螺仪所获得数据是如何达到,又达到了哪个位 置。这就是ROS! 同样,大家也可以试一下发布一个cmd_vel老控制小海龟的运动!

这篇关于基于python的ROS功能包(对比C++的ROS开发,Python的ROS开发简单和方便的无数倍。)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/507217

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形