Exemple #1
0
def main() -> None:

    global inflation

    parser = argparse.ArgumentParser(description=SCENE_SERVICE_NAME)
    parser.add_argument("-s", "--swagger", action="store_true", default=False)

    parser.add_argument(
        "-d",
        "--debug",
        help="Set logging level to debug.",
        action="store_const",
        const=logging.DEBUG,
        default=logging.DEBUG
        if env.get_bool("ARCOR2_SCENE_DEBUG") else logging.INFO,
    )

    parser.add_argument(
        "-i",
        "--inflation",
        help="How much to inflate collision objects (meters).",
        nargs="?",
        default=env.get_float("ARCOR2_SCENE_INFLATION", 0.01),
        type=float,
    )

    args = parser.parse_args()

    logger.setLevel(args.debug)
    inflation = args.inflation

    run_app(
        app,
        SCENE_SERVICE_NAME,
        version(),
        SCENE_PORT,
        [
            common.Pose,
            object_type.Box,
            object_type.Cylinder,
            object_type.Sphere,
            object_type.Mesh,
            scene.MeshFocusAction,
            scene.LineCheck,
            scene.LineCheckResult,
        ],
        args.swagger,
        api_version="0.5.0",
    )
Exemple #2
0
import asyncio
import time
from collections import deque
from typing import Any, Awaitable, Callable, Coroutine, Optional, TypeVar

import websockets
from aiologger.levels import LogLevel
from dataclasses_jsonschema import ValidationError
from websockets.server import WebSocketServerProtocol as WsClient

from arcor2 import env, json
from arcor2.data.events import Event
from arcor2.data.rpc.common import RPC
from arcor2.exceptions import Arcor2Exception

MAX_RPC_DURATION = env.get_float("ARCOR2_MAX_RPC_DURATION", 0.1)

RPCT = TypeVar("RPCT", bound=RPC)
ReqT = TypeVar("ReqT", bound=RPC.Request)
RespT = TypeVar("RespT", bound=RPC.Response)

RPC_CB = Callable[[ReqT, WsClient], Coroutine[Any, Any, Optional[RespT]]]
RPC_DICT_TYPE = dict[str, tuple[type[RPC], RPC_CB]]

EventT = TypeVar("EventT", bound=Event)
EVENT_DICT_TYPE = dict[str, tuple[type[EventT], Callable[[EventT, WsClient],
                                                         Coroutine[Any, Any,
                                                                   None]]]]


def custom_exception_handler(loop: asyncio.AbstractEventLoop,
Exemple #3
0
app = create_app(__name__)
logger = get_logger(__name__)
logger.propagate = False


class CollisionObject(NamedTuple):

    model: object_type.Models
    pose: common.Pose


collision_objects: dict[str, CollisionObject] = {}
started: bool = False
inflation = 0.01

delay_mean = env.get_float("ARCOR2_MOCK_SCENE_DELAY_MEAN", 0)
delay_sigma = env.get_float("ARCOR2_MOCK_SCENE_DELAY_SIGMA", 0)


def delay() -> None:
    """This is to simulate the long-starting Scene service.

    Could be useful to uncover specific kind of bugs.
    :return:
    """
    time.sleep(random.normalvariate(delay_mean, delay_sigma))


@app.route("/collisions/box", methods=["PUT"])
def put_box() -> RespT:
    """Add or update collision box.
Exemple #4
0
    get_robot_instance,
    scene_started,
    update_scene_object_pose,
)
from arcor2_arserver_data import rpc as srpc
from arcor2_arserver_data.events.common import ProcessState
from arcor2_arserver_data.events.robot import HandTeachingMode

RBT_CALIB = "RobotCalibration"

TaskDict = dict[str, asyncio.Task]

ROBOT_JOINTS_TASKS: TaskDict = {}
EEF_POSE_TASKS: TaskDict = {}

EVENT_PERIOD = env.get_float("ARCOR2_STREAMING_PERIOD", 0.1)

if EVENT_PERIOD <= 0:
    EVENT_PERIOD = 0.1


async def robot_joints_event(robot_inst: Robot) -> None:

    logger.info(f"Sending joints for {robot_inst.name} started.")
    while scene_started() and glob.ROBOT_JOINTS_REGISTERED_UIS[robot_inst.id]:

        start = time.monotonic()

        try:
            evt = RobotJoints(RobotJoints.Data(robot_inst.id, (await robot.get_robot_joints(robot_inst, None, True))))
        except Arcor2Exception as e:
Exemple #5
0
from arcor2.parameter_plugins.base import TypesDict


class ResourcesException(Arcor2Exception):
    def __init__(self,
                 message: str,
                 exceptions: Optional[list[Arcor2Exception]] = None):
        super().__init__(message)
        self.exceptions = exceptions


CUSTOM_OBJECT_TYPES_MODULE = "object_types"
R = TypeVar("R", bound="Resources")

_shutting_down = Event()
_streaming_period = env.get_float("ARCOR2_STREAMING_PERIOD", 0.1)


def stream_pose(robot_inst: Robot) -> None:

    arm_eef: dict[Optional[str], set[str]] = {}

    try:
        if isinstance(robot_inst, MultiArmRobot):
            arms = robot_inst.get_arm_ids()
            arm_eef.update(
                {arm: robot_inst.get_end_effectors_ids(arm)
                 for arm in arms})
        else:
            arm_eef.update({None: robot_inst.get_end_effectors_ids()})
Exemple #6
0
    listing: dict[str, IdDesc]
    ts: float

    def time_to_update(self) -> bool:
        return time.monotonic() - self.ts > _cache_timeout


"""
This module adds some caching capabilities to the aio version of project_service. It should be only used by ARServer.

Caching can be disabled by setting respective environment variable - this is useful for environments
where ARServer is not the only one who touches Project service.
"""

_cache_timeout = max(env.get_float("ARCOR2_ARSERVER_CACHE_TIMEOUT", 1.0), 0)
_cache_scenes = max(env.get_int("ARCOR2_ARSERVER_CACHE_SCENES", 32), 1)
_cache_projects = max(env.get_int("ARCOR2_ARSERVER_CACHE_PROJECTS", 64), 1)
_cache_object_types = max(
    env.get_int("ARCOR2_ARSERVER_CACHE_OBJECT_TYPES", 64), 1)

# here we need to know all the items
_scenes_list = CachedListing({}, 0)
_projects_list = CachedListing({}, 0)
_object_type_list = CachedListing({}, 0)

_scenes_list_lock = asyncio.Lock()
_projects_list_lock = asyncio.Lock()
_object_type_lock = asyncio.Lock()

# here we can forget least used items