Bagaimana cara menjalankan skrip python dalam paket ros?

Referensi. Memasang skrip dan modul Python

Struktur paket

├── my_pkg
│   ├── setup.py
│   ├── scripts
│   │   └── executable_script
    └── src
        └── my_pkg
            ├── __init__.py
            └── my_module.py
  • Harus ada setup.py
  • Skrip yang dapat dieksekusi harus berada di bawah my_pkg/scripts atau my_pkg/nodes
  • Modul yang dapat diimpor harus ditempatkan di bawah src/my_pkg
  • Harus ada __init__.py di bawah src/my_pkg

mempersiapkan. 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=['my_pkg'],
    package_dir={'': 'src'},
    requires=['std_msgs', 'rospy', 'rosbag', 'tf']
)

setup(**setup_args)
_

Jangan pernah menjalankan

## ! 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=['my_pkg'],
    package_dir={'': 'src'},
    requires=['std_msgs', 'rospy', 'rosbag', 'tf']
)

setup(**setup_args)
_0. Hanya gunakan catkin untuk memasang modul

Menyusun

Lari

catkin_make

Kemudian

source catkin_ws/devel/setup.bash
_

Sekarang Anda harus dapat mengimpor kode di

## ! 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=['my_pkg'],
    package_dir={'': 'src'},
    requires=['std_msgs', 'rospy', 'rosbag', 'tf']
)

setup(**setup_args)
1 dari lokasi lain di komputer Anda

Untuk penggunaan ROSPY yang lebih lanjut, disarankan untuk memiliki pengaturan yang tepat dalam Paket Catkin Anda untuk membangun dan mengkompilasi kode python Anda dengan pustaka, pesan, layanan, dan sumber daya apa pun yang mungkin Anda miliki dalam paket Anda

Prasyarat

Bagian ini mengharuskan catkin_ws diinisialisasi dan paket turtlebot_dabit dibuat
Silakan klik di sini untuk mempelajari cara menginisialisasi ruang kerja catkin

Untuk tutorial ini, kita akan menggunakan paket catkin turtlebot_dabit yang kita buat. Untuk mengaktifkan pembuatan file ROSPY dalam paket kami, kami perlu mengedit file CMakeLists. txt dan paket. xml untuk membangun dengan dependensi kami

# clone repo
$ git clone https://[email protected]/reinka/blog.git 
# change to the directory containing the setup script
$ cd blog/start_ros_with_py
# execute setup script
$ . setup.sh
_

$ cd /notebooks/workspace
$ catkin_make
$ . devel/setup.bash

/opt/ros/kinetic/bin/rosrun tutorial talker.py
_

import os
import signal
from subprocess import Popen
import time


def run(cmd, stdout, stderr):
    """Run a given `cmd` in a subprocess, write logs to stdout / stderr.

    Parameters
    ----------
    cmd : list of str
        Command to run.
    stdout : str or subprocess.PIPE object
        Destination of stdout output.
    stderr : str or subprocess.PIPE object
        Destination of stderr output.

    Returns
    -------
    A subprocess.Popen instance.
    """
    return Popen(cmd, stdout=stdout, stderr=stderr, shell=False,
                 preexec_fn=os.setsid)


def get_stdout_stderr(typ, datetime, dir):
    """Create stdout / stderr file paths."""
    out = '%s_%s_stdout.log' % (datetime, typ)
    err = '%s_%s_stderr.log' % (datetime, typ)
    return os.path.join(dir, out), os.path.join(dir, err)


def check_files_exist(files):
    """Check if given list of files exists.

    Parameters
    ----------
    files : list of str
        Files to check for existence.

    Returns
    -------
    None if all files exist. Else raises a ValueError.
    """
    errors = []
    for f in files:
        if not os.path.exists(f):
            errors.append(f)
    if errors:
        raise ValueError('File does not exist: %s' % errors)


def start_process(cmd, typ, start_time, dpath_logs):
    """Start a subprocess with the given command `cmd`.

    Parameters
    ----------
    cmd : list of str
        Command to run.
    typ : str
        Type of subprocess. This will be included in the logs' file names.
    start_time : str
        Datetime string, will be included in the logs' file names as well as
        the resulting bag's name.
    dpath_logs :
        Path to log direcotry.

    Returns
    -------
    A subprocess.Popen instance.
    """
    print('Starting', typ.upper())
    stdout, stderr = get_stdout_stderr(typ, start_time, dpath_logs)
    with open(stdout, 'wb') as out, open(stderr, 'wb') as err:
        return run(cmd, stdout=out, stderr=err)


def main(args):
    dpath_logs = args.dpath_logs
    script_node = args.script_node
    check_files_exist([script_node, dpath_logs])

    start_time = time.strftime('%Y%m%d_%H%M%S')

    p_ros_core = start_process(['/opt/ros/kinetic/bin/roscore'],
                                'ros', start_time, dpath_logs)

    session_talker_node = start_process(['/bin/bash', script_node],
                               'talker_node', start_time,
                               dpath_logs)

    # print pids in case something goes wrong
    print('PGID ROS: ', os.getpgid(p_ros_core.pid))
    print('PGID TALKER NODE: ', os.getpgid(session_talker_node.pid))


    time.sleep(5)
    print('Killing ROS and talker node.')
    os.killpg(os.getpgid(p_ros_core.pid), signal.SIGTERM)
    os.killpg(os.getpgid(session_talker_node.pid), signal.SIGTERM)


if __name__ == '__main__':
    """Start ROS and the talker node each as a subprocess.

    Examples
    --------

    python  start_ros.py --script_node /notebooks/workspace/talker.sh \
    -l /notebooks/workspace/src/scripts
    """
    import argparse

    parser = argparse.ArgumentParser()
    parser.add_argument('--script_node', type=str,
                        default='/notebooks/workspace/talker.sh')
    parser.add_argument('--dpath_logs', '-l', type=str,
                        default='/notebooks/workspace/src/scripts')
    args = parser.parse_args()
    main(args)
_

root@d70ea6b805fb:/notebooks/workspace $ python start_ros.py 
Starting ROS
Starting CM
PGID ROS:  674
PGID CM:  675
Killing ROS and talker node.

root@d70ea6b805fb:/notebooks/workspace $ ll src/scripts/
total 24
drwxrwxr-x 2 1001 1002 4096 Apr  6 21:48 ./
drwxr-xr-x 4 root root 4096 Apr  6 20:32 ../
-rw-r--r-- 1 root root    0 Apr  6 21:48 20190406_214805_ros_stderr.log
-rw-r--r-- 1 root root  877 Apr  6 21:48 20190406_214805_ros_stdout.log
-rw-r--r-- 1 root root 1348 Apr  6 21:48 20190406_214805_talker_node_stderr.log
-rw-r--r-- 1 root root 1793 Apr  6 21:48 20190406_214805_talker_node_stdout.log
-rwxrwxr-x 1 1001 1002  652 Apr  6 20:18 talker.py*

root@d70ea6b805fb:/notebooks/workspace# tail -n 3 src/scripts/20190406_214805_talker_node_stdout.log
[INFO] [1554587290.251599]: hello world [-2.2965705]
[INFO] [1554587290.351432]: hello world [1.0656843]
[INFO] [1554587290.451944]: hello world [-0.06105766]

Bagaimana cara menjalankan kode Python di ROS?

TL;DR
Sumber pengaturan ROS. pesta
(Opsional) tambahkan penyiapan ROS. pesta ke. bashrc
Buat direktori catkin_ws
Gunakan catkin_make untuk menginisialisasi
Sumber pengaturan. pesta ruang kerja catkin
(Opsional) tambahkan pengaturan ruang kerja catkin. pesta ke. bashrc
Periksa kembali apa yang ada di ROS_PACKAGE_PATH

Bagaimana cara mengimpor file Python ke ROS?

[ROS] Cara Mengimpor Modul Python Dari Paket Lain .
Buat paket yang berisi modul Python
Instal modul Python ini di lingkungan ROS Anda
Di paket lain, impor modul yang dibuat sebelumnya dan gunakan

Bagaimana cara menginstal modul Python di ROS?

Praktik ROS standar adalah menempatkan modul Python di bawah subdirektori src/your_package, menjadikan nama modul tingkat atas sama dengan paket Anda. Python mengharuskan direktori itu memiliki __init__. file py juga. Dengan rosbuild, dimungkinkan untuk menempatkan modul Python langsung di dalam src/

Bagaimana cara menjalankan a. kode py?

Cara paling dasar dan mudah untuk menjalankan skrip Python adalah dengan menggunakan perintah python. Anda perlu membuka baris perintah dan mengetik kata python diikuti dengan jalur ke file skrip Anda seperti ini. skrip_pertama python. py Halo Dunia. Kemudian Anda menekan tombol ENTER dari keyboard, dan hanya itu.