EtainClub / etainclub_web

이타인클럽 웹페이지
http://etain.club
28 stars 10 forks source link

ROS 다수 로봇 추가 방법에 관한 질문 #6

Closed Cumas closed 7 years ago

Cumas commented 7 years ago

안녕하세요.

ROS 강좌 1. Gazebo Mobile Robot Simulation (Indigo) 보고 노트북에 환경을 구축하고 9번 강의까지 완료 하였습니다.

여기서 로봇 수를 추가하고 싶습니다. 하지만 소스를 어떻게 수정해야할지 감이 잡히질 않습니다.

질문사항

  1. 로봇 수 추가하는 방법(2대이상 여러대의 로봇)
EtainLove commented 7 years ago

말씀하시는 것이 ROS Kinetic 강좌2의 "Gazebo에 kobuki 여러 대 올리기"와 같이 gazebo에 여러 대의 로봇을 추가하는 방법에 관한 것인가요? 그렇다면, 해당 부분 강좌가 없는데, 한 번 만들어 보겠습니다. 아니라면, 보다 구체적으로 말씀 부탁드립니다.

Cumas commented 7 years ago

네 ROS Kinetic 강좌2의 "Gazebo에 kobuki 여러 대 올리기"와 같이 추가하기를 원합니다. 로봇을 추가하여도 ROS 강좌 1. Gazebo Mobile Robot Simulation (Indigo)의 9번까지 동작이 되었으면 합니다.

EtainLove commented 7 years ago

Indigo 버전은 아니지만 Kinetic 버전으로 강좌를 추가하였습니다. ROS Kinetic 강좌2를 참고해 주세요. gazebo에 로봇 여러 대 올리는 것은 소스코드 작성은 필요없고, mesh파일, urdf 파일, launch 파일 등의 작업등으로 가능합니다. 소스코드에서는 각 로봇별 topic을 수신하여 처리하면 됩니다.

Cumas commented 7 years ago

@EtainLove ROS Kinetic 강좌2를 참고하여 4대를 추가하는데 성공하였습니다. 한 대의 로봇일때는 ROS 강좌 1. Gazebo Mobile Robot Simulation (Indigo)기능을 수행하였지만 4대를 추가하였더니 움직이지 않습니다. 위에서 소스코드에서 각 로봇별 topic을 수신하여 처리하면 된다고 하였는데, 어떻게 해야할지 막막합니다. 주변에 물어볼사람도 없고 혼자 해결하려고 했지만 쉽지 않아 도움을 요청합니다.

4대가 ROS 강좌 1처럼 로봇들이 장애물을 회피하면서 주행하려면 어떻게 해야하는지 알려주세요.

EtainLove commented 7 years ago

혹시 python도 하실수 있으세요? 말씀하신 내용을 구현하려면 시간이 좀 거릴거 같은데 일이 급한가요?

Cumas commented 7 years ago

@EtainLove python은 해본적은 있습니다... 장애물 회피 주행이 되어야 다음으로 진행이 될거 같아서요. 일단 저도 계속해서 수정해보고 있겠습니다...

EtainLove commented 7 years ago

@Cumas 간단히 복수의 로봇의 scan callback을 테스트 해봤습니다. 좋은 방법은 아닌데, 깔끔하게 구현하려면 시간이 좀 걸려서 일단 테스트 한 내용을 알려드립니다. Robot 클래스를 만들고, 별도의 클래스에서 로봇 대수 만큼 객체 생성해서 scan subscriber에 각 Robot 객체의 callback 함수를 연결시켜주는 방식입니다. 이게 Robot쪽에서도 ROS가 포함되는 구조라서 별로 좋지가 않네요. 강좌를 하나 만들 예정인데, Robot class는 ROS와 무관하게 구현하고, 이걸 ROS로 wrapping하여 구현하려고 합니다. 일단 지금은 아래 내용을 참고해 보세요.

  1. Robot 클래스를 만든다
    
    class Robot
    {
    public:
    /// scan message callback
    void scanCB( const sensor_msgs::LaserScanConstPtr& _scan, const int _robot_id );
    };

/*

  1. subscriber 개수를 할당한다.

    MultiMRS::MultiMRS()
    {
    scan_sub_.resize(4);
    }
  2. subscriber를 세팅한다.

    void MultiMRS::run()
    {
    int queue_size= 50;
    
    std::string robot_prefix= "/robot_";
    std::string scan_postfix= "/scan";
    // subscribe the scan message
    for( int i=0; i<NUM_ROBOTS; i++ )
    {
    std::string id_str= boost::lexical_cast<std::string>(i);
    ROS_WARN( "id: %d, id_str: %s", i, id_str.c_str() );
    std::string scan_topic_name= robot_prefix + id_str + scan_postfix;
    ROS_WARN( "scan_topic name: %s", scan_topic_name.c_str() );
    scan_sub_.push_back( ros_nh_.subscribe<sensor_msgs::LaserScan>( scan_topic_name,      queue_size, boost::bind( &Robot::scanCB, &robots_[i], _1, i ) ) );
    }
    }
  3. main 함수

    int main( int argc, char** argv )
    {
    // ros init
    ros::init( argc, argv, "multi_mrs_node" );
    
    // create a MRS instance
    MultiMRS mrs;
    // initialize mrs
    mrs.init();
    // ros run
    mrs.run();
    
    // spin ROS
    try
    {
    // ros takes all
    ros::spin();
    }
    catch( std::runtime_error& e )
    {
    ROS_ERROR( "ros spin failed: %s", e.what() );
    return -1;
    }
    return 0;
    }
EtainLove commented 7 years ago

@Cumas 보다 깔끔하게 코드를 구현했습니다. 대략적으로 돌아가는 것까지만 테스트 했습니다. 강좌 형태로 만들예정입니다. ROS Kinetic 강좌3을 참고해 주세요. 아직 내용은 없지만 일요일까지 작성해 보도록 하겠습니다.

EtainLove commented 7 years ago

@Cumas 강좌를 추가했습니다. ROS-Kinetic-강좌3ROS-Kinetic-강좌4를 참고해 주세요.

Cumas commented 7 years ago

@EtainLove 너무나 감사합니다.