이 포스트에서는 뉴로메카사의 Indy7을 이용하여 GPU-Voxels 라이브러리를 활용한 Motion Planning 예제를 만든다. 예제를 실행하기 전 GPU-Voxels를 완전하게 설치해야 한다.

Indy7-description을 다운로드

먼저 neuromeka github에서 indy7의 로봇 모델 파일을 받는다.

git clone https://github.com/neuromeka-robotics/indy-ros

gvl_ompl_planning example build

gpu-voxles 폴더에 있는 gvl_ompl_planning을 build한다. build를 성공하기 위해서는 먼저 ros가 설치되어 있으며 ros ompl을 설치해야 한다.

apt-get install ros-kinetic-ompl
cmake-gui .

cmake-gui를 통해 library의 설치여부를 확인한다. Screenshot from 2020-09-29 19-43-06

위와같이 gpu_voxels_DIR, icl_core_DIR을 gpu-voxels build폴더 내에서 선택해야한다.

정확하게 설정되어 있을 경우 configure과 generate를 누른다. 이후 cmake-gui를 나온 후 make를 이용하여 빌드한다.

make -j16
./gvl_ompl_planner

생성된 gvl_ompl_planner을 실행하면 다음과 같이 나온다.

<2020-09-29 19:48:06.825> CudaLog(Info)::cuTestAndInitDevice: Running on GPU 0 (GeForce RTX 2080 Ti)
<2020-09-29 19:48:07.013> RobotLog(Info) Robot::RobotToGPU: Parsing URDF /home/sung/workspace/gpu-voxels/packages/gpu_voxels/models/indy7_coarse/indy7.urdf
<2020-09-29 19:48:07.021> RobotLog(Info) Robot::load: Constructed KDL tree has 6 Joints and 8 segments.
Name of shared buffer swapped: voxel_list_buffer_swapped_1.
Info:    LBKPIECE1: Attempting to use default projection.
Debug:   LBKPIECE1: Planner range detected to be 2.879317
Waiting for Viz. Press Key if ready!

이제 다른 터미널 창에서 gpu-voxels의 build폴더에서 bin폴더에 위치한 gpu_voxels_visualizer를 실행한다.

cd /home/sung/workspace/gpu-voxels/build/bin
./gpu_voxels_visualizer

Screenshot from 2020-09-29 19-52-43

gpu_voxels_visualizer가 실행된 후에 gvl_ompl_planning 터미널에서 Enter를 누르면 example이 실행된다.

Screenshot from 2020-09-29 19-54-24

Indy7 urdf 적용하기

미리 수정된 indy7 urdf파일을 다운 받는다.

cd /home/sung/workspace/gpu-voxels/packages/gpu_voxels/models
git clone https://github.com/tjdalsckd/gpu-voxels-indy7
gedit /home/sung/workspace/gpu-voxels/gvl_ompl_planning/gvl_ompl_planner_helper.cpp

60번째 줄을 다음과 같이 변경한다.

line 60:     gvl->addRobot("myUrdfRobot", "indy7_coarse/indy7.urdf", true);
cd /home/sung/workspace/gpu-voxels/gvl_ompl_planning
make -j16

constraint 변경

gedit /home/sung/workspace/gpu-voxels/gvl_ompl_planning/gvl_ompl_planner_helper.cpp

gvl_ompl_planner_helper.cpp 파일에서 85부터 87줄은 박스 형태의 Constraint를 추가하는 부분이다. 박스의 시작점과 끝점을 Vector3f로 입력하여 추가할 수 있다.

line 85:    gvl->insertBoxIntoMap(Vector3f(1.0,1.0,0.0), Vector3f(1.2,1.2,1.2), "myEnvironmentMap", eBVM_OCCUPIED, 2);
line 86:    gvl->insertBoxIntoMap(Vector3f(1.8,1.8,0.0), Vector3f(2.0,2.0,1.2), "myEnvironmentMap", eBVM_OCCUPIED, 2);
line 87:    gvl->insertBoxIntoMap(Vector3f(0.0,0.0,0.0), Vector3f(3.0,3.0,0.01), "myEnvironmentMap", eBVM_OCCUPIED, 2);

goal joint position 변경

목표 joint 각도 변경은 gvl_ompl_planner.cpp파일에서 수정할 수 있다.

gedit /home/sung/workspace/gpu-voxels/gvl_ompl_planning/gvl_ompl_planner.cpp
line 85:    goal[0] = 3.141592/2;
line 86:    goal[1] = -0.5;
line 87:    goal[2] = 0.0;
line 88:    goal[3] = 0.0;
line 89:    goal[4] = 0.0;
line 90:    goal[5] = 0.0;