Autoware - sensor modeling (1)

JunseoMin·2024년 4월 29일
post-thumbnail

autoware의 tutorial을 따라가면서 센서 모델링을 진행해보자 해당 과정 중 description 파일 구성 부분까지 진행한다.

우선 밑 링크에 있는 Template을 이용하여 레포지토리를 만들어 준다.
https://github.com/leo-drive/tutorial_vehicle_sensor_kit_launch

이번포스트 에서는 Livox-hap Lidar의 discription과 param을 이용하여 modeling을 진행할 예정이다.

~/adehome/AutowareAuto/src
디렉토리에 robot/폴더를 만들어 밑처럼 디렉토리를 구성하였다.

.
├── map
├── sensor
│   └── <~~>autoware_sensor
└── vehicle

autoware_sensor 디렉토리 안에는 위에서 만든 깃 template을 clone하여 내부에서 param과 description을 수정하도록 한다.

수정하기에 앞서서 sample이라고 적혀져 있는것들을 본인이 사용하고 싶은 이름으로 바꾸어 주자.
CMakeList.txtpackage.xml내부의 값도 바꾸어줘야 하는데

위 그림의 project() 부분이 sample 어쩌구로 되어있을 텐데 해당 부분을 패키지 이름으로 바꾸어 주고

<name>태그로 묶여진 부분도 패키지의 이름으로 바꾸어주도록 하자.

전체 디렉토리를 확인하면

├── build_depends.repos
├── CODE_OF_CONDUCT.md
├── common_sensor_launch
│   ├── CMakeLists.txt
│   ├── launch
│   │   ├── camera_node_container.launch.py
│   │   ├── hesai_PandarQT64.launch.xml
│   │   ├── nebula_node_container.launch.py
│   │   ├── velodyne_VLP16.launch.xml
│   │   └── velodyne_VLS128.launch.xml
│   └── package.xml
├── CONTRIBUTING.md
├── DISCLAIMER.md
├── 원하는 이름_sensor_kit_description
│   ├── CMakeLists.txt
│   ├── config
│   │   ├── sensor_kit_calibration.yaml
│   │   └── sensors_calibration.yaml
│   ├── package.xml
│   └── urdf
│       ├── sensor_kit.xacro
│       └── sensors.xacro
├── 원하는 이름_sensor_kit_launch
│   ├── CMakeLists.txt
│   ├── config
│   │   ├── diagnostic_aggregator
│   │   │   └── sensor_kit.param.yaml
│   │   └── dummy_diag_publisher
│   │       └── sensor_kit.param.yaml
│   ├── data
│   │   └── traffic_light_camera.yaml
│   ├── launch
│   │   ├── camera.launch.xml
│   │   ├── gnss.launch.xml
│   │   ├── imu.launch.xml
│   │   ├── lidar.launch.xml
│   │   ├── pointcloud_preprocessor.launch.py
│   │   └── sensing.launch.xml
│   └── package.xml
├── LICENSE
├── NOTICE
├── README.md
└── setup.cfg

위처럼 구성되어있을 것이다.

Description

config 수정


<~~>sensor_kit_description내부로 들어가보면 sensors_calibration.yaml파일이 있다. 해당 파일에는 센서의 좌표계를 기입할 수 있는 것처럼 느껴지는 파라미터들이 적혀있다.

로봇을 사용하는 사람들 이라면 바로 생각이 들만한게, 상대좌표 일텐데 기준이 어디야? 일것이다.
물론 base_link를 다시 지정하여서 추가해주면 된다.

아직 라이다 위치가 정해지지 않아서 robot_base_link를 만들고 그위로 z 방향으로 10주고 .yaml파일 수정을 끝냈다.

URDF 수정

.xacro 파일에 저장되어있는 urdf정보를 수정하자. urdf경로에 sensors.xacro 파일이 존재하는데, 해당 파일에 내 로봇에 맞는 값을 적어주어 센서들간의 좌표계, joint를 넣어주었다.

configdir을 생성하며 이름을 바꿔준 디렉토리로 다시 설정한 후, 밑의 메크로를 작성해주면 된다.

sensor_kit_macro

센서들간의 tf정보를 알려주는 부분인듯 하다.

base link를 기준으로 센서들간의 좌표계를 설정할 수 있는 macro가 적혀있다.

사이트에서 제공하는 velodyne lidar로 설정한 예시를 확인해보면

요런 식으로 xacro를 구성하는데, 라이다의 urdf가 적힌 패키지의 xacro를 include해주고, 필요한 파일들을 제외하고는 삭제하라고 한다.

해당 이미지는 VLP 16의 xacro가 담긴 이미지인데 위의 그림에서 xacro파일을 include해주며 상황에 맞게 파라미터를 설정해준다.

내가 이용할 lidar인 livox hap의 경우는 공식적으로는 ros1만으로 구성되어있는데, issue를 뒤져보니

https://github.com/stm32f303ret6/livox_laser_simulation_RO2
해당 링크에서 ros2를 위한 urdf를 찾을 수 있었다.

<?xml version="1.0" encoding="UTF-8"?>
<robot xmlns:xacro="http://ros.org/wiki/xacro">

  <xacro:property name="M_PI" value="3.14159"/> 
  <xacro:property name="laser_min_range" value="0.1"/>
  <xacro:property name="laser_max_range" value="200.0"/>
  <xacro:property name="samples" value="45300"/>
  <xacro:property name="resolution" value="0.002"/>
  <xacro:property name="noise_mean" value="0.0"/>
  <xacro:property name="noise_stddev" value="0.01"/>
  
<xacro:property name="mass" value="0.4" />
<xacro:property name="length" value="0.1" />
<xacro:property name="width" value="0.06" />
<xacro:property name="height" value="0.06" />

  <xacro:macro name="box_inertia" params="m w h d">
    <inertial>
      <origin xyz="0 0 0" rpy="${pi/2} 0 ${pi/2}"/>
      <mass value="${m}"/>
      <inertia ixx="${(m/12) * (h*h + d*d)}" ixy="0.0" ixz="0.0" iyy="${(m/12) * (w*w + d*d)}" iyz="0.0" izz="${(m/12) * (w*w + h*h)}"/>
    </inertial>
  </xacro:macro>



  <xacro:macro name="HAP" params="name:='' parent:= 'base_link' topic:='HAP' *origin ">

<link name="${name}">
<xacro:box_inertia m="${length}" w="${width}" d="${length}" h="${height}"/>
  <visual>
        <geometry>
            <box size="${length} ${width} ${height}"/>
        </geometry>
  </visual>
</link>

    <joint name="${name}_joint" type="fixed">
      <parent link="${parent}"/>
      <child link="${name}"/>
      <xacro:insert_block name="origin"/>
    </joint>

    <gazebo reference="${name}">
      <sensor type="ray" name="${name}">
        <pose>0 0 0 0 0 0</pose>
        <visualize>true</visualize>
        <update_rate>10</update_rate>
        <!-- This ray plgin is only for visualization. -->
        <plugin name="${name}_plugin" filename="libros2_livox.so">
			<ray>
			  <scan>
				<horizontal>
				<samples>100</samples>
				<resolution>1</resolution>
				<min_angle>${-60/180*M_PI}</min_angle>
				<max_angle>${60/180*M_PI}</max_angle>
				</horizontal>
				<vertical>
				<samples>50</samples>
				<resolution>1</resolution>
				<min_angle>${-12.5/180*M_PI}</min_angle>
				<max_angle>${12.5/180*M_PI}</max_angle>
				</vertical>
			  </scan>
			  <range>
				<min>${laser_min_range}</min>
				<max>${laser_max_range}</max>
				<resolution>${resolution}</resolution>
			  </range>
			  <noise>
				<type>gaussian</type>
				<mean>${noise_mean}</mean>
				<stddev>${noise_stddev}</stddev>
			  </noise>
			</ray>
          <visualize>false</visualize>
		  <samples>${samples}</samples>
		  <downsample>1</downsample>
		  <csv_file_name>$(find ros2_livox_simulation)/scan_mode/HAP.csv</csv_file_name>
		  <topic>${topic}</topic>
        </plugin>
      </sensor>
    </gazebo>
  </xacro:macro>

</robot>

해당 파일을 include 해준 후, 용도에 맞게 sensors.xacro를 example처럼 구성하면 되는데, 위의 xacro파일이 가진 param값대로 입력하고, link를 설정하였다.


개인의 설정이고, 필요에 따라 원래의 urdf를 수정하여 파라미터를 더 이용할 수 있다.


다음 포스트에서 launch파일 구성에 대해 포스팅 하겠습니다.

profile
아니야 뭘 또 수정해

1개의 댓글

comment-user-thumbnail
2024년 10월 4일

안녕하세요 혹시 autoware에서 livox hap 세팅을 완료하였을까요?

답글 달기