導航:首頁 > 源碼編譯 > 編譯ros的功能包

編譯ros的功能包

發布時間:2023-09-12 04:23:51

A. 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的工作空間中重新編譯就完成了!

B. 如何編寫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服務。

C. ROS(機器人操作系統)

現在還只是個草稿,後面會陸續更新改正,保證大家一看就會,絕對不廢

只是幫助大家理解,很多知識點只是類比推理,是有錯誤的,哈哈,勿噴

蠻多人在學習ROS的時候,其實還是不太理解什麼是ROS,為什麼要去ROS,以及怎麼樣去學習ROS,我大二的時候開始接觸到ROS,也經歷過比較痛苦的一段時間,所以希望用這篇文章來幫助大家對ROS有一個較好的理解。

首先我們拋開ROS來說,如果我們要寫一個程序,程序需要完成特定的功能,就拿C語言中的加法函數來說吧。我們定義了一個加法函數,輸入兩個整數最後返回兩個整數的和,然後定義完函數以後,在main()函數里調用這個加法函數,就可以在鍵盤上輸入兩個整數,然後計算兩個整數的和了。

那麼問題來了   如果我要在別的程序需要使用加法函數所返回的值,應該怎麼做呢?

一種方式  定義一個全局變數,將加法函數返回的值賦給這個全局變數,那麼在一個工程文件下的程序都可以使用這個全局變數了,這就達到了其他程序使用這個變數的目的了

那麼問題又來了,如果不是在同一個工程目錄下的程序,要怎麼樣才能使用到這個加法函數的返回值呢?

一種方式  將第一個程序的加法返回值寫到一個文檔中,然後其他程序去讀這個文件,這樣也可以達到使用這個數據的目的了

上面的例子,想給大家傳遞的知識點就是  我們在寫程序的時候,大多數人是只有一個main()函數的,也就是只有一個可執行文件,那麼問題就來了,要是不同的main()函數之間需要相互使用對方的數據,那應該怎麼辦呢,這就引申出了程序與程序之間到交流問題,也就是通信問題。這也是ROS裡面我個人覺得必須首先要搞清楚的問題。大家先理解到這個地方,然後往下看。

開始進入主題  到底什麼是ROS,ROS就是Robot Operating System 的縮寫,這大家都知道,對吧,翻譯成中文也就是機器人操作系統,可是除了這個大家對操作系統是什麼大家有了解過么,為什麼需要操作系統,也就是操作系統能幹什麼,大家有簡單的了解過么

操作系統(先空白,後面再填坑)

在了解操作系統以後,我們就可以開始分析我們的機器人操作系統了,話不多說,先放狗,不不不,先放圖:

我們知道,操作系統本身也是一個軟體,但是他的特殊之處在於能夠完成對硬體的調配,而其他的應用軟體,比如網易雲,他如果想放歌,他需要打開播放器,是得需要操作系統去完成的,它本身沒有這個能力去直接打開播放器,而是對操作系統說,大哥,能不能幫我打開一下播放器,求求你了,哈哈。

我們也知道,在win上安裝了許許多多的軟體,向上面的solidworks(三維制圖軟體),matalab(數據計算軟體) QQ(聊天軟體)   網易雲 (聽歌軟體) 騰訊視頻(播放軟體)......

那麼問題又來了  你能讓你的扣扣去跟網易雲說  我想聽歌,然後網易雲就會打開播放么,當然你要是杠桿定理學得好,那我認了,哈哈,大多數人是應該是覺得這應該不可以,因為扣扣怎麼跟網易雲通信嘛,對吧。

所以我們安裝在win上的各個軟體只負責自己的問題,不會跟其他的軟體有過多的交流。

哈哈,所以我有了一個大膽的想法,讓我的電腦同時登錄3個扣扣,那麼這三個扣扣總該可以相互發消息了吧,沒錯,這就是我想要講的東西,我只在我的電腦上安裝三個軟體 也就是3個扣扣軟體,他們肯定是可以相互交流的。因為他們是同一類軟體。

是的,ROS也是這么乾的,在ROS上也安裝了向扣扣這樣的可執行程序,只不過在ROS中換了個說法,可執行程序叫做節點,這應該不拿理解吧。要記住在ROS上安裝了許許多多的軟體哦,也就是許許多多的可執行程序,也就是許許多多的節點,如果你現在理解了節點是什麼了,那麼恭喜你,已經邁出了一小步了,你說巧不巧,安裝在ROS上的這些程序,它還可以相互通信,也就是相互交流,哈哈。

好了,理解到這一步呢就理解了節點是個什麼東西了。

下面又開始了一個新的例子,我們的手機上有一個扣扣,我們需要和其他人聊天對吧,那麼你知道你要和別人聊天需要先做什麼么,你肯定說,登錄賬號加好友啊,不對的,首先要做的就是把騰訊的伺服器打開,不然你登錄不上去的,也就是說,騰訊的伺服器不打開,你是登錄不上扣扣的,只不過這一步不是我們操作的,人家的伺服器他已經給我門打開了,然後我們再登錄扣扣,想一下,我們在登錄的時候,做了什麼,對吧,大家都知道,我們也就是輸入賬號密碼就可以登錄了吧對吧,這個過程呢就是向騰訊的伺服器注冊自己的信息,告訴騰訊伺服器,我上線了,然後騰訊伺服器就把你加入到注冊表中,裡麵包含了你的一些信息,你想要和別人連天,那麼別人是不是也要跟你一樣,也要先登錄,過程和你的一樣,所以這個時候,騰訊伺服器那邊是已經有了你和你想要聊天的對象的一些信息的,比如ip地址之類的東西,這樣,你想發消息給你的朋友(後面再填坑)

類比一下 伺服器 就相當於ROS裡面的ros master

只不過這個rosmaster需要我們自己開啟而已。

事實上,ros並不是一個操作系統,他並不能直接運行在硬體之上,只不過他把硬體做了一個給操作系統的介面  和網易雲一樣   網易雲大不了就使用一個喇叭唄,只不過ros使用了太多的硬體,比如激光雷達,相機,編碼器,imu等等。

因此ROS本身也就是一個軟體,和qq一樣,運行在操作系統之上,所不同的是,在ROS上又可以安裝許許多多的同類軟體,這些安裝在ROS上的程序(節點)之間可以按照ROS所規定的通訊機制進行相互交流通訊。比如激光雷達節點(程序)通過ROS提供的介面,讓操作系統把激光數據傳上來,交給建圖所需要的Gmapping節點使用,然後Gmaping節點把所構建的地圖給move_base節點使用,move_base節點的輸入是一個速度和角度的命令,先由move_base下發給ros,然後ros下發給操作系統,然後操作系統調用硬體,在這里是電機,讓電機按照ROS下發的速度的角速度進行運動.

大家應該會有一點點理解了吧

總結下  就是ros是一個類似於win上的一個軟體,但是這個軟體上又安裝了很多軟體,在ros上安裝的這些軟體可以相互通信,然後可以藉助ROS,去調用操作系統去調用硬體。

這就是為什麼我們每次想要聊天的時候,需要先打開qq這個軟體,也就是我們想要用ROS的時候,先運行roscore這個命令打開ROS了吧

接下來是 

ros中的通訊方式

ros中的一些工具

ros中的一些已經有了的功能包(演算法

慢慢寫,不著急

D. 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

E. GDB ROS調試

ROS中用到第三方庫,在編譯第三方庫的時候,加上 -g 選項,以供調用該庫時調試。

在編譯ROS包的時候,使用如下命令編譯:

catkin_make -DCMAKE_BUILD_TYPE=Debug  

GDB啟動應用

rosrun --prefix 'gdb -ex run --args'  package   node  

之後就可以正常使用GDB命令來調試了,因為第三方庫編譯加了 -g 選項,所以可以進入調用庫中的函數進行調試。

F. 如何使用 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}
)

G. ros 怎麼單獨編譯一個指定的包

切換到自己的ROS工作空間: $ cd ~/catkin_ws
如果你想編譯整個工作空間裡面的包:$ catkin_make
如果你只想編譯工作空間某一個包:$ catkin_make -DCATKIN_WHITELIST_PACKAGES= "包名"
例如:

閱讀全文

與編譯ros的功能包相關的資料

熱點內容
買了伺服器如何架設 瀏覽:929
如何運用mex函數編譯c 瀏覽:896
24歲程序員倒在工作上 瀏覽:919
怎麼算梁的加密區 瀏覽:93
2016版office怎麼解壓 瀏覽:270
怎麼把安卓手機調的更暗 瀏覽:167
蘋果空間新演算法 瀏覽:91
android文字動畫效果 瀏覽:146
java調試命令 瀏覽:213
android子線程looper 瀏覽:782
linux安裝java7 瀏覽:189
單片機fdh 瀏覽:107
單片機原理與應用下載 瀏覽:590
順風車車主app在哪裡下載 瀏覽:235
雷石柏雲伺服器功率 瀏覽:102
全球服是什麼伺服器 瀏覽:237
感測器怎麼連接伺服器 瀏覽:705
大數學pdf 瀏覽:646
哪個app可以登記自己的藏書 瀏覽:89
怎麼用車貸款哪個app好 瀏覽:7