• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

ros机器人编程实战(5)- 定义动作

人工智能 布剪刀石头 1186次浏览 0个评论

前言

《ros机器人编程实践》— 第五章动作的定义。 前面尝试了定义自己的消息类型和服务,接下来是定义动作。服务只适用于及时响应的消息类型,和编程的函数基本类似,有自己的输入输出。但是在解决机器人运作问题上服务显然就不够用了,就好比投篮,我们用服务来写只能做到写好一个服务将球投出去,至于球在空中的轨迹,是否进球框就不得而知了。而动作的话可以做到将球投出去,等待球进框或者没进框又做下一步的决策。 这里我们将创建一个计时的动作。  

实现过程

前面的步骤默认已经创建好了ros的工作区和创建好了包basic,在这基础上继续完成动作的创建。 未创建包看这里:ros编程实践(3.1)-创建自己的消息类型  

1、ctrl+alt+t呼出终端,在basic目录下创建action目录,并在action目录下创建Timer.action文件:

 

cd ~/catkin_ws/src/basic/
mkdir action
cd action
vi Timer.action

  输入如下文本在Timer.action中:  

#这坑爹的书把变量全写在注释里了,还好我眼睛比较尖锐。。。坑死我了
#就像这样duration time_to_wait
#你如果中英文隔开我还挺好看出来的,妈妈的全是英文的谁会注意看哦
duration time_to_wait

---
duration time_elapsed
uint32 updates_sent


---
duration time_elapsed
duration time_remaining

  这时可以看看文件目录关系:  
ros机器人编程实战(5)- 定义动作  

2、运行catkin_make

 

cd ~/catkin_ws
catkin_make

 

3、修改CMakeLists.txt

 

cd ~/catkin_ws/src/basic
vi CMakeLists.txt

  3.1、修改find_package()添加action_msgs:  
ros机器人编程实战(5)- 定义动作   3.2、修改add_action_files()中添加FILES Timer.action:  
ros机器人编程实战(5)- 定义动作   3.3、修改generate_message()添加actionlib_msgs:  
ros机器人编程实战(5)- 定义动作   3.4、修改catkin_package()添加actionlib_msgs:  
ros机器人编程实战(5)- 定义动作  

4、在package.xml中加上构建依赖项和运行依赖项:

 

vi package.xml

  粘贴下面两行进去。 <build_depend>actionlib_msgs</build_depend> <exec_depend>actionlib_msgs</exec_depend>   ros机器人编程实战(5)- 定义动作  

5、返回catkin的根目录编译:

 

cd ~/catkin_ws/
catkin_make

 

6、编写基本动作服务器:

6.1、在basic包的src下创建simple_action_serve.py文件:  


cd ~/catkin_ws/src/basic/src
vi simple_action_serve.py
chmod 777 simple_action_serve.py

  输入以下; simple_action_serve.py  

#!/usr/bin/env python

import rospy
import time
import actionlib
from basic.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.2、ctrl+alt+t打开新终端运行roscore:  

roscore

  6.3、返回根目录编译运行脚本:  

cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun basic simple_action_serve.py

   

7、list看是否有相应的服务运行

 
ros机器人编程实战(5)- 定义动作  

8、动作的使用:

8.1、创建动作使用脚本:  

cd ~/catkin_ws/src/basic/src
vi simple_action_client.py
chmod 777 simple_action_client.py

  输入以下: simple_action_client.py  

#!/usr/bin/env python

import rospy
import actionlib
from basic.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()))

  8.2、返回根目录编译运行脚本:  

cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun basic simple_action_client.py

  运行效果:  
ros机器人编程实战(5)- 定义动作  


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明ros机器人编程实战(5)- 定义动作
喜欢 (0)

您必须 登录 才能发表评论!

加载中……