/p>
1
2
3
4
5
6
7
1
2
3
4
5
6
7
私有命名與上述提到的命名都不同,它會把原本命名放入到<node_name>下。因此,上面訂閱器的話題的命名如下:
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 測試運行(開四個終端)
ros買粉絲re
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 (買粉絲://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是:機器人操作系統(Robot Operating System)的英文縮寫。
它能為異質計算機集群提供類似操作系統的功能,ROS的前身是斯坦福人工智能實驗室為了支持斯坦福智能機器人STAIR而建立的交換庭(switchyard)項目。到2008年,主要由威樓加拉吉繼續該項目的研發。
ROS提供一些標準操作系統服務,例如硬件抽象,底層設備控制,常用功能實現,進程間消息以及數據包管理。ROS是基于一種圖狀架構,從而不同節點的進程能接受,發布,聚合各種信息(例如傳感,控制,狀態,規劃等等),目前ROS主要支持Ubuntu。
ROS可以分成兩層,低層是上面描述的操作系統層,高層則是廣大用戶群貢獻的實現不同功能的各種軟件包,例如定位繪圖,行動規劃,感知,模擬等等。
ROS功能:
1、通道:ROS提供了一種發布-訂閱式的通信框架用以簡單、快速地構建分布式計算系。
2、工具:ROS提供了大量的工具組合用以配置、啟動、自檢、調試、可視化、登錄、測試、終止分布式計算系統。
3、強大的庫:ROS提供了廣泛的庫文件實現以機動性、操作控制、感知為主的機器人功能。
4、生態系統:ROS的支持與發展依托著一個強大的社區。ros.org尤其關注兼容性和支持文檔,提供了一套“一站式”的方案使得用戶得以搜索并學習來自全球開發者數以千計的ROS程序包。