1. 程式人生 > 實用技巧 >建立一個ros功能包

建立一個ros功能包

 一、建立並配置工作空間(workspace)

  工作空間是存放工程開發相關檔案的資料夾,現在較新版本的ROS預設使用catkin編譯系統,該編譯系統的空間比較特殊,所以需要特殊的方式建立。

  1、建立工作空間

    mkdir -p ~/catkin_ws/src                   #在home目錄下建立兩級目錄,先建立catkin目錄,再建立src目錄,必須使用-p選項

    cd ~/catkin_ws/src                      #切換到src目錄

    catkin_init_workspace                     #初始化工作空間

  2、編譯工作空間,此時工作空間為空,經過編譯會生成很多檔案,嚴格來說是遷移來很多檔案

    cd ~/catkin_ws/

    catkin_make                        #catkin自己的編譯命令

  3、初始化環境變數,使環境變數生效

    source devel/setup.bash                    #其實就是執行編譯生成的devel目錄下的setup.bash檔案

  4、驗證環境變數是否有效

    echo $ROS_PACKAGE_PATH                  #列印當前工作空間的路徑,結果如下:,包括剛剛建立的工作空間的目錄就對了,否則,要好好找找原因了。

municationk@developk:~/catkin_ws$ echo $ROS_PACKAGE_PATH
/home/municationk/catkin_ws/src:/opt/ros/melodic/share

  二、在工作空間建立功能包,ROS系統的實現主要靠功能包實現各個功能

  功能包中包含了許多檔案和配置資訊及編譯資訊等,現在較新版本的ROS預設使用catkin編譯系統,該編譯系統對功能包要求比較特殊,所以需要特殊的方式建立。

  1、建立功能包,應用catkin_create_pkg命令

    cd ~/catkin_ws/src                      #切換到程式碼空間,也就是工作空間的src目錄

   catkin_create_pkg learning_com std_msgs rospy roscpp    #建立功能包,並指定有三個功能包依賴

  2、再次編譯工作空間,並設定環境變數

    cd ~/catkin_ws/

    catkin_make                        #編譯

    source devel/setup.bash                   #設定環境變數

  三、在工作空間建立功能包,實現一個簡單的釋出、訂閱程式:主要是新增兩個cpp原始碼talker.cpp和listener.cpp,修改一個編譯配置檔案CMakeList.txt,修改一個功能包配置檔案package.xml檔案

  1、talker.cpp在工作空間的程式碼空間的功能包的程式碼空間中,本文中為:~/catkin_ws/src/learning_com/src/目錄

  2、listener.cpp在工作空間的程式碼空間的功能包的程式碼空間中,本文中為:~/catkin_ws/src/learning_com/src/目錄中

  3、CMakeList.txt在工作空間的程式碼空間的功能包的程式碼空間中,本文中為:~/catkin_ws/src/learning_com/目錄中

  4、package.xml在工作空間的程式碼空間的功能包的程式碼空間中,本文中為:~/catkin_ws/src/learning_com/目錄中

  5、編譯功能包,並設定環境變數

    cd ~/catkin_ws/

    catkin_make                        #編譯

    source devel/setup.bash                   #設定環境變數

  測試,開啟三個終端,在第一終端輸入:roscore,第二個終端輸入:rosrun learning_com talker 第三個終端輸入:rosrun learning_com listener

  在第一終端輸入:roscore,第二個終端輸入:rosrun learning_com talker,第三個終端輸入:rosrun learning_com listener,當在第二個終端中使用ctrl+c將程式中talker的publisher退出,第三個終端中的lisenter的subscriber也無法接受資料

參考部落格:https://www.cnblogs.com/guochaoxxl/p/11303128.html