ros launch 파일 작성 과 노드 시작 순서 제어

6062 단어 RobotOperatingSystem
ROS 는 launch 파일 을 통 해 노드 관리, 초기 매개 변 수 를 설정 할 수 있 지만 launch 파일 은 노드 의 시작 순 서 를 지정 할 수 없 기 때문에 본 고 는 launch 를 통 해 노드 시작 관 리 를 하고 셸 을 통 해 노드 시작 순 서 를 제어 하 는 것 을 간단하게 소개 한다.
1. 저 는 파 라 메 터 를 읽 는 코드 세 션 을 ros: init (argc, argv, "node name") 에 두 었 습 니 다. 그 다음 에 변수 형식 을 정의 한 다음 에 ros: param: get 으로 파 라 메 터 를 가 져 옵 니 다.그 중에서 "~"은 이 매개 변 수 는 개인 적 인 매개 변수 임 을 나타 낸다. 즉, launch 파일 에 써 야 한다.
 ......
 /node>
사이더욱 전면적 인 사유 변수, 네 임 스페이스 는 뒷글 에서 설명 할 것 이다.
다음 예제:
    ros::init(argc,argv,"PCAN_Test");
    init();

    //parameter load test start ......

    string dev_name;
    ros::param::get("~dev_name",dev_name);
    ROS_INFO("PCAN Device:%s",dev_name.c_str());

    bool fifo_send_on=false;
    ros::param::get("~fifo_send_on",fifo_send_on);
    ROS_INFO("FIFO send :%s",fifo_send_on==false?"false":"true");

    bool display_on=false;
    ros::param::get("~display_on",display_on);
    ROS_INFO("Data display:%s",display_on==false?"false":"true");
    //parameter load test end ......
세 개의 변 수 를 정 의 했 습 니 다. devname pcan usb 포트 설정, fifosend_on 과 display 는 fifo 가 보 낼 지, 데이터 디 스 플레이 를 열 지 여 부 를 제어 합 니 다.이번 devname 사용 시 devname.c_str () 는 const char 형식 과 일치 할 수 있 습 니 다. 이 동작 은 string 에 저 장 된 문자열 주 소 를 꺼 내 는 것 입 니 다. 내용 은 string 과 같 습 니 다.
    if(dev_name.c_str() !="")
        pcan_handle = funLINUX_CAN_Open(dev_name.c_str(), O_RDWR );
    else
    {
        pcan_handle = funLINUX_CAN_Open(szDevNode, O_RDWR );//use mapping function
        dev_name=DEFAULT_NODE;
    }
    //judge whether the call is success.if pcan_handle=null,the call would be failed
    if(pcan_handle){
        printf("CAN Bus test: %s have been opened
", dev_name.c_str()); errno = funCAN_VersionInfo(pcan_handle, txt); if (!errno) printf("CAN Bus test: driver version = %s
", txt); else { perror("CAN Bus test: CAN_VersionInfo()"); } if (wBTR0BTR1) { errno = funCAN_Init(pcan_handle, wBTR0BTR1, nExtended); if (errno) { perror("CAN Bus test: CAN_Init()"); } else printf("Device Info: %s; CAN_BAUD_1M; CAN_INIT_TYPE_ST
", dev_name.c_str()); } } else printf("CAN Bus test: can't open %s
", dev_name.c_str()); //initial a talker to publish the force data and can id. ros::NodeHandle force_handle; ros::Publisher force_pub=force_handle.advertise<:forcedata>("ArrayForcePUB",1);//advertise a topic named "ArrayForceDEV" ros::Rate loop_rate(500); //data receive test while(ros::ok()) { //HANDLE h,ros::Publisher pub,int server_fifo_fd,bool display_on,bool publish_on,bool fifo_send_on read_loop(pcan_handle,force_pub,server_fifo_fd,display_on,true,fifo_send_on); if(fifo_send_on) printf("Send Count No.%d\t
",send_count); ros::spinOnce(); loop_rate.sleep(); }
2, launch 파일 에는 다음 과 같이 설정 되 어 있 습 니 다. pkg 후 대응 하 는 파일 의 가방 이름, type 후 CMakeList. txt 에서 해당 파일 에 대한 addexecutable (pcan test src/pcan test) 에서 실행 가능 한 파일 의 이름 입 니 다. python 에 서 는 파일 이름 입 니 다. python 의 실행 가능 한 파일 은 파일 자체 (해석 언어, matlab 와 같 음) 이기 때문에 이번 에는 c++ 프로 그래 밍 을 파일 이름 전체 이름 으로 잘못 쓰 지 마 십시오. name 은 노드 가 시 작 된 이름 을 표시 합 니 다. 이 이름 은 ros: init 에서 초기 화 된 이름 을 덮어 씁 니 다.output 후 매개 변 수 는 화면 에서 인쇄 정 보 를 출력 하 는 것 을 표시 합 니 다. 그렇지 않 으 면 인쇄 정 보 는 임시 파일 에 저 장 됩 니 다.
인자 에 name 은 ros::param::get () 의 첫 번 째 문자열 에서 "~"후의 이름 을 삭제 합 니 다. launch 는 실행 할 때 일치 하 는 것 을 찾 습 니 다. type 은 변수 형식 이 고 value 는 구체 적 인 값 입 니 다.다음은 launch 파일 전문 입 니 다.

	
	
		
		
		
주: src 에서 launch 폴 더 를 만 든 다음 에 launch 파일 을 만 들 면 됩 니 다. 다른 작업 을 하지 않 아 도 됩 니 다.
3. 위 에서 ros::param::get 내용 에 대한 소 개 는 비교적 간단 합 니 다. 보다 전면적 인 launch 의 예 는 다음 과 같 습 니 다. launch 의 개인 변수 와 공유 변수 예 를 포함 합 니 다.


    
    
        
    
group 은 하나의 노드 그룹 으로 특정한 설정 을 통 해 전체 그룹의 노드 작 동 정지 통 제 를 할 수 있 습 니 다. ROS launch 정리 에서 상세 하 게 소개 하 는 것 을 참고 하 십시오.ns 는 네 임 스페이스 입 니 다.
ros::param::get 을 사용 할 때 다음 과 같은 세 가지 관 계 를 포함 하 는 변수 가 있 습 니 다.
/camera_topic_root
/group_ns/camera_topic_ns
/group_ns/node_name/camera_topic_private
따라서 ros::param::get 을 통 해 인 자 를 얻 으 려 면 다음 과 같 아야 합 니 다.
ros::param::get("/camera_topic_root",camera_topic);    // /camera_topic_root
ros::param::get("camera_topic_ns",camera_topic);       // /group_ns/camera_topic_ns
ros::param::get("~camera_topic_private",camera_topic); // /group_ns/node_name/camera_topic_private
4. ubuntu 에서 노드 시작 순 서 를 제어 하 는 간단 한 전략 은 셸 을 통 해 이 루어 지 는 것 이다.
새 파일 의 이름 은 xxx. sh 입 니 다.
#!/bin/bash

roslaunch bhand_controller bhand_controller.launch &
sleep 5
echo "bhand controller starting success!"

roslaunch beginner_tutorials bhand_force_control.launch &
sleep 0.1
wait
exit 0
첫 번 째 줄 은 bash 로 실행 하고 sleep 는 프레젠테이션 을 표시 하 며 echo 는 일정한 내용 을 출력 하 는 데 사 용 됩 니 다. ubuntu 셸 에 관 한 다른 조작 은 문장 뒤의 '&' 기 호 를 잊 지 않 고 관련 자 료 를 스스로 조회 할 수 있 습 니 다.따라서 정책 은 특정한 노드 가 먼저 실행 되 어야 한다 면 launch 파일 을 따로 작성 한 다음 셸 통 제 를 통 해 먼저 시작 할 수 있 습 니 다.
작성 저장 후 터미널 에서 xxx. sh 에 게 실행 권한 을 부여 합 니 다. sudo chmod a + x xxx. sh 이후./xxx. sh 를 통 해 시작 할 수 있 습 니 다. xxx 는 임의의 문 자 를 대표 합 니 다.

좋은 웹페이지 즐겨찾기