您当前的位置: 首页 >  Python

鱼香ROS

暂无认证

  • 0浏览

    0关注

    498博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

python程序间的方法调用

鱼香ROS 发布时间:2022-10-11 18:40:08 ,浏览量:0

python程序间的方法调用

鱼香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函数,拿到其返回值对吗?

类似于这种比较好的解决方案有

  1. 在color.py中将处理结果发布,follow.py中订阅
  2. 在color.py用queue将结果(其实最好是图片)存储起来,单独写一个函数用于获取结果。
4. keyizhang看着天空说:

第一点我有想过这个方法

第二点我不太清楚 😹

请问不可以直接在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喜滋滋的说:

@小鱼 好的那我试试看 谢谢小鱼😊

关注
打赏
1666092100
查看更多评论
立即登录/注册

微信扫码登录

0.0377s