python - 简单的 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()
根本没有执行......这可能是什么原因?
解决方案
这里有几件事。虽然它不是 python ROS 节点的真正致命问题,但您可能应该通过rosrun
or启动它roslaunch
。
话虽如此,您的错误实际上是python语法。你错过了一组_
in _init_()
。将其更改为def __init__(self):
推荐阅读
- javascript - 伊斯坦布尔忽略如果不工作 - 服务器端测试
- momentjs - 如何从时刻js中的任何日期字段获取最大日期
- r - 如何复制在 CRAN 上执行的包裹检查时间?
- python - 带有 Swagger 的 Python Flask/Connexion,嵌套 JSON 样式对象的名称仅在运行时知道
- docker - 在 WSL2 上禁用 bridge-nf-call-iptables 和 bridge-nf-call-ip6tables
- c++ - 指向独立函数和友元函数的指针之间的区别
- mysql - 使用 MySQL/MariaDB 比较具有排序和分组行的两个表
- javascript - 与 puppeteer TypeError 开玩笑:无法在数字“11”上创建属性“_call”
- python - 文本文件到 CSV,文本上有特殊条件
- hyperledger-fabric - wsl2 ubuntu 20.04 平台上的 Minifabric 自定义超级账本结构网络