CARLA X ROS: 自動運転シミュレータ世界で実験空間を作る！

# 自動運転シミュレータ世界で実験空間を作る！

さあて、前回の続きだ
前回は、センサを自動運転車にガン積みしてみましたとさ
[CARLA X ROS: シミュレータで自動運転車にセンサをガン積みする！！！](https://qiita.com/chin_self_driving_car/items/a65e46bcbd3b4fdadbcf)

今回は、実験のセットアップについてガイドしていくぞ！


前回やったこと

* 自動運転車にセンサをガン積みする
* 自動運転車のセンサデータをROSで可視化する
* 自動運転車を自分で操縦して、街中に役者をランダムで配置する



[CARLA Simulator](http://carla.org/)

自動運転好きだよ！って人、Like＆フォローしてね！！！

## この記事ですること
自動運転シミュレータ世界で実験空間を作る

* 世界を変更する
* 天気を変更する
* 自分のスタート地点を変更する
* 任意の役者を任意の場所に配置する


## この記事の完成予想図

自動運転シミュレータ世界で実験空間を作るぞ
（手前に車両、歩行者3人、ポールを配置しました）
![Screenshot from 2020-04-12 16-09-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/562f1d61-cd30-6a34-fc38-d7e6a924f882.png)

さあ、行くぞ！！！

## 前回までの話

↓ここ見てね
[CARLA X ROS: シミュレータで自動運転車にセンサをガン積みする！！！](https://qiita.com/chin_self_driving_car/items/a65e46bcbd3b4fdadbcf)

## 世界を変更する

carlaには用意された世界が何個かある

### Town 01
![Screenshot from 2020-04-12 16-13-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/82767d52-8ff1-0e97-0f7d-ab8a00e61b07.png)

### Town 02
![Screenshot from 2020-04-12 16-14-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/2159efdc-3bfb-177b-ea22-28d37e14704e.png)

### Town 03
![Screenshot from 2020-04-12 16-14-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/a8c4f864-4f88-b268-0cf7-a406cadce075.png)

### Town 04
![Screenshot from 2020-04-12 16-16-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/932e030f-8de7-1ce8-772f-06e991df72a3.png)

### Town 05
![Screenshot from 2020-04-12 16-16-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/842b093f-70b3-695b-74eb-ea8268b04b56.png)

### Town 06
![Screenshot from 2020-04-12 16-16-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/40b9a4f1-b15e-f2df-11b8-01498a9daf6a.png)

それでは今回は、ちょっとジメジメしたTown02を舞台にしていこう

引き続き、manual_control.pyを編集していくぞ

```python
#manual_control.py内、関数game_loop内
def game_loop(args):
    pygame.init()
    pygame.font.init()
    world = None

    try:
        client = carla.Client(args.host, args.port)
        client.set_timeout(2.0)

        display = pygame.display.set_mode(
            (args.width, args.height),
            pygame.HWSURFACE | pygame.DOUBLEBUF)

        hud = HUD(args.width, args.height)
        #world = World(client.get_world(), hud, args)
        #ここで世界を変更するよ
        world = World(client.load_world('Town02'), hud, args)
```

これで世界をTown02に指定できる

## 天気を変更する

しかし問題がある、Town02の天気は夜で雨だ
こんなの気分が暗くてシミュレーションなんてできるわけがない
次は天気を変更して、気分を明るくしよう

![Screenshot from 2020-04-12 16-23-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/bec66812-e43e-8056-0544-aa8d26f5bc18.png)


manual_control.pyではCキーを押せば、天気を切り替えることが出来るがそんな悠長なことはしたくない


```python
#manual_control.py内、関数next_weather内
    def next_weather(self, reverse=False):
        self._weather_index += -1 if reverse else 1
        self._weather_index %= len(self._weather_presets)
        preset = self._weather_presets[self._weather_index]
        self.hud.notification('Weather: %s' % preset[1])
        #self.player.get_world().set_weather(preset[0])
        #ここで天気を設定するよ
        weather = carla.WeatherParameters(cloudiness=10.0,precipitation=0.0,sun_altitude_angle=70.0)
        self.player.get_world().set_weather(weather)
```

* cloudiness: 曇り具合
* precipitation: 雨量
* sun_altitude_angle: 太陽の位置

![Screenshot from 2020-04-12 16-25-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/b4cba2b9-2cb7-b6d1-a451-524df41a074f.png)

よし、晴れた

## 自車のスタート地点を固定する

デフォルトでは、自車のスタート地点はランダムになっている
世界に設定されたスポーンポイントリストからランダムに選択して開始地点になっている

場所を固定したいんだ

### スタート地点を選ぶ

まずは自分でスタートした場所に手動運転しよう
スタートしたい地点についたら、画像左の Locationを見てほしい
ここが今の位置だ

![Screenshot from 2020-04-12 16-29-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/ba03ee8d-89df-01cd-cfa4-d24991a9abcb.png)

この座標を毎回のスタート地点にしたい

```python
#manual_control.py内、関数restart内
        # Spawn the player.
        if self.player is not None:
            spawn_point = self.player.get_transform()
            spawn_point.location.z += 2.0
            spawn_point.rotation.roll = 0.0
            spawn_point.rotation.pitch = 0.0
            self.destroy()
            self.player = self.world.try_spawn_actor(blueprint, spawn_point)
        while self.player is None:
            if not self.map.get_spawn_points():
                print('There are no spawn points available in your map/town.')
                print('Please add some Vehicle Spawn Point to your UE4 scene.')
                sys.exit(1)
            spawn_points = self.map.get_spawn_points()
            spawn_point = random.choice(spawn_points) if spawn_points else carla.Transform()
            #ここでスタート地点を編集する
            #road
            spawn_point.location.x = 189.5
            spawn_point.location.y = 210
            spawn_point.location.z = 2.0
            spawn_point.rotation.roll = 0.0
            spawn_point.rotation.pitch = 0.0
            spawn_point.rotation.yaw = 270.0
```

![Screenshot from 2020-04-12 16-33-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/a1d4da94-d896-800a-86d8-852ac5148680.png)

よし、これでスタート地点が固定になったぞ

## 任意の役者を任意の場所に配置する

お気に入りの場所を見つけたところで、仲間がいないと寂しい
さあ仲間を呼ぼう

前回使用した、spawn_npc.pyでもいいのだが、
あれはランダムな役者をランダムに配置してしまう
一定条件の環境は作れない

まずは呼びたい仲間のリストを見てみよう

[呼び出せる仲間のリスト](https://carla.readthedocs.io/en/latest/bp_library/#vehicle)

呼び出せる役者は下記

* controller: 役者の動きを自動決定してくれる
* sensor: カメラ, LIDARなどのセンサ
* static: 静止オブジェクト、コーン、売店、ゴミ箱、ビニール袋
* vehicle: 車両
* walker: 歩行者

さて、役者を呼び出そう
今回呼び出す役者は

* 車
* 歩行者
* ポール

```python
#manual_control.py内、関数restart内
        # Spawn target walker and vehicle
        #車を呼び出すよ
        spawn_point_vehicle = carla.Transform(carla.Location(x=193.8, y=184.6, z = 2), carla.Rotation(pitch=0, yaw=90, roll=0))
        blueprint = self.world.get_blueprint_library().find('vehicle.audi.tt')
        self.vehicle = self.player.get_world().spawn_actor(blueprint, spawn_point_vehicle)
　　　　　#歩行者を呼び出すよ、大人
        spawn_point_ped = carla.Transform(carla.Location(x=193.8, y=200.6, z = 5), carla.Rotation(pitch=0, yaw=90, roll=0))
        blueprint = self.world.get_blueprint_library().find('walker.pedestrian.0008')
        self.ped = self.player.get_world().spawn_actor(blueprint, spawn_point_ped)
　　　　　#歩行者を呼び出すよ、男の子
        spawn_point_ped2 = carla.Transform(carla.Location(x=193.8, y=200.6, z = 5), carla.Rotation(pitch=0, yaw=90, roll=0))
        blueprint = self.world.get_blueprint_library().find('walker.pedestrian.0010')
        self.ped = self.player.get_world().spawn_actor(blueprint, spawn_point_ped2)
　　　　　#歩行者を呼び出すよ、女の子
        spawn_point_ped3 = carla.Transform(carla.Location(x=193.8, y=200.6, z = 5), carla.Rotation(pitch=0, yaw=90, roll=0))
        blueprint = self.world.get_blueprint_library().find('walker.pedestrian.0012')
        self.ped = self.player.get_world().spawn_actor(blueprint, spawn_point_ped3)
　　　　　#ポールを呼び出すよ
        spawn_point_stat = carla.Transform(carla.Location(x=193.8, y=203.6, z = 0), carla.Rotation(pitch=0, yaw=90, roll=0))
        blueprint = self.world.get_blueprint_library().find('static.prop.trafficcone02')
        self.stat = self.player.get_world().spawn_actor(blueprint, spawn_point_stat)
```
![Screenshot from 2020-04-12 16-46-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/a342fb91-1607-4413-e8c8-7c48f3c94dd4.png)

よし、これで仲間を配置できたぞ


### 適当に役者を召喚して遊ぶ
![Screenshot from 2020-04-12 16-51-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/d38b1bf5-5793-f37d-c3bf-cd834c310777.png)

うむ、いいんじゃないんでしょうか（適当)


# おわりに

今回は自分で決めた実験の空間をセットアップするための手順でした
実験する世界を変える、天気を変える、場所も変える、役者を配置することができるようになりました

それでは〜★

役に立ったなら、Like＆フォローしてね！！！