Pesan impor ros python dari paket lain

Kami dapat membungkus kode kami dalam modul Python di dalam ruang kerja catkin kami untuk dibagikan dengan paket lain di lingkungan ROS kami. Mengapa kita melakukan ini? . Ini secara dramatis dapat mengurangi pengulangan kode di seluruh paket ROS Anda

Bagaimana caranya

Saya akan mulai dengan ruang kerja catkin yang baru, tetapi jangan ragu untuk beradaptasi dengan lingkungan Anda, penamaan paket, dan konvensi penamaan file

mkdir -p catkin_ws/src
cd catkin_ws
catkin_make

cd src
catkin_create_pkg my_ros_package rospy

cd my_ros_package
touch setup.py
mkdir -p src/my_ros_package
touch src/my_ros_package/__init__.py
touch src/my_ros_package/my_python_functions.py

Jika Anda menambahkan modul Python ke paket yang sudah ada, Anda hanya perlu membuat pengaturannya. py, __init__. py, fungsi_python_saya. py dan sub-direktori dengan direktori src paket ROS

Kami mencoba untuk berakhir dengan struktur folder yang terlihat seperti ini

Pesan impor ros python dari paket lain

Gambar 1. Struktur Folder Paket

Mari tambahkan fungsi tester sederhana

nano src/my_ros_package/my_python_functions.py
_

Kami hanya akan menggunakan fungsi sederhana yang menjumlahkan dua angka dan mengembalikan hasilnya

#!/usr/bin/env python3

def adder(x, y):
    out = x + y
    return out

Sekarang kita perlu menambahkan beberapa kode pelat ketel ke penyiapan. py

nano setup.py

Pastikan string di dalam daftar paket cocok dengan nama sub-direktori di dalam direktori src paket ROS Anda (beberapa entri diperbolehkan). Pastikan juga bahwa isi kamus package_dir cocok dengan jalur di mana modul Anda berada di dalam paket ROS

from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup
a = generate_distutils_setup(
    packages=['my_ros_package'],
    package_dir={'': 'src'}
    )
setup(**a)
_

Batalkan komentar pada catkin_python_setup() pada baris 21 dari boilerplate CMakeLists. txt di dalam direktori my_ros_package

## 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()

Untuk membuat modul tersedia, kita sekarang perlu membuat lingkungan catkin kita

cd ..
catkin_make
_

Kami dapat menguji ketersediaan modul Python langsung di baris perintah, tetapi penggunaannya akan serupa jika Anda memanggil modul di node lain

Saya menggunakan paket darknet_ros_3d dan mendapatkan koordinat 3D yang dipublikasikan. Sekarang saya perlu berlangganan koordinat ini ke file Python (main.py) dari paket lain bernama kth-ros-pkg/yumi_demos. Kode main.py_ diberikan seperti di bawah ini

import sys
import copy
import rospy
import moveit_commander
import yumi_moveit_utils as yumi
import moveit_msgs.msg
import geometry_msgs.msg
from std_srvs.srv import Empty




def close_grippers(arm):
    """Closes the grippers.
    Closes the grippers with an effort of 15 and then relaxes the effort to 0.
    :param arm: The side to be closed (moveit_utils LEFT or RIGHT)
    :type arm: int
    :returns: Nothing
    :rtype: None
    """
    yumi.gripper_effort(arm, 15.0)
    yumi.gripper_effort(arm, 0.0)

def open_grippers(arm):
    """Opens the grippers.
    Opens the grippers with an effort of -15 and then relaxes the effort to 0.
    :param arm: The side to be opened (moveit_utils LEFT or RIGHT)
    :type arm: int
    :returns: Nothing
    :rtype: None
    """
    yumi.gripper_effort(arm, -15.0)
    yumi.gripper_effort(arm, 0.0)



def move_and_grasp(arm, pose_ee, grip_effort):
    try:
        yumi.traverse_path([pose_ee], arm, 10)
    except Exception:
        if (arm == yumi.LEFT):
            yumi.plan_and_move(yumi.group_l, yumi.create_pose_euler(pose_ee[0], pose_ee[1], pose_ee[2], pose_ee[3], pose_ee[4], pose_ee[5]))
        elif (arm == yumi.RIGHT):
            yumi.plan_and_move(yumi.group_r, yumi.create_pose_euler(pose_ee[0], pose_ee[1], pose_ee[2], pose_ee[3], pose_ee[4], pose_ee[5]))

    if (grip_effort <= 20 and grip_effort >= -20):
        yumi.gripper_effort(arm, grip_effort)
    else:
        print("The gripper effort values should be in the range [-20, 20]")




def run():
    """Starts the node
    Runs to start the node and initialize everthing. Runs forever via Spin()
    :returns: Nothing
    :rtype: None
    """

    rospy.init_node('yumi_moveit_demo')

    #Start by connecting to ROS and MoveIt!
    yumi.init_Moveit()


    # Print current joint angles
    yumi.print_current_joint_states(yumi.RIGHT)
    yumi.print_current_joint_states(yumi.LEFT)

    # Reset YuMi joints to "home" position
    yumi.reset_pose()


    # Drive YuMi end effectors to a desired position (pose_ee), and perform a grasping task with a given effort (grip_effort)
    # Gripper effort: opening if negative, closing if positive, static if zero
    pose_ee = [0.3, 0.15, 0.2, 0.0, 3.14, 3.14]
    grip_effort = -10.0
    move_and_grasp(yumi.LEFT, pose_ee, grip_effort)

    pose_ee = [0.3, -0.15, 0.2, 0.0, 3.14, 3.14]
    grip_effort = -10.0
    move_and_grasp(yumi.RIGHT, pose_ee, grip_effort)

    rospy.spin()




if __name__ == '__main__':
    try:
        run()

        print "####################################     Program finished     ####################################"
    except rospy.ROSInterruptException:
        pass 

Dan saya mendapatkan koordinat dari paket darknet dalam format berikut

header:
  stamp:
    sec: 1593723845
    nanosec: 430724839
  frame_id: camera_link
bounding_boxes:
- object_name: person
  probability: 0.7609682679176331
  xmin: 0.4506256580352783
  ymin: -0.3164764642715454
  xmax: 0.7936256527900696
  ymax: 0.11368180811405182
  zmin: -0.25958430767059326
  zmax: 0.10506562888622284
_

Bagaimana cara mengimpor modul Python dari berbagai paket ROS?

Untuk mengimpor modul, Anda hanya perlu memasukkan nama paket ROS tempat modul dipasang, diikuti dengan nama file. That's it!

Bagaimana cara menambahkan pesan khusus ke Ros?

Buat ruang kerja catkin dan paket ROS. TL;DR. .
Buat kode node ROS dari awal (C++ dan Python) TL;DR. .
Jalankan, luncurkan, dan interogasi node. TL;DR. .
Kode untuk berputar pada frekuensi tertentu (C++ dan Python).
Kode untuk penerbit dan pelanggan sederhana (C++ dan Python).
Tentukan dan gunakan jenis pesan khusus (C++ dan Python)

Bagaimana Anda mengimpor a. py di file lain. file .py?

cara terbaik untuk mengimpor. py adalah melalui __init__. py. .
Cukup impor file tanpa. ekstensi py
Folder dapat ditandai sebagai paket, dengan menambahkan __init__ kosong. file py
Anda dapat menggunakan fungsi __import__, yang menggunakan nama modul (tanpa ekstensi) sebagai ekstensi string

Bisakah Anda mengimpor file Python dari direktori lain?

Secara default, Anda tidak bisa . Saat mengimpor file, Python hanya mencari direktori tempat skrip titik masuk dijalankan dan sys.