鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    python程序间的方法调用

    已定时 已固定 已锁定 已移动 已解决
    综合问题
    2
    6
    613
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • K
      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 <= 10 and s >= 43 and v >= 46:
                          return 1
                      elif h >= 156 and h <= 180 and s >= 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程序里面获得参数传过去

      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @keyizhang
        最后由 编辑

        @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()
        

        新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

        K 1 条回复 最后回复 回复 引用 0
        • 小鱼小
          小鱼 技术大佬 @keyizhang
          最后由 小鱼 编辑

          @keyizhang color是一个py文件吧,不是函数。可以用文件名,代码的形式描述。

          代码块语法是前后各三个`,包裹的。
          比如下面这样

          code_text
          

          没理解(猜)错。你想在follow.py中调用color.py中的callback函数,拿到其返回值对吗?

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

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

          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

          K 1 条回复 最后回复 回复 引用 0
          • K
            keyizhang
            最后由 编辑

            第一点我有想过这个方法

            第二点我不太清楚 😹

            请问不可以直接在follow里面调用 然后把结果return回去吗😨

            1 条回复 最后回复 回复 引用 0
            • K
              keyizhang @小鱼
              最后由 编辑

              @小鱼我觉得如果可以直接返回好像更简单一些

              小鱼小 1 条回复 最后回复 回复 引用 0
              • 小鱼小
                小鱼 技术大佬 @keyizhang
                最后由 编辑

                @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()
                

                新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                K 1 条回复 最后回复 回复 引用 0
                • K
                  keyizhang @小鱼
                  最后由 编辑

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

                  1 条回复 最后回复 回复 引用 0
                  • 小鱼小 小鱼 将这个主题转为问答主题,在
                  • 小鱼小 小鱼 将这个主题标记为已解决,在
                  • 第一个帖子
                    最后一个帖子
                  皖ICP备16016415号-7
                  Powered by NodeBB | 鱼香ROS