diff --git a/README.md b/README.md index e23ca905b25f4872cbfad31639dc6020df98123a..3bc7d120289286935a92d10e7e78a545df95adfc 100644 --- a/README.md +++ b/README.md @@ -30,4 +30,23 @@ conda activate py37 pip3 install -r requirements.txt ``` -每个文件开头注释处都指明了相关的用途 \ No newline at end of file +每个文件都指明了相关的用途 + +--- + +### quickcarla.py 用法 + +```python + python tutorials/quickcarla.py --port 2000 +``` + +其中`quickcarl.py` 为自己快速使用的carla debug工具,为出现一个pygame界面,点击相关键盘操作即可触发相关设置,例如: + +1. 按键盘`S`,即可把CARLA主视角切换到ego car顶端,再按一下即可取消 +2. 字母`D`,画框框 +3. 字母`P`,打印一些你想打印的东西,具体可以往里面填代码 +4. 字母`R`,在没有找到ego car的时候,检查一下rolename 重新再找一下,一般CARLA自身的ego car的rolename为`hero`,ROS那边则为`ego_vehicle` + +测试截图: + +![](docs/examples.png) diff --git a/docs/examples.png b/docs/examples.png new file mode 100644 index 0000000000000000000000000000000000000000..e6120d2ca1ca36bcbba4a8ec7907c908e571d27e Binary files /dev/null and b/docs/examples.png differ diff --git a/tutorial/quickcarla.py b/tutorial/quickcarla.py new file mode 100644 index 0000000000000000000000000000000000000000..a564525caee3ccedf94e5838bb885438d24d375e --- /dev/null +++ b/tutorial/quickcarla.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python + + +from __future__ import print_function + +# ============================================================================== +# -- find carla module --------------------------------------------------------- +# ============================================================================== + +import glob +import os +import sys +from tkinter import E + +try: + # print(os.path.abspath(__file__)) + # print(os.path.dirname(os.path.abspath(__file__))) + sys.path.append(glob.glob(os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + '/carla/dist/carla-*%d.%d-%s.egg' % ( + sys.version_info.major, + sys.version_info.minor, + 'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0]) +except IndexError: + pass +# ============================================================================== +# -- imports ------------------------------------------------------------------- +# ============================================================================== + +import carla +import argparse + +description = "Benchmark CARLA performance in your platform for different towns and sensor or traffic configurations.\n" + +parser = argparse.ArgumentParser(description=description) +parser.add_argument('--host', default='localhost', help='IP of the host server (default: localhost)') +parser.add_argument('--port', default=2000, help='TCP port to listen to (default: 2000)') +parser.add_argument('--rolename', default='hero', help='actor role name (default: "hero")') +args = parser.parse_args() + +# ============================================================================== +# -- user imports -------------------------------------------------------------- +# ============================================================================== + +import pygame as pg +from pygame.locals import * # import keyboard +from numpy import random +import numpy as np + +from utils.color import bcolors + +class Status: + def __init__(self, args) -> None: + self.spectator_status_set = False + self.draw_set = False + self.draw_all = False + self.time_draw = 7 + self.client = carla.Client(args.host, args.port) + self.client.set_timeout(5.0) + # retrieve the world that currently running + self.world = self.client.get_world() + self.vehicles_list = self.world.get_actors().filter('vehicle.*') + self.find_ego_car() + + def find_ego_car(self) -> None: + # find all things in world + hero_vehicles = [actor for actor in self.world.get_actors() + if 'vehicle' in actor.type_id and actor.attributes['role_name'] == args.rolename] + self.ego_vehicle = None + if len(hero_vehicles) > 0: + self.ego_vehicle = random.choice(hero_vehicles) + self.hero_transform = self.ego_vehicle.get_transform() + print(f"{bcolors.OKGREEN}Select from length:{len(hero_vehicles)}, find ego car id:{self.ego_vehicle.id}{bcolors.ENDC}") + else: + print(bcolors.FAIL + '!! CANNOT find the ego car, please check the rolename' + bcolors.ENDC) + + def update(self): + if self.ego_vehicle: + etransform = self.ego_vehicle.get_transform() + ebb = self.ego_vehicle.bounding_box + ebb.location+=etransform.location + if self.spectator_status_set: + spectator = self.world.get_spectator() + spectator.set_transform(carla.Transform(etransform.location + carla.Location(z=50), + carla.Rotation(pitch=-90))) + if self.draw_set: + if self.draw_all: + for actor in self.vehicles_list: + vel = actor.get_velocity() + atran = actor.get_transform() + bb = actor.bounding_box + bb.location += atran.location + for t in range(0,self.time_draw,2): + bb.location += vel*t + self.world.debug.draw_box(bb, atran.rotation, 0.01, carla.Color(255,255,0,0), self.time_draw/5) + # return + else: + self.world.debug.draw_box(ebb, etransform.rotation, 0.05, carla.Color(255,0,0,125),1) + + for event in pg.event.get(): + if event.type == pg.KEYDOWN: + if event.key == pg.K_s: + self.spectator_status_set = not self.spectator_status_set + print("Setting spectator to car: ", self.spectator_status_set) + elif event.key == pg.K_p: + # print info you like + print('position:',etransform.location,'bounding box:', ebb) # ,'rotation:',etransform.rotation + elif event.key == pg.K_d: + # draw info + self.draw_set = not self.draw_set + print("Setting drawing the bounding box:", self.draw_set) + elif event.key == pg.K_a: + # draw info + self.draw_all = not self.draw_all + print(f"Setting drawing all vehicle:{self.draw_all}, pls press keyboard '{bcolors.OKCYAN}d{bcolors.ENDC}' for drawing") + elif event.key == pg.K_r: + print(f"{bcolors.OKCYAN}finding the ego car again... {bcolors.ENDC}'") + self.find_ego_car() + +def main(args): + pg.init() + screen = pg.display.set_mode((150, 150)) + # img = pg.image.load(args.img) + my_status = Status(args) + try: + while True: + my_status.update() + # screen.blit(img, (1, 1)) + pg.display.flip() + except Exception as e: + print(bcolors.FAIL + e + bcolors.ENDC) + except KeyboardInterrupt: + print('\nCancelled by user. Bye!') + +if __name__ == '__main__': + main(args) \ No newline at end of file diff --git a/tutorial/utils/__init__.py b/tutorial/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tutorial/utils/color.py b/tutorial/utils/color.py new file mode 100644 index 0000000000000000000000000000000000000000..61345135e6413e10f48dd31dadf7af15d0b0082e --- /dev/null +++ b/tutorial/utils/color.py @@ -0,0 +1,10 @@ +class bcolors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKCYAN = '\033[96m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' \ No newline at end of file