로봇 내비게이션(3): 내비게이션 관련 메시지

지도

지도와 관련된 두 가지 주요 메시지가 있습니다.

nav_msgs/MapMetaData: 지도 너비, 높이, 해상도 등을 포함한 지도 메타데이터
nav_msgs/OccupancyGrid: 일반적으로 rviz에서 그래픽으로 표시되는 지도 래스터 데이터입니다.

nav_msgs/MapMetaData

rosmsg info nav_msgs/MapMetaData를 호출하여 다음과 같이 메시지 내용을 표시합니다.

time map_load_time
float32 resolution #地图分辨率
uint32 width #地图宽度
uint32 height #地图高度
geometry_msgs/Pose origin #地图位姿数据
  geometry_msgs/Point position
    float64 x
    float64 y
    float64 z
  geometry_msgs/Quaternion orientation
    float64 x
    float64 y
    float64 z
    float64 w

nav_msgs/OccupancyGrid

rosmsg info nav_msgs/OccupancyGrid를 호출하여 다음과 같이 메시지 내용을 표시합니다.

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
#--- 地图元数据
nav_msgs/MapMetaData info
  time map_load_time
  float32 resolution
  uint32 width
  uint32 height
  geometry_msgs/Pose origin
    geometry_msgs/Point position
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion orientation
      float64 x
      float64 y
      float64 z
      float64 w
#--- 地图内容数据,数组长度 = width * height
int8[] data

주행 거리계

주행 거리계 관련 메시지는 nav_msgs/Odometry이며, rosmsg 정보 nav_msgs/Odometry를 호출하면 다음과 같은 메시지가 표시됩니다.

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
string child_frame_id
geometry_msgs/PoseWithCovariance pose
  geometry_msgs/Pose pose #里程计位姿
    geometry_msgs/Point position
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion orientation
      float64 x
      float64 y
      float64 z
      float64 w
  float64[36] covariance
geometry_msgs/TwistWithCovariance twist
  geometry_msgs/Twist twist #速度
    geometry_msgs/Vector3 linear
      float64 x
      float64 y
      float64 z
    geometry_msgs/Vector3 angular
      float64 x
      float64 y
      float64 z    
  # 协方差矩阵
  float64[36] covariance

좌표 변환

좌표 변환 관련 메시지는 다음과 같습니다. tf/tfMessage, rosmsg info tf/tfMessage를 호출하여 메시지 내용을 다음과 같이 표시합니다.

geometry_msgs/TransformStamped[] transforms #包含了多个坐标系相对关系数据的数组
  std_msgs/Header header
    uint32 seq
    time stamp
    string frame_id
  string child_frame_id
  geometry_msgs/Transform transform
    geometry_msgs/Vector3 translation
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion rotation
      float64 x
      float64 y
      float64 z
      float64 w

위치

포지셔닝 관련 메시지는 다음과 같습니다: geometry_msgs/PoseArray, rosmsg 정보 geometry_msgs/PoseArray를 호출하여 메시지 내용을 다음과 같이 표시합니다.

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
geometry_msgs/Pose[] poses #预估的点位姿组成的数组
  geometry_msgs/Point position
    float64 x
    float64 y
    float64 z
  geometry_msgs/Quaternion orientation
    float64 x
    float64 y
    float64 z
    float64 w

목표 지점 및 경로 계획

대상 지점과 관련된 메시지는 다음과 같습니다. move_base_msgs/MoveBaseActionGoal, rosmsg 정보 move_base_msgs/MoveBaseActionGoal을 호출하여 메시지 내용을 다음과 같이 표시합니다.

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
actionlib_msgs/GoalID goal_id
  time stamp
  string id
move_base_msgs/MoveBaseGoal goal
  geometry_msgs/PoseStamped target_pose
    std_msgs/Header header
      uint32 seq
      time stamp
      string frame_id
    geometry_msgs/Pose pose #目标点位姿
      geometry_msgs/Point position
        float64 x
        float64 y
        float64 z
      geometry_msgs/Quaternion orientation
        float64 x
        float64 y
        float64 z
        float64 w

경로 계획과 관련된 메시지는 다음과 같습니다. nav_msgs/Path, rosmsg info nav_msgs/Path를 호출하여 메시지 내용을 다음과 같이 표시합니다.

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
geometry_msgs/PoseStamped[] poses #由一系列点组成的数组
  std_msgs/Header header
    uint32 seq
    time stamp
    string frame_id
  geometry_msgs/Pose pose
    geometry_msgs/Point position
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion orientation
      float64 x
      float64 y
      float64 z
      float64 w

라이다

레이저 레이더 관련 메시지: sensor_msgs/LaserScan, rosmsg info sensor_msgs/LaserScan을 호출하여 메시지 내용을 다음과 같이 표시합니다.

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
float32 angle_min #起始扫描角度(rad)
float32 angle_max #终止扫描角度(rad)
float32 angle_increment #测量值之间的角距离(rad)
float32 time_increment #测量间隔时间(s)
float32 scan_time #扫描间隔时间(s)
float32 range_min #最小有效距离值(m)
float32 range_max #最大有效距离值(m)
float32[] ranges #一个周期的扫描数据
float32[] intensities #扫描强度数据,如果设备不支持强度数据,该数组为空

카메라

깊이 카메라 관련 메시지: sensor_msgs/Image, sensor_msgs/CompressedImage, sensor_msgs/PointCloud2

sensor_msgs/Image는 일반 이미지 데이터, sensor_msgs/CompressedImage는 압축 이미지 데이터, sensor_msgs/PointCloud2는 포인트 클라우드 데이터(깊이 정보가 있는 이미지 데이터)에 해당합니다.

rosmsg info sensor_msgs/Image를 호출하여 다음과 같이 메시지 내용을 표시합니다.

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
uint32 height #高度
uint32 width  #宽度
string encoding #编码格式:RGB、YUV等
uint8 is_bigendian #图像大小端存储模式
uint32 step #一行图像数据的字节数,作为步进参数
uint8[] data #图像数据,长度等于 step * height

rosmsg info sensor_msgs/CompressedImage를 호출하여 다음과 같이 메시지 내용을 표시합니다.

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
string format #压缩编码格式(jpeg、png、bmp)
uint8[] data #压缩后的数据

rosmsg info sensor_msgs/PointCloud2를 호출하여 다음과 같이 메시지 내용을 표시합니다.

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
uint32 height #高度
uint32 width  #宽度
sensor_msgs/PointField[] fields #每个点的数据类型
  uint8 INT8=1
  uint8 UINT8=2
  uint8 INT16=3
  uint8 UINT16=4
  uint8 INT32=5
  uint8 UINT32=6
  uint8 FLOAT32=7
  uint8 FLOAT64=8
  string name
  uint32 offset
  uint8 datatype
  uint32 count
bool is_bigendian #图像大小端存储模式
uint32 point_step #单点的数据字节步长
uint32 row_step   #一行数据的字节步长
uint8[] data      #存储点云的数组,总长度为 row_step * height
bool is_dense     #是否有无效点

레이저 데이터에 대한 깊이 이미지

이 섹션에서는 ROS의 함수 패키지인 depthimage_to_laserscan을 소개합니다.이름에서 알 수 있듯이 이 함수 패키지는 깊이 이미지 정보를 라이다 정보로 변환할 수 있습니다.응용 시나리오는 다음과 같습니다.

많은 SLAM 알고리즘에서 일반적으로 지도를 구축하기 위해 LiDAR 데이터를 구독해야 합니다. 왜냐하면 LiDAR는 주변 환경의 깊이 정보를 인식할 수 있고 깊이 카메라도 깊이 정보를 감지하는 기능을 가지고 있으며 LiDAR의 초기 가격은 상대적으로 비싸다면 센서 선택에 라이다 대신 깊이 카메라를 사용할 수 있을까?

정답은 yes 이지만 둘이 공개하는 메시지의 종류가 완전히 다르기 때문에 센서를 교체하려면 깊이 카메라가 공개한 3차원 그래픽 정보를 2차원 라이다 정보로 변환해야 한다. depthimage_to_laserscan에 의해 달성됩니다.

depthimage_to_laserscan 소개

depthimage_to_laserscan의 원리는 깊이 이미지와 레이더 데이터 간의 변환을 구현하는 것이 비교적 간단합니다.레이더 데이터는 2차원 평면이고 깊이 이미지는 3차원이며 여러 2차원(수평) 데이터의 수직 중첩입니다. 3차원 데이터를 2차원 데이터로 변환하는 경우 깊이 맵의 특정 레이어만 가져오면 됩니다.더 나은 이해를 위해 공식 예를 참조하십시오.

그림 1: 깊이 카메라 및 외부 환경(물리적 사진)

여기에 이미지 설명 삽입
그림 2: 깊이 카메라가 공개한 이미지 정보, 그림의 컬러 선은 레이더 정보로 변환할 데이터에 해당합니다.

여기에 이미지 설명 삽입
그림 3: 그림 2를 포인트 클라우드로 표시하는 것이 더 직관적입니다. 그림의 색상 선은 여전히 ​​레이더 정보로 변환할 데이터에 해당합니다.

여기에 이미지 설명 삽입
그림 4: 변환 후 결과 맵(상단 보기)

여기에 이미지 설명 삽입
장점 및 단점
장점: 깊이 카메라의 비용은 일반적으로 LiDAR보다 저렴하여 하드웨어 비용을 줄일 수 있습니다.

단점: 라이다에 비해 깊이 카메라는 감지 범위와 정확도에 큰 차이가 있으며 SLAM 효과가 라이다만큼 이상적이지 않을 수 있습니다.

설치
사용하기 전에 설치하십시오. 명령은 다음과 같습니다.

sudo apt-get install ros-melodic-depthimage-to-laserscan

depthimage_to_laserscan 노드 설명

depthimage_to_laserscan 기능 패키지의 핵심 노드는 depthimage_to_laserscan입니다 호출을 용이하게 하려면 이 노드의 구독 주제, 게시 주제 및 관련 매개변수를 이해해야 합니다.

구독 주제

image(sensor_msgs/Image): 이미지 정보를 입력합니다.
camera_info(sensor_msgs/CameraInfo): 연결된 이미지의 카메라 정보. 일반적으로 camera_info는 이미지와 동일한 네임스페이스에서 구독하므로 재매핑이 필요하지 않습니다.

게시된 주제

scan(sensor_msgs/LaserScan): 변환된 라이더 유형 데이터를 게시합니다.

매개변수

이 노드에는 몇 가지 매개변수가 있으며 다음 매개변수만 있으며 일반적으로 output_frame_id를 설정해야 합니다.

~scan_height(int, 기본값: 1픽셀)

LiDAR 정보를 생성하는 데 사용되는 픽셀 행 수를 설정합니다.
~scan_time(double, 기본값: 1/30.0Hz(0.033s))

두 스캔 사이의 시간 간격입니다.
~range_min(더블, 기본값: 0.45m)

반환할 최소 범위입니다. range_max와 결합하면 range_min과 range_max 사이의 데이터만 얻을 수 있습니다.
~range_max(double, 기본값: 10.0m)

반환할 최대 범위입니다. range_min과 결합하면 range_min과 range_max 사이의 데이터만 얻을 수 있습니다.
~output_frame_id(str, 기본값: camera_depth_frame)

레이저 정보의 ID입니다.

depthimage_to_laserscan 사용

Launch 파일 작성
Launch 파일을 작성하고 실행하여 수심 정보를 레이더 정보로 변환

<launch>
    <node pkg="depthimage_to_laserscan" type="depthimage_to_laserscan" name="depthimage_to_laserscan">
        <remap from="image" to="/camera/depth/image_raw" />
        <param name="output_frame_id" value="camera"  />
    </node>
</launch>

구독한 주제는 깊이 카메라가 게시한 주제에 따라 설정해야 하며 output_frame_id는 깊이 카메라의 좌표계와 일치해야 합니다.

URDF 파일 수정
정보 변환 후 깊이 카메라도 레이더 데이터를 공개합니다 혼동을 일으키지 않기 위해 xacro 파일에서 라이더에 대한 일부 내용을 주석 처리할 수 있습니다.

실행
1. 다음과 같이 전망대 시뮬레이션 환경을 시작합니다.
여기에 이미지 설명 삽입
2. rviz를 시작하고 관련 구성 요소(이미지, LaserScan)를 추가합니다. 결과는 다음과 같습니다.

여기에 이미지 설명 삽입

SLAM 적용

깊이 영상 정보를 라이다 정보로 변환하는 구현 및 테스트를 마쳤으니, 다음 단계는 깊이 카메라를 통해 SLAM을 구현하는 실전 단계입니다.

1. 먼저 Gazebo 시뮬레이션 환경을 시작합니다.

2. 변환 노드를 시작합니다.

3. 지도 그리기를 위한 시작 파일을 다시 시작합니다.

4. 로봇의 동작 및 매핑을 제어하는 ​​데 사용되는 키보드 키보드 제어 노드를 시작합니다.

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

5. rviz에 컴포넌트를 추가하여 그리드 맵을 표시합니다.마지막으로 키보드를 통해 전망대에서 로봇의 움직임을 제어할 수 있습니다.동시에 gmapping에 의해 릴리스된 그리드 맵 데이터를 rviz에서 표시할 수 있습니다.단, 앞서 언급한 바와 같이, 정확도로 인해 환경 기능 및 감지 범위가 부족하여 매핑 효과가 이상적이지 않을 수 있으며 지도가 이동할 수도 있습니다.

추천

출처blog.csdn.net/weixin_42990464/article/details/131910888