[シミュレーション] データ収集に関する Carla の簡単なチュートリアル (完全なコード付き)

収集プロセスを視覚的に表示し、テキストを入力します。

参考文献と序文

シミュレーション グループがこの種のタスク ( carla でデータを収集してトレーニングを実行するなど) に対して大きな需要があることがわかったので、すぐにタスクを作成します。まず、データの収集について明確に考える必要があります。

  1. 収集されるデータと必要なデータ形式

  2. データ間のタイムスタンプは同期する必要があります。これは、carla の時間設定をある程度認識していることを意味します。

    【シミュレーション】カルラの世界の時間[2]

  3. 一般に、データを収集する際、事故がなければ車は自動運転になりがちですが、場合によっては信号無視やスピードの出し方などを考えることがあります。これは、交通管理者について一定の理解があることを意味します。

    [シミュレーション] カルラの交通管理者 [3]

CARLAさんのコラムには使い方がしっかり書いてあると思っていたのですが…みんなが最初にやってしまう傾向があり、グループ内で以下のような問題が何度か発生しました。

  1. センサー間の同期を確保する方法 → 同期モードの設定
  2. 私の CARLA が遅れているように見えるのはなぜですか → GPU が他の CARLA に追いつくことができるかどうかを確認してください

次に、車両の走行中に前方 2 台のカメラ画像と上部レーダー点群を収集し、同時に独自の IMU と GNSS データを保存するタスクを完了します (GPS は直接取得した位置とは異なることに注意してください) from carla!) GNSS データは carla の位置と同じになるように変換する必要があります

次の部分のいくつかは非常に基本的なものです。テキストを読むのが面倒な場合は、コードを直接読んでください。コード アドレス: tutorial/collect_data.py Zhang Congming/CarlaPythonAPI - Gitee.com

関連する参考リンクと教示は序文でまとめて公開されており、今後個別にコピーされることはありません。

  1. Zhihu CARLA チュートリアル コラム: Xiaofei Autopilot シリーズの共有 - について知る

  2. ブロガー自身の CSDN チュートリアルのコラム: https://blog.csdn.net/qq_39537898/category_11562137.html

  3. 最高の!もしくはCARLA公式ドキュメント!みなさんも公式ドキュメントをチェックしてみてください!PS CARLA のバージョンを必ず一致させてください

    CARLAシミュレータ

    単純に焦点を当てます。以下のすべてには、公式ドキュメントの対応する部分があります。

    1. CARLA ワールドの時間の仕組みと規定:同期性とタイムステップ - CARLA シミュレーター
    2. 内部で利用可能なセンサー:センサー リファレンス - CARLA シミュレーター

0.ワールド設定

同期時間の設定

データを収集するには CARLA 同期モードをオンにする必要があります。また、trafficmanager を使用する場合は、同期モードがオンになっているため、trafficmanager も一緒に同期する必要があることに注意してください。この知識は序文にリンクされています

時刻設定を見てみましょう: CARLA 時刻設定

以下は直接インターセプトされています。完全なコードについては、序文をクリックしてください。

パイソン

def main(args): 
    # クライアントの作成を開始します
    client = carla.Client(args.host, args.port) 
    client.set_timeout(5.0) 
    
    # world = client.get_world() 
    world = client.load_world('Town01') 
    blueprint_library = world.get_blueprint_library() 
    try: 
        original_settings = world.get_settings() 
        settings = world.get_settings() 

        # CARLA 同期モードを設定します
        settings.fixed_delta_seconds = 0.05 
        settings.synchronous_mode = True 
        world.apply_settings(settings) 
        spectator = world.get_spectator () 

        #手動规定
        #transform_vehicle = carla.Transform(carla.Location(0, 10, 0), carla.Rotation(0, 0, 0)) 
        # 自動选择
        transform_vehicle = random.choice(world.get_map().get_spawn_points()) 
        ego_vehicle = world.spawn_actor(random.choice(blueprint_library.filter("model3")),transform_vehicle) 
        actor_list.append(ego_vehicle)
  1. クライアントとサーバーの接続
  2. get_world は、このインターフェイス上の CARLA の現在のマップであり、世界はそれです。load world は、デフォルトの CARLA 組み込みの町を選択できることです。
  3. 同期モードを有効にする
  4. これにテスラを乗せる

オートモードオン

簡単にするために、特別なルールを実装したり、carla の動作エージェントを使用したりする必要はなく、トラフィック マネージャーを直接使用して自動運転モードに設定します。詳細な設定については、公式ドキュメントを参照してください。たとえば、次のリスト: 信号と制限速度を無視する

パイソン

# 交通マネージャの設定
tm = client.get_trafficmanager(args.tm_port) 
tm.set_synchronous_mode(True) 
# 信号無視するかどうか
# tm.ignore_lights_percentage(ego_vehicle, 100) 
# 制限速度が30km/hの場合 -> 30*(1 -10%) =27km/h 
tm.global_percentage_speed_difference(10.0) 
ego_vehicle.set_autopilot(True, tm.get_port())

注意する必要があるのは、同期トラフィック マネージャーも同期に設定する必要があり、破棄された場合は元に戻す必要があることです。チュートリアルを書いたばかりのときは、長い間バグが見つかりませんでした。車が動かないのを見ただけでした; 前者は学生が問題を見つけるのを助けるためです. スクリプトが交通管理者を同期するように設定されており、CARLA を同期するように設定されていない場合、NPC 全体がスタックすることがわかりました


同期モードが設定されていない場合、あまり良くない GPU で 1 枚のカードと 1 枚のカードが表示される現象が発生します。これはずっと前に描いたものです (2 番目のものには明らかにフレームとフレームのドロップがあります)。

1. センサーの配置

ここでは、carla の内部例を参照します。ここで、思い出させてくれた Li さんに感謝します haha​​. 当初は、もっと暴力的な計画を立てていました。すべてが同期しているのであれば、その必要はないと思いましたキューに移動しますが、安全のためにフレームを使用することをお勧めします。

パイソン

#-------------------------- 进入传感器部分 -------------------- ------# 
sensor_queue = Queue() 
cam_bp = blueprint_library.find('sensor.camera.rgb') 
lidar_bp = blueprint_library.find('sensor.lidar.ray_cast') 
imu_bp = blueprint_library.find('sensor.other .imu') 
gnss_bp = blueprint_library.find('sensor.other.gnss') 

# いくつかのパラメータを設定できます カメラの属性を設定します
cam_bp.set_attribute("image_size_x", "{}".format(IM_WIDTH)) 
cam_bp.set_attribute( "image_size_y", "{}".format(IM_HEIGHT)) 
cam_bp.set_attribute("fov", "60") 
# cam_bp.set_attribute('sensor_tick', '0.1') 
 
cam01 = world.spawn_actor(cam_bp, carla.Transform (carla.Location(z=args.sensor_h)、carla.Rotation(yaw=0))、attach_to=ego_vehicle)
cam01.listen(lambda data: sensor_callback(data,センサーキュー、"rgb_front")) 
sensor_list.append(cam01)

cam02 = world.spawn_actor(cam_bp, carla.Transform(carla.Location(z=args.sensor_h),carla.Rotation(yaw=60)),attach_to=ego_vehicle) 
cam02.listen(lambda data: sensor_callback(data, sensor_queue, "rgb_left")) 
sensor_list.append(cam02) 

lidar_bp.set_attribute('channels', '64') 
lidar_bp.set_attribute('points_per_second', '200000') 
lidar_bp.set_attribute('range', '32') 
lidar_bp.set_attribute ('rotation_frequency', str(int(1/settings.fixed_delta_秒))) # 

lidar01 = world.spawn_actor(lidar_bp, carla.Transform(carla.Location(z=args.sensor_h)),attach_to=ego_vehicle)  
lidar01.listen(ラムダ データ:sensor_callback(data, sensor_queue, "lidar"))
sensor_list.append( lidar01) 

imu01 = world.spawn_actor(imu_bp, carla.Transform(carla.Location(z=args.sensor_h)),Attach_to=ego_vehicle)
imu01.listen(lambda データ: sensor_callback(data, sensor_queue, "imu")) 
sensor_list.append(imu01) 

gnss01 = world.spawn_actor(gnss_bp, carla.Transform(carla.Location(z=args.sensor_h)),attach_to= ego_vehicle) 
gnss01.listen(lambda data: sensor_callback(data, sensor_queue, "gnss")) 
sensor_list.append(gnss01) 
#---------------------- --- 传感器設置完了 ------------------------#

上記は主に次のとおりです。

  1. カリーに行ってそのようなセンサーを見つけてください
  2. カメラのFOV、LIDARのチャンネル数などのセンサーの設定を行います。
  3. 続いて車にセンサーを取り付けます!あなたの車に付属品があります

注意すべき主な点は、LIDAR の設定です。

  1. Points_per_second ポイントが多いほど密度が高く、レーダー チャネルの数に関係します (オプションで覚えています: 32、64、128)

  2. 回転周波数が独自のfixed_delta_秒の周波数であることに注意してください。そうしないと、次の図のように顔の半分しか収集されていないように見えます。

2. データを収集する

主にcarla の公式サンプルのsensor_synchronization.pyを参照してください。以下は while ループでのインターセプトです

パイソン

while True: 
    # サーバーにチェックを入れます
    world.tick() 

    # 将CARLA界面摄像头跟随车アニメーション
    loc = ego_vehicle.get_transform().location 
    spectator.set_transform(carla.Transform(carla.Location(x=loc.x,y=loc) .y,z=35),carla.Rotation(yaw=0,pitch=-90,roll=0))) 

    w_frame = world.get_snapshot().frame 
    print("\n世界のフレーム: %d" % w_frame) 
    try : 
        rgbs = [] 

        for i in range (0, len(sensor_list)): 
            s_frame, s_name, s_data = sensor_queue.get(True, 1.0) 
            print(" フレーム: %d センサー: %s" % (s_frame, s_name) )
            センサータイプ == 'rgb' の場合、センサータイプ = s_name.split('_')[0] 
            : 
                rgbs.append(_parse_image_cb(s_data))
            elif sensor_type == 'lidar': 
                lidar = _parse_lidar_cb(s_data) 
            elif sensor_type == 'imu': 
                imu_yaw = s_data.compass 
            elif sensor_type == 'gnss': 
                gnss = s_data 
        
        # 仅用来可視化 可注释
        rgb=np.concatenate (rgbs, axis=1)[...,:3] 
        cv2.imshow('vizs', Visualize_data(rgb, lidar, imu_yaw, gnss)) 
        cv2.waitKey(100) 
    Empty を除く: 
        print(" センサーの一部情報がありません") 

def sensor_callback(sensor_data, sensor_queue, sensor_name): 
    # ディスクに保存するなど、sensor_data データを処理します
    # その後、キューに追加するだけです
    sensor_queue.put((sensor_data.frame, sensor_name,センサーデータ))

ここまでで、データ収集部分は完了しました。完全なコードを同時に実行して、次のダイナミクスを確認できます。

3. データの保存

これは対応する保存であり、表示効果は次のとおりです。

パイソン

rgb が None であるか、args.save_path が None ではない場合: 
	  # それぞれのセンサーのフォルダーがあるかどうかを確認します。 mkdir_folder 
	  (args.save_path) 
	
	  filename = args.save_path +'rgb/'+str(w_frame)+'.png' 
	  cv2 .imwrite (ファイル名, np.array(rgb[...,::-1]))
	  ファイル名 = args.save_path +'lidar/'+str(w_frame)+'.npy' 
	  np.save(ファイル名, lidar)

点群で他の操作を行う場合は、次のような open3d を使用することをお勧めします。

パイソン

import numpy as np 
import open3d as o3d 
pcd = o3d.geometry.PointCloud() 
pcd.points = o3d.utility.Vector3dVector(np.load('217.npy')[:,:3]) 
o3d.visualization.draw_geometries( [pcd])

要約する

上記は主に、CARLA 内のデータ収集スクリプトの簡易バージョンと長期バージョンの単純な実装です。

  1. CARLA を使用する目的を知りたい
  2. 公式ドキュメントの詳細を読む、多くの API 公式説明が用意されています
  3. 公式の例を見てください、その多くは宝物ですよ

さらに、完全なコードはgitee 外部リンクにあります。

[シミュレーション] Carla のデータ収集に関する簡単なチュートリアル (完全なコード付き) [7]から転載- Kin_Zhang - 博客园

おすすめ

転載: blog.csdn.net/weixin_48936263/article/details/124253467