ros怎麼單獨編譯一個功能包
❶ 如何自定義ros的action服務
1 創建工程
cd ~/catkin_ws/src
catkin_create_pkg action std_msgs rospy
2 設計action定義文件,內容有goal feedback result
這個和service的srv文件很像,放置再工程目錄的action目錄下
ration time_to_wait #goal,客戶端發送的等待總時間
---
ration time_elapsed #result ,伺服器端發送的等了多久,
uint32 updates_sent #更新多少次
---
ration time_elapsed # feedback,伺服器端周期性的發送已等了多久
ration time_remaining #還剩多久
3 修改CMakeLists.txt文件,配置默認支持
3.1 增加模塊actionlib_msgs
find_package(catkin REQUIRED COMPONENTS
..... #其他已有模塊
actionlib_msgs#增加
)
3.2 增加action服務定義文件
add_action_files(
DIRECTORY action
FILES Timer.action
)
3.3 action的msg
generate_messages(
DEPENDENCIES
actionlib_msgs
std_msgs
)
3.4 catkin的msg支持
catkin_package(
CATKIN_DEPENDS
actionlib_msgs
)
4 編譯工程
cd ~/catkin_ws
catkin_make
5 編寫action伺服器端程序
#!/usr/bin/env python
import roslib; roslib.load_manifest('action')
import rospy
import time
import actionlib
from action.msg import TimerAction, TimerGoal, TimerResult
def do_timer(goal):
start_time = time.time()
time.sleep(goal.time_to_wait.to_sec())
result = TimerResult()
result.time_elapsed = rospy.Duration.from_sec(time.time() - start_time)
result.updates_sent = 0
server.set_succeeded(result)
rospy.init_node('timer_action_server')
server = actionlib.SimpleActionServer('timer', TimerAction, do_timer, False)
server.start()
rospy.spin()
6 編寫ros的action客戶端程序
#!/usr/bin/env python
import roslib; roslib.load_manifest('action')
import rospy
import actionlib
from action.msg import TimerAction, TimerGoal, TimerResult
rospy.init_node('timer_action_client')
client = actionlib.SimpleActionClient('timer', TimerAction)
client.wait_for_server()
goal = TimerGoal()
goal.time_to_wait = rospy.Duration.from_sec(5.0)
client.send_goal(goal)
client.wait_for_result()
print('Time elapsed: %f'%(client.get_result().time_elapsed.to_sec()))
7 測試運行(開四個終端)
roscore
rosrun action action_c.py
rosrun action action_s.py
8 查看信息
liao@liao-eagle:~/catkin_ws/src/action/src$ rostopic list
/rosout
/rosout_agg
/timer/cancel
/timer/feedback
/timer/goal
/timer/result
/timer/status
liao@liao-eagle:~/catkin_ws/src/action/src$ rostopic info /timer/goal
Type: action/TimerActionGoal
Publishers: None
Subscribers:
* /timer_action_server (http://liao-eagle:42857/)
liao@liao-eagle:~/catkin_ws/src/action/src$ rosmsg show TimerActionGoal
[action/TimerActionGoal]:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
actionlib_msgs/GoalID goal_id
time stamp
string id
action/TimerGoal goal
ration time_to_wait
liao@liao-eagle:~/catkin_ws/src/action/src$ rosmsg show TimerGoal
[action/TimerGoal]:
ration time_to_wait
9 rqt_graph
❷ 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等按鍵,控制機器大掘擾人移動:
過程圖如下,記得運行前要刷新環境,或者用上面的方法把刷新命令添加到腳本:
吶,對比上圖,我把它移到了簡介牌的右邊:
❸ ROS使用python3
參考:
為了使用python3的圖像處理程序,需要使用到ros介面,但是由於原生ros介面不支持python3,只能使用python2.7(時間2020-07,版本melodic),一下步驟主要為了使用ros調用的方式調用python3的程序
由於ros接收圖像數據使用的是cv_bridge 介面,所以先編譯python3版本的cv_bridge
注意:此時要先安裝好python3的環境,可以按照以下方式安裝
進入到工作空間進行編譯
會有如下提示
編譯完成後,可以在工作路徑下的install文件夾里生成需要的庫,需要使用python3版本的cv_bridge時,就將這個環境變數導入即可
extend參數的作用是讓這次的路徑配置不影響之前配置好的路徑
1. 在使用rosrun 運行程序時,默認還會調用原生melodic的cv_bridge
我的處理方法是將原來的python版本cv_bridge刪除
2. 編譯完成會有錯誤提示,如下圖,但不影響使用
編譯安裝:
在編譯時,使用如下命令:
編譯過程中會有錯誤提示
解決方法:
參考 https://answers.ros.org/question/257757/importerror-no-mole-named-em-error/
編譯完成如下:
運行roscore錯誤提示
安裝netifaces
參考 https://github.com/frescobaldi/python-poppler-qt5/issues/29
https://launchpad.net/ubuntu/+source/sip4/4.19.21+dfsg-1build1
解壓安裝
❹ Ros中msg創建.h的問題
自己測試結果如下,當你按照wiki教程寫好cmakelist.txt之後,第一次catkin_make會生成Num.h。之後就可以 #include <pkg_name/Num.h>了。
❺ ROS2相對於ROS1的一些編譯區別
的方式
注意:ament_target_dependencies只能鏈接find_package()找到的包逗豎,如果是自定義的庫文件,仍需要使用target_link_libraries的方式鏈接山答大
ros1
ros2
ros2中的訂閱者類明和創建方舉早式如下: (注意名字)
訂閱回調為成員變數時 ,參考 https://github.com/ros2/examples/blob/master/rclcpp/minimal_subscriber/member_function.cpp
另外回調函數如下,可以使用ptr,但不支持ptr引用傳值
使用message_filter 同步時,回調函數不需要佔位符,可如下使用:
❻ 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的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服務。
❽ GDB ROS調試
ROS中用到第三方庫,在編譯第三方庫的時候,加上 -g 選項,以供芹困調用該庫時調試。
在編譯ROS包的時候,使用如下命令編譯:
catkin_make -DCMAKE_BUILD_TYPE=Debug
GDB啟嫌頌念動應用
rosrun --prefix 'gdb -ex run --args' 櫻余 package node
之後就可以正常使用GDB命令來調試了,因為第三方庫編譯加了 -g 選項,所以可以進入調用庫中的函數進行調試。