① ROS中分析catkin_make編譯信息的方法
在使用catkin_make編譯時,在終端中會有很多列印,導致非常難找錯誤信息。
一個小竅門就是:
在終端中使用以下命令執行編譯:
此時在終端中只顯示錯誤信息列印以及cmake中使用message 列印的信息。
另外開啟新的終端 輸入命令: tail -f logs 查看編譯的列印信息。
② ROS Melodic筆記:catkin_make報錯Invoking "make cmake_check_build_system" failed
按照官網的要求安裝好了ROS Melodic(Ubuntu18.04.5),但是catkin_make命令一直報錯。
網上雖然有很多catkin_make報錯的解決辦法,但是沒有出現我這個報錯信息的。
還是需要從具體報錯信息裡面看,
缺少 rospy 軟體包。
網上有大佬針對提示缺少 gazebo_ros_control 功能包給出的解決方案是
依樣畫葫蘆寫了我的安裝命令
之後再運行 catkin_make 就沒有報錯信息了。
參考:
https://blog.csdn.net/weixin_43262513/article/details/88087849?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-js-2.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-js-2.nonecase
③ ROS 工作空間、package 及 catkin 編譯系統
本文內容都可以在 ROS 官網 wiki ( http://wiki.ros.org/ROS/Tutorials )中找到,作者只是根據自己的理解重新闡述了其中的某些內容,或許能幫助讀者更好的理解 ROS 系統中的一些概念。首先保證 ROS 已經正確安裝了。安裝方式可以參考 本博客的另一篇文章 。
簡單地說,ROS workspace (工作空間)就是統一存放 ROS 文件的地方,比如一個項目的所有 ROS 文件最好都放在一個 workspace 中,便於統一管理、編譯和調用。
catkin 是目前 ROS 的編譯系統,自 ROS Groovy 版本開始使用,取代了之前的 rosbuild 編譯系統。
ROS workspace 中可以包含若干 ROS package,每個 package 內部包含實現某些特定功能的文件。
其中,~ 表示當前用戶的 home 目錄, -p (parent)參數可以創建某個文件夾和它的父文件夾,也就是兩層的路徑。這里 workspace 的名字是 catkin_ws,這個名字可以按照自己項目的內容設定,但是 src 這個文件夾的名字是固定的。
初始化工作空間。這里 src 就是以後存放 ROS 源文件的地方。上述命令之後,會在 src 目錄下產生 CMakeLists.txt 文件,這實際上是一個鏈接到ROS 安裝目錄下的 /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake 一個超鏈接文件,對工作空間做了一些初始設置。不用去管它,也不要隨便修改它。
會一次性編譯 src 文件夾中的所有源文件,同時生成 devel 和 build 兩個文件夾。
實際上,catkin_make 這個命令並沒有特別神奇的地方,它只是把一系列基本的編譯命令整合在了一起,一個 catkin_make 命令相當於如下的一系列命令:
如果要深入研究 catkin_make 編譯方式,可以參考 這篇文章 。
將 workspace 的信息載入系統環境變數。
這種方法載入的信息只對當前 terminal 有效。新開一個 terminal 就無效了。如果要對每個 terminal 都有效,可以將上述命令寫入用戶 home 路徑下的 .bashrc 文件中:
注意,.bashrc 文件是隱藏文件,在 home 路徑下通過命令
命令可以看到。
還要注意, >> 是將 echo 後邊的內容寫入文件的尾部,如果用 > 則要覆蓋原文件,一定不要搞錯。
編譯之後,由於我們只是一個空的 workspace,還沒有任何 package,所以沒有什麼實質性的東西,只是告訴系統這里有個 ROS workspace,算是在系統中注冊了一下。
package 是組織 ROS 文件的基本單元,一般來說,每個 package 完成一些特定功能。
package 中至少包含兩個文件: package.xml 和 CMakeLists.txt.
package 在 workspace 中的存放結構一般如下:
也可採用其他的結構,但是要注意 package 之間不能嵌套,也就是在一個 package 中,不能再創建另一個 package ,所有 package 都必須是相對獨立的目錄。
用 catkin 創建 package 的過程很簡單,用如下命令:
其中 depend 為依賴的其他 package。這樣創建之後,package 中的 CMakeLists.txt 和 package.xml 中會體現出這種依賴關系。創建時也可以不指明依賴關系,在後續編譯 package 的時候再補上。
創建好了 package,就可以使用 rospack 相關的命令進行查找、進入等操作了。不過,有時會有延遲,可以用命令
或者
查找、更新一下。
上述方式創建了 ROS package,然後就可以在其中編寫 源文件了,可用的語言主要是 c++, python,我們現在的項目中還用到了 Julia。這里就不再細述具體的源文件編寫過程了。
創建好了源文件,如果是 c++ 編寫的,要編譯一下。這里要設置好 package.xml 和 CMakeLists.txt 中的信息。如果依賴的 package 已經設置好了,就不需要修改 package.xml 了,只需要在 CMakeLists.txt 中添加源文件對應的編譯信息如下:
實際上在 CMakeLists.txt 中有非常全面的模板,很容易找到在哪裡添加這些編譯文件信息。
設置好了編譯信息,就可以回到 workspace 的 src 所在文件夾中,用如下命令編譯:
該命令可以一次性編譯 src 中的所有 package。如果只想編譯指定的 package,可以用如下命令:
但是,這個命令似乎有時不太管用,根據我們的實際經驗,最有效的方法是用如下的 whitelist 命令:
這樣就是只編譯 package1 和 package2。但是要注意,該命令中的 whitelist 具有記憶功能。用完該命令之後,下次如果要編譯 src 中所有的 package,如果只用 catkin_make,則還是只編譯 whitelist 中的 package,需要用如下命令清除一下 whitelist
以上就是我們使用 ROS 中的一些基本操作,希望其中的一些內容對讀者有幫助。
Written by SH
Revised by QP
④ 什麼是ros build cmake
這個已經淘汰了。
ros裡面有兩種編譯方式:ros_build和catkin_make。因為是基於cmake編譯的,所以叫ros build cmake。但是ros build cmake用起來麻煩,修改一次程序往往重編譯很麻煩,改很多配置文件。
現在基本都用catkin make。
⑤ 如何編寫ros的python程序
ROS Indigobeginner_Tutorials-10編寫ROS話題版的Hello World程序(Python版)
我使用的虛擬機軟體:VMware Workstation 11
使用的Ubuntu系統:Ubuntu 14.04.4 LTS
ROS版本:ROS Indigo
1. 前言 :
Hello world程序,在我們編程界,代表學習某種語言編寫的第一個程序。對於ROS機器人操作系統來說,這個Hello World程序就是 : 寫一個簡單的消息發布器(發送) 和 訂閱器(接收)。
2. 准備工作 :
C++的程序都會存放在每個程序包的src文件夾里。Python不同,Python程序都存放在scripts文件夾中, 反正意思都是源文件包。
Step 1 .所以,先在beginner_tutorials軟體包中創建一個scripts文件夾:
$ roscd beginner_tutorials$ mkdir scripts$ cd scripts123
3. 編寫消息發布器節點程序:
如果你懶得去寫的話,你可以使用wget命令, 在github上獲取一個talker.py源代碼。如何獲取呢 ?
Step 2 .開一個終端,輸入下面的命令就可以獲取talker.py:
$ wget
-devel/rospy_tutorials/001_talker_listener/talker.py$ ls
talker.py123
但是我建議你親自動手,寫一寫:手動創建一個talker.py文件在/scripys文件夾里:
$ roscd beginner_tutorials/scripts$ gedit talker.py12
將這上面鏈接里的代碼手動輸入到talker.py文件中。(我就不將代碼貼上來了)
下面我來講解一下代碼:
這些足以說明,hello_world_topic.launch啟動腳本文件,啟動成功。
總結:發布器和訂閱器是很簡單的, 就是簡單的發布一個 自定義的話題。
我之前使用說過:節點之間通訊的方式有兩種 : 話題(rostopic) 和 服務(rosservice)
所以,接下來,我們會講:使用ROS服務來完成ROS版Hello World程序的例子。但是在這之前,我們需要學一學:如何創建自定義的ROS消息和ROS服務,以便ROS服務版的Hello World程序的編寫。
所以下一講,我們來學習:如何創建自定義的ROS消息和ROS服務。
⑥ ros中catkin是什麼意思
是ros中make的一直編譯方式,ros種特有,叫做catkin_make。
常式中新手簡歷文件夾叫catkin_ws。
並沒有其他意思。
⑦ ROS+CPP初識
第一部分:老四樣
1. sudo apt update;
2. sudo apt upgrade;
3. 啟動 roscore;
4. 啟動 turtlesim turtlesim_node;
5. 啟動 turtlesim turtle_teleop_key;
第二部分:學習使用 rosbag 進行軌跡錄制回放操作
1. mkdir ~/bagfiles;
2. cd ~/bagfiles;
3. rosbag record -a
訂閱並記錄所有主題發布的信息,用鍵盤控制小烏龜走出路徑;
4. rosbag info <bagfiles_names>
查看記錄文件的相關信息,其中包括了時長、大小、錄制時間等;
rosbag play <bagfiles_name>
正常模式播放軌跡記錄文件
5. rosbag record-O subset <topic_names>
覆蓋並記錄部分主題發布的消息
rosbag play -r2 subset <topic_names>
提高兩倍發送消息的速度;
第三部分:學習使用 roswtf 檢查錯誤
1. ps -ef | grep -i rosmaster
檢查 rosmaster 是否已經啟動,如果沒有啟動可以通過 roscore 命
令啟動相關命令;
2. roswtf
進入~/catkin_ws/devel 通過 roswtf 命令尋找errors or warnings;
3. rostopic list -v
列出所有活躍的 topic
第四部分:建立工作空間和包,運行程序
1. http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringR
OSEnvironment
新建工作空間;
2. 在.bashrc 中添加新的工作空間的路徑;
3. 新建 agitr 包(a gentle introction to ros)
進入工作空間;
catkin_create_pkg std_msgs rospy roscpp
4. 將准備好的源文件輸入到 agitr 包的 src 文件夾中,並修改
CMakeList.txt 文件與 package.xml 文件;
5. 回到工作空間目錄下
catkin_make
編譯成功;
6. 逐個測試 1. roscore 2. rosrun agitr xxx.cpp helloworld.cpp
pubvel.cpp
隨機發送速度與方向給 turtlebot
subpose.cpp
顯示 turtlebot 當前位置與方向
注意:如果不用鍵盤輸入消息,右上角的界面還是會跳動。這意味著 subpose
是不停運作的,並非發送了指令以後才會激活。這也保證了記錄的完整性。(從
上次的實驗可以看出,如果發布-訂閱的通信方式具有首尾丟包的缺點,如果是
一動一記很有可能會漏掉部分操作的記錄)
此外,應當盡早進行鍵盤控制,否則記錄時間過長佔用內存。
count.cpp
隨機發送錯誤警告
throttle.cpp
有規律地發送報錯信息
第五部分:設計一個能畫出等邊三角形的烏龜
(解析詳見理論作業)
四、實驗分析及結論
1. 不 要 輕 易 修 改 在 工 作 空 間 /src 目錄下的
CMakeLst.txt,否則可能會導致生成 target 重名報錯
通常情況下,配置需要的包內的 CMakeList.txt 就可以滿
足需求;
2. 在修改 CMakeList.txt 與 package.xml 文件時,應當
注意讓.xml 的<build_depend>語句包含的包與.txt 文件中
find_package()語句包含的包一摸一樣
3. 在修改 CMakeList.txt 的時候,在最後應當加上
語句,生成相關 target 文件用於執行。
4. 命令 roswtf 顯示的報錯大概率不用在意,不會影響正
常運行。
⑧ 如何使用 sdk交叉編譯ros
使用ros_qtc_plugin插件新建項目
使用插件新建項目Import ROS
Workspace選項僅新建工作空間導入現工作空間新建文件ROS面Package、Basic
Node等選項創建package節點、launch文件、urdf文件等
現我創建新catkin工作空間,並且面創建package
1、新建項目
文件——新建文件或項目選擇Import ROS Workspace——choose圖
填寫catkin工作空間名字位置圖
我Namecatkin工作空間文件夾名字相同(同)名catkin_new選擇瀏覽——創建文件夾創建名catkin_new文件夾圖按車再選擇打
現框詢問新建工作空間未初始化否執行初始化我選擇yes
相於執行catkin_init_workspace命令使工作空間初始化
點擊Generate Project File再點擊步
項目管理步驟配置版本控制系統我選擇完圖
建工作空間catkin_new空圖
2、創建package
接我工作空間創建新package
catkin_new面src右鍵單擊選擇添加新文件圖
選擇ROS——package——choose
填寫package名字test1
填寫作者(Authors)維護者(Maintainers)Qt環境部沒配置文支持請要用文否則新建package或者新建package面package.xml空文件
DependenciesCatkin欄填寫依賴通用C++寫節點需要添加roscpp依賴
圖
點擊完
3、添加新節點
目前package空沒任何節點
我test1src文件夾右鍵單擊選擇添加新文件
選擇ROS——Basic Node——choose創建節點新建.cpp文件
節點名稱寫node1則名node1.cpp源文件
用ROS模板新建node1.cpp源文件圖自Hello World程序
4、編譯節點
讓編譯執行文件我需要編輯test1makefile圖
test1CMakeLists.txt加面幾行意思node1.cpp編譯名node1節點
add_executable(node1 src/node1.cpp)
target_link_libraries(node1
${catkin_LIBRARIES}
)
⑨ ros編譯提示缺少鏈接庫怎麼辦
一、標准:ROS功能包中調用第三方靜態庫
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node src/source.cpp
include/source.h
)
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
${PROJECT_SOURCE_DIR}/lib/第三方庫名
)
以上一般情況下都沒問題,但是有些靜態庫沒有添加pie系統保護功能,導致程序轉載的地址是無效的,所以我們在鏈接時候也需要關閉pie功能。
註:引入PIE的原因是讓程序能裝載在隨機的地址,通常情況下,內核都在固定的地址運行,如果能改用位置無關,那攻擊者就很難藉助系統中的可執行碼實施攻擊了。類似緩沖區溢出之類的攻擊將無法實施。而且這種安全提升的代價很小
二、解決鏈接未開啟pie功能的靜態庫時,編譯報錯
先作對比:
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node src/source.cpp
include/source.h
)
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
${PROJECT_SOURCE_DIR}/lib/第三方庫名 -no-pie
)
與一般的鏈接形式對比,我們只是在鏈接第三方庫的後面加了-no-pie,之後再到ROS的工作空間中重新編譯就完成了!
⑩ ROS_安裝一個第三方模擬軟體包——機器人模擬世界
安裝依賴:
過程圖:
注意:以上命令非常重要,缺少依賴將導致軟體包無法正常編譯和運行。
在開始編譯之前,需要確保Gazebo在7.0版本以上
接著回到catkin_ws下編譯:
過程圖:
過程圖:
首先需要解決一個問題,不然待會兒運行時會閃退:
下面是運行過程圖(是的,一開始可能會遇到一個報錯 [robot_spawn.launch] is neither a launch file in package [robot_sim_demo] nor is [robot_sim_demo] a launch file name The traceback for the exception was written to the log file ,然而下面的過程圖已經是從報錯到解決報錯成功運行的過程了):
再打開一個終端,輸入以下命令,用鍵盤控制機器人移動,聚焦控製程序窗口,按下i、j、l等按鍵,控制機器人移動:
過程圖如下,記得運行前要刷新環境,或者用上面的方法把刷新命令添加到腳本:
吶,對比上圖,我把它移到了簡介牌的右邊: