def on_enter(self, userdata):
        # When entering this state, we send the action goal once to let the robot start its work.

        # As documented above, we get the specification of which dishwasher to use as input key.
        # This enables a previous state to make this decision during runtime and provide the ID as its own output key.

        # Create the goal.
        tweet = SendTweetGoal() 
        tweet.text = userdata.tweet_text
        
        if len(userdata.tweet_text) > 140:
            tweet.text = '#LAMoR15 #ECMR15 I just told a too looong joke, stupid tweet length!'

        tweet.with_photo = True
        img = cv2.imread(userdata.picture_path)

        bridge = CvBridge()
        image_message = bridge.cv2_to_imgmsg(img, encoding="bgr8")
        tweet.photo = image_message

        try:
            self._client.send_goal(self._topic, tweet)
        except Exception as e:
                # Since a state failure not necessarily causes a behavior failure, it is recommended to only print warnings, not errors.
                # Using a linebreak before appending the error log enables the operator to collapse details in the GUI.
            Logger.logwarn('Failed to send the TweetPictureState command:\n%s' % str(e))
            self._error = True
    def on_enter(self, userdata):
        # When entering this state, we send the action goal once to let the robot start its work.

        # As documented above, we get the specification of which dishwasher to use as input key.
        # This enables a previous state to make this decision during runtime and provide the ID as its own output key.

        # Create the goal.
        tweet = SendTweetGoal()
        tweet.text = userdata.tweet_text

        if len(userdata.tweet_text) > 140:
            tweet.text = '#LAMoR15 #ECMR15 I just told a too looong joke, stupid tweet length!'

        tweet.with_photo = True
        img = cv2.imread(userdata.picture_path)

        bridge = CvBridge()
        image_message = bridge.cv2_to_imgmsg(img, encoding="bgr8")
        tweet.photo = image_message

        try:
            self._client.send_goal(self._topic, tweet)
        except Exception as e:
            # Since a state failure not necessarily causes a behavior failure, it is recommended to only print warnings, not errors.
            # Using a linebreak before appending the error log enables the operator to collapse details in the GUI.
            Logger.logwarn(
                'Failed to send the TweetPictureState command:\n%s' % str(e))
            self._error = True
    def execute(self, goal):

        self.image = None
        self.sub = rospy.Subscriber(goal.topic,
                                    Image,
                                    self.image_callback,
                                    queue_size=1)

        # the polling is ugly, but it's hard do do things in a ros-time friendly way otherwise
        while self.image == None and not rospy.is_shutdown(
        ) and not self.server.is_preempt_requested():
            rospy.sleep(0.5)

        result = GrabImageThenTweetResult(success=False)

        if rospy.is_shutdown() or self.server.is_preempt_requested():
            self.server.set_preempted(result)
            return

        # if we got this far we have an image
        tweet = SendTweetGoal(text=goal.text,
                              force=goal.force,
                              with_photo=True,
                              photo=self.image)

        self.tweet_client.send_goal(tweet)

        while not self.tweet_client.wait_for_result(
                rospy.Duration(0.5)) and not rospy.is_shutdown(
                ) and not self.server.is_preempt_requested():
            pass

        if rospy.is_shutdown() or self.server.is_preempt_requested():
            self.server.set_preempted(result)
        else:
            result.success = True
            self.server.set_succeeded(result)