2021년 4학년 2학기 졸업작품으로 장애물을 피해 움직이는 물체를 따라가는 로봇을 시뮬레이션을 통해 구현해보기로 했다.
그래서 V-rep으로 로봇을 만들고 c++ api를 활용하여 프로젝트를 시작해보려고 했으나...
일주일동안 V-rep과 ros를 연결하지 못했다. (파이썬으로 했을땐 어렵지 않게 했는데 c++는 인터넷에 소스가 너무 부족하다)
V-rep은 원래 Kist에서 인턴으로 근무할때 vortex라는 물리엔진을 사용하기 위해 써봤는데 Gazebo에 비해 모델 만들기도 쉽고 gui도 잘 되어있는 것 같다. (하지만 V-rep에서 모델을 만들면 urdf 변환이 불가능해 urdf로 똑같은 모델을 만들어줘야하는 단점이 있다)
이번 프로젝트의 목적은 path finding 알고리즘 구현이기 때문에 로봇은 github에 있는 로봇을 살짝 수정해서 사용하였다.
참고한 로봇 github주소 링크텍스트
이 사이트 에 첫번째 동영상을 보면 로봇을 urdf 형식의 xacro 파일로 작성하여 Gazebo에 spawn, teleop twist keyboard를 이용하여 조작해볼수 있는 튜토리얼(?)을 제공한다.
다음과 같이 명령어를 입력하여 실행 할 수 있다.
roscore
rosrun gazebo_ros gazebo
roslaunch r2w_description spawn.launch
이렇게 실행을 하면 Gazebo에 로봇이 소환된다.
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
teleop_twist_keyboard를 이용하여 /cmd_vel/geometry_msgs/Twist 에서 전진하는 변수가 linear.x 회전하는 변수가 angular.z 라는 것을 확인하였다.
QtCreator를 이용하여 프로젝트를 생성, 패키지를 만들고 소스코드를 실행하여 로봇을 움직여보고 싶었다.
패키지의 dependency는 std_msgs,geometry_msgs,roscpp 띄어쓰기 x
터미널상에서 패키지를 만들땐 , 대신 스페이스
다음은 소스코드와 Cmakelist이다.
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "geometry_msgs/Twist.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "test_pub");
ros::NodeHandle nh;
ros::Publisher chatter_pub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 1000);
ros::Rate loop_rate(10);
while (ros::ok())
{
geometry_msgs::Twist msg;
msg.linear.x = 0;
msg.angular.z = 0;
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
파일 이름은 test_pub.cpp
Cmakelist
cmake_minimum_required(VERSION 3.0.2)
project(move_test)
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp
std_msgs
)
generate_messages(
DEPENDENCIES
geometry_msgs# std_msgs
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
add_executable(test_pub src/test_pub.cpp)
add_dependencies(test_pub ${test_pub_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(test_pub
${catkin_LIBRARIES}
)
test_pub.cpp에서 msg.linear.x 와 msg.angular.z에 값을 대입하고 빌드 후
rosrun move_test test_pub
move_test는 패키지 이름이다.