博客參考:https://blog.csdn.net/qq_41450811/article/details/80305846python
RoboWare Studio是一個ROS集成開發環境。它使 ROS開發更加直觀、簡單、而且易於操做。可進行ROS工做區及包的管理、代碼編輯、構建及調試。bash
下載連接:https://pan.baidu.com/s/1D169dFyf2OD3SFBZVZy3pQ 密碼:3iuk服務器
準備oop
安裝前,請查看系統環境並確認:
1. 操做系統 爲 Ubuntu。
2. 已完成ROS的安裝配置。ROS安裝步驟可參照官方網站
3. 可以使用 catkin_make 構建ROS包。若沒法構建,可能須要運行:測試
sudo apt-get install build-essential
4. 爲支持 Python 相關功能,須要安裝 pylint網站
sudo apt-get install python-pip
sudo python -m pip install pylint
5. 爲支持 clang-format 相關功能,須要安裝 clang-format-3.8 或更高版本ui
sudo apt-get install clang-format-3.8
安裝spa
下載Roboware Studio最新版,在下載的文檔下,鼠標右鍵調出終端輸入:操作系統
sudo dpkg -i roboware-studio_<version>_<architecture>.deb
i386爲32位版本,amd64爲64位版本. 安裝過程會彈出 用戶協議 能夠按 ESC 選擇確認!.net
啓動
軟件界面以下
新建工做區,選擇用戶目錄下,名稱 : catkin_ws
建立工做空間以後的窗口以下
選擇Release , 而後在上面菜單欄ROS點擊構建:
Ctrl+`調出Terminal, catkin_make構建以後:
測試ros是否正常運行,運行roscore:
測試正常, Ctrl+c結束便可
建立一個包
編輯依賴的ROS包列表
輸入依賴的ROS包, 對應的CMakeLists.txt將生成相應的指令
建立ROS消息和ROS服務
1. 右鍵包名,新建Msg文件夾
CMakeLists.txt 自動加入一些運行依賴(若是不用這個IDE必須手動添加)
編譯以後,先運行roscore再測試下msg:
若是已經將當前工做空間寫到了 ~/.bashrc,能夠直接在工程編譯完後運行,不然仍是要先初始化運行環境
source devel/setup.bash
建立一個Srv空文件夾
srv文件分爲請求和響應兩部分,由'---'分隔。下面是srv的一個樣例:
int64 A int64 B --- int64 Sum
其中 A 和 B 是請求, 而Sum 是響應。
一樣的CMakeLists.txt 自動添加:
下面經過rossrv show命令,檢查ROS是否可以識該服務
從新編譯以後,生成的內容在文件夾下分佈以下
全部在msg路徑下的.msg文件都將轉換爲ROS所支持語言的源代碼。
生成的C++頭文件將會放置在以下位置
~/catkin_ws/devel/include/lee_package/
Python腳本語言會在以下目錄下建立
~/catkin_ws/devel/lib/python2.7/distpackages/lee_package/msg
lisp文件會出如今以下路徑
~/catkin_ws/devel/share/commonlisp/ros/lee_package/msg/
建立消息發佈器 talker 和訂閱器 listener
//listener.cpp #include "ros/ros.h" #include "std_msgs/String.h" void chatterCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str()); } int main(int argc, char **argv) { ros::init(argc, argv, "listener"); ros::NodeHandle n; ros::Subscriber sub = n.subscribe("chatter", 1000,chatterCallback); ros::spin(); return 0; }
//talker.cpp #include "sstream" #include "ros/ros.h" #include "std_msgs/String.h" int main(int argc, char **argv) { ros::init(argc, argv, "talker"); ros::NodeHandle n; ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); ros::Rate loop_rate(10); int count=0; while (ros::ok()) { std_msgs::String msg; std::stringstream ss; ss << "hello ros~!" << count; msg.data = ss.str(); ROS_INFO("%s",msg.data.c_str()); chatter_pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); ++count; } return 0; }
從新編譯,運行
//terminal 1 rosrun ke_package talker //terminal 2 rosrun ke_package listener
顯示效果以下
Listener Node
編寫簡單的服務器和客戶端
源代碼以下
//clients #include "ros/ros.h" #include <cstdlib> #include "ke_package/AddTwoInts.h" int main(int argc, char **argv) { ros::init(argc, argv, "add_two_ints_client"); if (argc != 3) { ROS_INFO("usage: add_two_ints_client X Y"); return 1; } ros::NodeHandle n; ros::ServiceClient client = n.serviceClient<ke_package::AddTwoInts>("add_two_ints"); ke_package::AddTwoInts srv; srv.request.a = atoll(argv[1]); srv.request.b = atoll(argv[2]); if (client.call(srv)) { ROS_INFO("Sum: %ld", (long int)srv.response.sum); } else { ROS_ERROR("Failed to call service add_two_ints"); return 1; } return 0; }
//server #include "ros/ros.h" #include "ke_package/AddTwoInts.h" bool add(ke_package::AddTwoInts::Request &req,ke_package::AddTwoInts::Response &res) { res.sum = req.a + req.b; ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b); ROS_INFO("sending back response: [%ld]", (long int)res.sum); return true; } int main(int argc, char **argv) { ros::init(argc, argv, "add_two_ints_server"); ros::NodeHandle n; ros::ServiceServer service = n.advertiseService("add_two_ints",add); ROS_INFO("Ready to add two ints."); ros::spin(); return 0; }
從新編譯,運行
1. 首先設置斷點
2. 選擇生成的二進制文件
3. 選擇啓動調試
CMakeLists.txt須要將構建工程類型設置以下
SET(CMAKE_BUILD_TYPE Debug) SET(CMAKE_CXX_FLAGS "-g")