避障程序理解
关于动作(Action)
1.主要由三部分组成: 目标(goal)、结果(result)、反馈(feedback)
2.actions动作使用客户端-服务器模型,类似于发布-订阅模型。客户端节点(action client)向服务器节点(action server)发送一个目标,服务端节点确认目标并返回一个反馈流和一个结果。
程序片段的理解
python代码中大多以类的方式来完成节点程序的实现。
定义节点:rospy.init_node('nav_test', anonymous=False)
创建动作客户端,即发送goal的部分:
self.move_base = actionlib.SimpleActionClient("move_base", MoveBaseAction)
其中第一个参数为客户端基于的服务器节点,第二个为动作的类型。
创建goal对象,并完成赋值:
goal = MoveBaseGoal()
goal.target_pose.header.frame_id = 'base_link'
goal.target_pose.header.stamp = rospy.Time.now()
goal.target_pose.pose.position.x = 3.0
goal.target_pose.pose.orientation.w = 1.0
发送目标:self.move_base.send_goal(goal)
等待结果:success = self.move_base.wait_for_result(rospy.Duration(60))
返回值为布尔值,判断响应是否成功。
查看当前的计算图:rqt_graph
goal类似于话题,可以查看其具体信息:rostopic info /move_base/goal
第一行为消息类型
查看该类型消息的具体定义:rosmsg show move_base_msgs/MoveBaseActionGoal
该消息为为复合域,缩进表示为上一级的域成员,知道goal中具体的数据类型与构成,才能对其进行赋值。
编写yaml文件
yaml能以字典的形式给出一个参数,该参数能将所有的域进行赋值。
1.创造yaml文件,里面包含了上述的goal的域与额与我们想要赋予的值,用字典方式进行对应:
frame_id: 'base_link'
position: { x: 2.0, y: 5.0, z: 0}
orientation: {w: 1.0}
2.在代码中读入yaml文件,并创建对象对目标进行赋值:
首先需要导入依赖的库:import yaml
之后创建对象:
with open("para.yaml", 'r') as stream:
para = yaml.load(stream)
用with以只读方式打开yaml文件,这样不需要之后的关闭文件的步骤。
之后进行赋值:
goal = MoveBaseGoal()
goal.target_pose.header.frame_id = para['frame_id']
goal.target_pose.header.stamp = rospy.Time.now()
goal.target_pose.pose.position.x = para['position']['x']
goal.target_pose.pose.position.y = para['position']['y']
goal.target_pose.pose.orientation.w = para['orientation']['w']