ROS交流群
ROS Group
产品服务
Product Service
开源代码库
Github
官网
Official website
技术交流
Technological exchanges
激光雷达
LIDAR
ROS教程
ROS Tourials
深度学习
Deep Learning
机器视觉
Computer Vision

使用python代码启动launch文件



  • 在开发中我们经常会遇到使用python代码启动launch文件这样的问题。一般的做法是使用subprocess调用roslaunch。但是这种方法使用起来并不方便。要涉及到自己去控制进程的状态。由于roslaunch实际上是用python实现的。使用python调用launch文件实际上有更简单的方法。

    import roslaunch
    
    uuid = roslaunch.rlutil.get_or_generate_uuid(None, False)
    roslaunch.configure_logging(uuid)
    tracking_launch = roslaunch.parent.ROSLaunchParent(
        uuid, ["/home/xiaoqiang/Documents/ros/src/xiaoqiang_track/launch/track_body.launch"])
    tracking_launch.start()
    

    这样就成功启动了一个launch文件。把uuid后面的路径换成自己的launch文件路径就可以了。

    而且我们可以通过roslaunch直接关闭launch文件启动的节点。

    tracking_launch.shutdown() # tracking_launch 即是上面通过roslaunch获取到的变量
    

    这样使用起来就很方便了。



  • f2fc16e0-f0de-4eec-bc7f-c09762cf99c2-image.png 这个程序运行后就被退出了(killing on exit),应该怎么做?



  • @几何木偶 你的代码是什么样的



  • f31258e7-3a5b-425d-92ca-53b28be31ffc-image.png



  • @几何木偶 因为没有join方法,所以程序出错后退出了。tracking_launch.start()是不阻塞的,需要自己阻塞主线程。比如

    import roslaunch
    import rospy
    import time
    
    uuid = roslaunch.rlutil.get_or_generate_uuid(None, False)
    roslaunch.configure_logging(uuid)
    tracking_launch = roslaunch.parent.ROSLaunchParent(
        uuid, ["/home/xiaoqiang/Documents/ros/src/xiaoqiang_track/launch/track_body.launch"])
    tracking_launch.start()
    while not rospy.is_shutdown():
        time.sleep(1)
    


  • 586d74d7-e403-4265-a4ef-969d5b16ebee-image.png
    这样当我使用ctrl+c结束时,它没有跳出循环,变成死循环了。有办法吗?



  • @几何木偶 你的代码是什么样的,像我之前的例子那样写应该会正常退出。