鱼香ROS介绍:
鱼香ROS是由机器人爱好者共同组成的社区,欢迎一起参与机器人技术交流。 进群加V:fishros2048
文章信息:
标题:python程序间的方法调用 原文地址:https://fishros.org.cn/forum/topic/36 关键词: 参与者: keyizhang,小鱼, 版权声明: 文章中所有知识产权归鱼香ROS及原作者所有。
1. keyizhang抖着腿说:我想要在follow函数中调用color函数的callback方法,并准确接收其返回值
以下是color程序
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
import rospy
import time
import cv2
from std_msgs.msg import String
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import numpy as np
from sensor_msgs.msg import CompressedImage
from geometry_msgs.msg import Twist, Vector3
#图像处理器
class image_converter:
def __init__(self):
# 定义处理前图像订阅器
self.image_sub = rospy.Subscriber("/camera/image_raw",Image,self.callback)
# 定义处理后图像发布器
self.image_pub = rospy.Publisher("/image_topic_2",Image, queue_size =3)
# 定义原图和opencv图转换器
self.bridge = CvBridge()
def callback(self,data): **想要调用的callback函数**
# 将原图转为opencv图
try:
frame = self.bridge.imgmsg_to_cv2(data, "bgr8")
except CvBridgeError as e:
print(e)
#HSV空间 """
hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
# print(hsv[100,100][2])
for i in range(26):
for j in range(26):
h = hsv[i,j][0]
s = hsv[i,j][1]
v = hsv[i,j][2]
if h >= 0 and h = 43 and v >= 46:
return 1
elif h >= 156 and h = 43 and v >= 46:
return 1
else:
return 0
以下是follow程序
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import rospy
import time
from geometry_msgs.msg import Twist
from sensor_msgs.msg import LaserScan
from color import image_converter
def scan_callback(msg):
cmd_vel_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
scan_sub = rospy.Subscriber('scan', LaserScan, scan_callback)
rospy.init_node('follow_the_wall')
command = Twist()
rate = rospy.Rate(10)
while not rospy.is_shutdown():
find = image_converter.callback() **想在这调用**
if find == 1:
print("找到目标了.")
else:
print("没发现目标.")
为了简洁follow函数里面很多用于控制机器人运动的变量已经删去 我感觉问题的关键应该在于怎么在follow程序里面获得参数传过去
2. 小鱼掰着手指头说:@keyizhang callback
函数不建议你直接调用,是提供给ROS做回调函数。第二点的意思新建一个队列,把数据放到队列。用的时候取出来做处理。
queue使用很简单:
from queue import Queue
data_queue = Queue()
def callback():
data_queue.put(data)
def get_data():
global data_queue
return data_queue.get()
3. 小鱼笑嘻嘻的说:
@keyizhang color是一个py文件吧,不是函数。可以用文件名,代码的形式描述。
代码块语法是前后各三个`,包裹的。 比如下面这样
code_text
没理解(猜)错。你想在follow.py中调用color.py中的callback函数,拿到其返回值对吗?
类似于这种比较好的解决方案有
- 在color.py中将处理结果发布,follow.py中订阅
- 在color.py用queue将结果(其实最好是图片)存储起来,单独写一个函数用于获取结果。
第一点我有想过这个方法
第二点我不太清楚 😹
请问不可以直接在follow里面调用 然后把结果return回去吗😨
5. keyizhang看着天空说:@小鱼我觉得如果可以直接返回好像更简单一些
6. 小鱼掰着手指头说:@keyizhang callback
函数不建议你直接调用,是提供给ROS做回调函数。第二点的意思新建一个队列,把数据放到队列。用的时候取出来做处理。
queue使用很简单:
from queue import Queue
data_queue = Queue()
def callback():
data_queue.put(data)
def get_data():
global data_queue
return data_queue.get()
7. keyizhang喜滋滋的说:
@小鱼 好的那我试试看 谢谢小鱼😊