首页 > 解决方案 > 简单的 ROS 脚本终止而不显示错误

问题描述

我在 ubuntu 18.04,turtlebot 2 上使用 ROS melodic。

我试图创建一个简单的 ROS 程序,它试图让机器人遵循指定的路径。我的凉亭世界是这样的:

在此处输入图像描述

任务是尝试使机器人遵循白色路径。方法是利用机器人的摄像头,利用其环境不断点击照片,并image.jpg以特定的速率将其保存为“ ”。这项工作由一个名为take_photo_mod.py. 现在,还有另一个程序“ goforward_mod.py”,它做了两件事:image.jpg使用 openCV 函数进行处理,并找出机器人应该与垂直方向移动的角度以与路径对齐。它的角速度是由这个角度控制的。如果角度(误差)为零,那么机器人只需以 0.2 个单位的速度(和零角速度)向前移动。如果存在一些误差,则使用该误差设置角速度,并将线速度设置为零。

openCV 方面工作完美,我已经对其进行了多次测试。但是,每当我通过终端运行整个程序(包括前进方面)时,程序都会立即结束,并且不会出错。我试图从代码中删除 openCV 方面,并将“错误”变量设为常数,然后我通过简单地使用 P 控制器来设置角速度。这段代码应该只是让turtlebot围绕z轴旋转,但同样,脚本只是终止而不显示任何错误。

#!/usr/bin/env python

import rospy
import cv2
import numpy as np
import math as m
from std_msgs.msg import String
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
from geometry_msgs.msg import Twist



class GoForward():

    def _init_(self):
        rospy.init_node('GoForward', anonymous=False)
        rospy.loginfo("To stop TurtleBot CTRL + C")
        rospy.on_shutdown(self.shutdown)
        self.cmd_vel = rospy.Publisher('cmd_vel_mux/input/navi', Twist, queue_size=10)
        r = rospy.Rate(10)
        move_cmd = Twist()
        turn_cmd= Twist()
        w=0
        vx=0
        
        while not rospy.is_shutdown():
            #frame=cv2.imread("image.jpg",1)
            #error=extract(frame)
            error=-0.47
            
            if(error==0):
                vx=0.2
                w=0
                move_cmd.linear.x = vx
                move_cmd.angular.z = -w
                self.cmd_vel.publish(move_cmd)
                                       
            else:
                vx=0
                kp=0.15
                w=kp*error
                turn_cmd.linear.x=vx
                turn_cmd.angular.z = -w
                self.cmd_vel.publish(turn_cmd)

                
      
            r.sleep()
        


    def shutdown(self):
        rospy.loginfo("Stop TurtleBot")
        self.cmd_vel.publish(Twist())
        rospy.sleep(1)

if __name__ == '__main__':
    try:
        GoForward()
    except:
        rospy.loginfo("GoForward node terminated.")

既不是“停止 TurtleBot CTRL + C”,也不是“GoForward 节点终止”。打印在终端上。终端只显示错误变量的值,然后程序结束。似乎GoForward()根本没有执行......这可能是什么原因?

标签: pythonros

解决方案


这里有几件事。虽然它不是 python ROS 节点的真正致命问题,但您可能应该通过rosrunor启动它roslaunch

话虽如此,您的错误实际上是python语法。你错过了一组_in _init_()。将其更改为def __init__(self):


推荐阅读