新闻中心
新闻中心

17

2025

-

02

如何将python文件导入到ROS系统中

浏览:511  

发布:2025-02-17 13:03:59


本文通过使用myCobot机械臂进行QR码视觉追踪的实践案例分析,介绍如何将 python 文件导入到 ROS 系统中。

一、引言

在过去的项目中,我主要使用 Python 独立实现各种功能。然而,随着机器人操作系统 (ROS) 的日益普及,我逐渐意识到将这些项目集成到 ROS 中的众多优势。ROS 提供的仿真环境不仅可以提高效率,还可以为项目测试提供安全且可扩展的平台。因此,在本文中,我将分享将基于 Python 的机械臂二维码跟踪系统引入 ROS 并在仿真环境中运行该项目的过程。

二(èr)、项(xiàng)目(mù)准(zhǔn)备(bèi)
1、硬(yìng)件(jiàn)组(zǔ)件(jiàn)
M5Stack ESP32 基(jī)础(chǔ)核(hé)心(xīn)物(wù)联(lián)网(wǎng)开(kāi)发(fā)套(tào)件(jiàn)
Elephant Robotics myCobot-6 DOF 协作机器人

Raspberry Pi 4 B 型
2、软件应用程序和在线服务
ROS 机器人操作系统

3、手动工具和制造机


大象机器人 myCobot 280 M5Stack 2023

4、环境设置
对于本项目,建议使用以下开发环境和依赖版本:

● 操作系统(tǒng):Ubuntu 20.04 LTS

● ROS 版(bǎn)本(běn):Noetic
● Python 版(bǎn)本(běn):Python 3.8 或(huò)更高版本
● 库版本要求:pymycobot 3.6 或更高版本
安装关键依赖项
在终端中运行以下命令以安装必要的 Python 库。

pip install stag-pythonpip install opencv-pythonpip install scipypip install numpypip install pymycobo

三、项目运行
在 ROS 中创建 Workspace 和 Package
1.打开终端并创建一个名为 catkin_ws 的新 ROS 工作区:
mkdir -p ~/catkin_ws/src

2. 进入 workspace 目录并初始化:

cd ~/catkin_wscatkin_make

3. 设置环境变量以确保 ROS 可以找到工作区

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrcsource~/.bashrc


提示:此配置将在每次打开新终端时自动加载工作区设置。


创建 ROS 包(bāo)


1. 在(zài) src 目(mù)录(lù)中(zhōng),创(chuàng)建(jiàn)一(yī)个(gè)名为(wèi) qr_tracking 的(de)新(xīn) ROS 包(bāo),其(qí)中(zhōng)包(bāo)含(hán)所(suǒ)需(xū)的(de)依(yī)赖(lài)项(xiàng)(例(lì)如 rospy 和 std_msgs):

cd ~/catkin_ws/srccatkin_create_pkg qr_tracking rospy std_msgs


2.验证包创建。qr_tracking 目录应包含标准的 ROS 包结构,包括 CMakeLists.txt 和 package.xml 文件。


3. 更新依赖项:打开 package.xml 文件并确保包含以下依赖项:

  mycobot_280  0.3.0  The mycobot 280 package   ZhangLijun  ZhangLijun   BSD   https://github.com/elephantrobotics/mycobot_ros   catkin   roscpp  rospy  std_msgs  actionlib  mycobot_description  mycobot_communication   mycobot_communication  mycobot_description   roscpp  rospy  std_msgs  actionlib  joint_state_publisher  joint_state_publisher_gui  robot_state_publisher  xacro  joy  rviz  controller_manager  python-tk  mycobot_description  mycobot_communication          


4. 重新构建工作区以(yǐ)应(yīng)用(yòng) ROS 包(bāo)配(pèi)置(zhì)更(gèng)新(xīn):

cd ~/catkin_wscatkin_make

确(què)保(bǎo)在(zài) ROS 包(bāo)中(zhōng)正(zhèng)确(què)配(pèi)置了机械臂的 URDF 文件(jiàn),以(yǐ)准(zhǔn)确(què)显(xiǎn)示(shì)模(mó)型(xíng)。
将(jiāng) Python 文件(jiàn)导(dǎo)入(rù) ROS 包(bāo)
设(shè)置(zhì) scripts 目(mù)录(lù)
在(zài)您(nín)的(de) ROS 包(bāo)“qr_tracking”中(zhōng),创(chuàng)建(jiàn)一(yī)个(gè)名为(wèi)“scripts”的(de)文件夹来存储 Python 脚本。使用以下命令:
cd ~/catkin_ws/src/qr_trackingmkdir scripts

将你的 Python 文件(比如 'camera_detect.py'、'uvc_camera.py'、'marker_utils.py' 等)移动到这个 'scripts' 目录:

mv /path/to/camera_detect.py ~/catkin_ws/src/qr_tracking/scripts/mv /path/to/uvc_camera.py ~/catkin_ws/src/qr_tracking/scripts/mv /path/to/marker_utils.py ~/catkin_ws/src/qr_tracking/scripts/

修改 Python 文件以实现 ROS 兼容性
为确保 Python 脚本与 ROS 兼容,您需要进行一些调整,例如导入 ROS 库、初始化 ROS 节点以及定义消息发布者/订阅者。以 'camera_detect.py' 为例,以下是所需的主要修改:

1. 导(dǎo)入 ROS 库

在 Python 文件的顶部,添加 'rospy' 的导入和任何必要的 ROS 消息类型:
import rospy   from std_msgs.msg import String

2. 初始化 ROS 节点

在代码开始时初始化一个 ROS 节点:
rospy.init_node('camera_detection_node', anonymous=True)
3. 定(dìng)义(yì) Topic 发(fā)布(bù)者(zhě)/订(dìng)阅(yuè)者(zhě) 根(gēn)据(jù)要(yào)求(qiú),定(dìng)义(yì)发(fā)布(bù)者(zhě)或(huò)订(dìng)阅者。例如,要发布 QR 码检测结果:
pub = rospy.Publisher('qr_detection', String, queue_size=10)   rate = rospy.Rate(10)  # 10 Hz

然后,您可以设置一个函数来检测 QR 码并发布结果。例如:

# Assuming there is a function to detect QR codes   def detect_qr_code():       while not rospy.is_shutdown():           # Detection logic here           detection_result = "QR code detected"  # This is the detection result           rospy.loginfo(detection_result)           pub.publish(detection_result)           rate.sleep()
代码示例

下面是一个简化的代码片段,显(xiǎn)示了如何在 'camera_detect.py' 中发布 QR 码检测结果:
#!/usr/bin/env pythonimport rospyfrom std_msgs.msg import String def detect_qr_code():    pub = rospy.Publisher('qr_detection', String, queue_size=10)    rospy.init_node('camera_detection_node', anonymous=True)    rate = rospy.Rate(10)  # 10 Hz     while not rospy.is_shutdown():        # Replace with actual detection logic        detection_result = "QR code detected"  # Simulated detection result        rospy.loginfo(detection_result)        pub.publish(detection_result)        rate.sleep() if __name__ == '__main__':    try:        detect_qr_code()    except rospy.ROSInterruptException:        pass
> 注意:通过运行 'chmod +x ~/catkin_ws/src/qr_tracking/scripts/*.py' 确保 Python 文件是可执行的。 配置(zhì) 'CMakeLists.txt' 文件(jiàn)
CMake 配(pèi)置(zhì)概(gài)述(shù)
在(zài) ROS 中(zhōng),“CMakeLists.txt”文件(jiàn)是(shì)每(měi)个(gè)包(bāo)的(de)核(hé)心(xīn)配(pèi)置(zhì)文件,指定如何编译和安装包中的文件。它包括编译器选项、库依赖项和安装路径等配置详细信息。为了让 Python 脚本充当 ROS 节点,我们需要对此文件进行一些必要的调整。
修改 'CMakeLists.txt'
要使 Python 脚本在 ROS 中可执行,请执行以下步骤:

1. 添加 Catkin 构建依赖
确保 'CMakeLists.txt' 包含一个 'find_package' 语句来定位 'catkin' 和必要的 ROS 依赖项,例如 'rospy' 和 'std_msgs'。下面是一个示例:
cmake_minimum_required(VERSION 2.8.3)   project(mycobot_280)   add_compile_options(-std=c++11)    ## Find catkin and any catkin packages   find_package(catkin REQUIRED COMPONENTS     roscpp     rospy     std_msgs     actionlib     image_transport     cv_bridge   )
2. 安装 Python 脚本 使用 'catkin_install_python' 指定 Python 脚本的安装路径,并确保它们具有可执行权限。假设您的 Python 脚本位于 'scrip
catkin_install_python(PROGRAMS     scripts/follow_display.py     scripts/slider_control.py     scripts/teleop_keyboard.py     scripts/listen_real.py     scripts/listen_real_of_topic.py     scripts/simple_gui.py     scripts/follow_display_gripper.py     scripts/slider_control_gripper.py     scripts/listen_real_gripper.py     scripts/detect_stag.py     DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}   )
ts' 目录中,请将以下部分添加到 'CMakeLists.txt': 此命令将 Python 脚本安装到 ROS 包的 binary 目录下,并确保它们在编译后具有可执行权限。 3. 添加依赖项 在调用 'catkin_package()' 之前,请声明依赖项以确保 ROS 正确解析它们。例如:
catkin_package(     CATKIN_DEPENDS std_msgs actionlib   )
4. 完整示例 以下是 'CMakeLists.txt' 文件的示例配置:
cmake_minimum_required(VERSION 2.8.3)   project(mycobot_280)   add_compile_options(-std=c++11)    ## Find catkin and any catkin packages   find_package(catkin REQUIRED COMPONENTS     roscpp     rospy     std_msgs     actionlib     image_transport     cv_bridge   )    ## Declare a catkin package   catkin_package(     CATKIN_DEPENDS std_msgs actionlib   )    ## Include directories   include_directories(include ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})    ## Install Python scripts   catkin_install_python(PROGRAMS     scripts/follow_display.py     scripts/slider_control.py     scripts/teleop_keyboard.py     scripts/listen_real.py     scripts/listen_real_of_topic.py     scripts/simple_gui.py     scripts/follow_display_gripper.py     scripts/slider_control_gripper.py     scripts/listen_real_gripper.py     scripts/detect_stag.py     DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}   )    ## Install launch and config directories   install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}     PATTERN "setup_assistant.launch" EXCLUDE)   install(DIRECTORY config DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})    ## OpenCV requirements   find_package(OpenCV REQUIRED)   add_executable(opencv_camera src/opencv_camera)   target_link_libraries(opencv_camera ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})   add_executable(camera_display src/camera_display)   target_link_libraries(camera_display ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

通过这些修改,Python 脚本将成为 ROS 包的一部分,被赋予可执行权限,并且可以使用 ROS 工具(如 'rosrun')运行。
本节对于指导用户如何在 ROS 中编译、启(qǐ)动(dòng)和(hé)验(yàn)证(zhèng)项(xiàng)目(mù)的(de)功(gōng)能(néng)至(zhì)关重(zhòng)要(yào)。
6. 编(biān)译(yì)和(hé)运(yùn)行(xíng)
编(biān)译(yì)工(gōng)作(zuò)区(qū)
配(pèi)置(zhì) ROS 包(bāo)的(de)所(suǒ)有(yǒu)方(fāng)面(miàn)后(hòu),您(nín)需(xū)要(yào)编(biān)译工作区以生成和配置必要的资源。
1. 确保您位于工作区的根目录中:
cd ~/catkin_ws


2. 运行 'catkin_make' 编译工作区:

catkin_make

3.如果编译成功,您应该会看到类似于以下内容的输出:

[100%] Built target qr_tracking

启动 Node



编译完成后,您可以使用 rosrun 启(qǐ)动(dòng) QR 码(mǎ)跟(gēn)踪(zōng)节(jié)点(diǎn)。


1. 确保已加载工作区环境变量,然后启动仿真模型:

cd ~/catkin_ws   source devel/setup.bash   roslaunch mycobot_280 detect_marker_with_topic.launch port:=/dev/ttyUSB0 baud:=115200

911deb48-e820-11ef-9310-92fbcf53809c.png


2. 使(shǐ)用(yòng) 'rosrun' 启(qǐ)动(dòng) 'camera_detect.py' 脚(jiǎo)本(běn): rosrun qr_tracking camera_detect.py
您(nín)应(yīng)该(gāi)会(huì)看(kàn)到(dào)指(zhǐ)示(shì) ROS 节(jié)点(diǎn)已(yǐ)初(chū)始(shǐ)化的输出,并且它将开始发布 QR 码检测结果。
GitHub:
6.2.3 rivz Introduction and Use · GitBook