18.如何在实际项目中应用ROS导航相关
2018-02-27 09:34
337 查看
引言
我们知道启动ROS相关应用要么是
roslaunch要么是
rosrun,实际项目中不可能每次手动去运行这些命令,简单的就是写到脚本里去,但是涉及复杂的,就需要使用代码去处理
在代码中启动roslaunch和rosrun
直接贴出代码import subprocess import rospy import rosnode class launch_demo: def __init__(self, cmd=None): self.cmd = cmd def launch(self): self.child = subprocess.Popen(self.cmd) return True def shutdown(self): self.child.terminate() self.child.wait() return True if __name__ == "__main__": rospy.init_node('launch_demo',anonymous=True) launch_nav = launch_demo(["roslaunch", "pibot_simulator", "nav.launch"]) launch_nav.launch() r = rospy.Rate(0.2) r.sleep() rospy.loginfo("switch map...") r = rospy.Rate(1) r.sleep() rosnode.kill_nodes(['map_server']) map_name = "/home/pibot/ros_ws/src/pibot_simulator/maps/blank_map_with_obstacle.yaml" map_node = subprocess.Popen(["rosrun", "map_server", "map_server", map_name, "__name:=map_server"]) while not rospy.is_shutdown(): r.sleep()
上面使用
python代码启动了一个
PIBOT模拟器的导航,然后
5s后切换了一个地图
- 使用
subprocess.Popen可以启动一个进程(
roslaunch或者
rosrun)
- 使用
rosnode.kill_nodes可以杀死一个
rosnode
代码中导航相关应用
定点导航
from launch_demo import launch_demo import rospy import actionlib from actionlib_msgs.msg import * from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal from nav_msgs.msg import Path from geometry_msgs.msg import PoseWithCovarianceStamped from tf_conversions import transformations from math import pi class navigation_demo: def __init__(self): self.set_pose_pub = rospy.Publisher('/initialpose', PoseWithCovarianceStamped, queue_size=5) self.move_base = actionlib.SimpleActionClient("move_base", MoveBaseAction) self.move_base.wait_for_serve 9dcc r(rospy.Duration(60)) def set_pose(self, p): if self.move_base is None: return False x, y, th = p pose = PoseWithCovarianceStamped() pose.header.stamp = rospy.Time.now() pose.header.frame_id = 'map' pose.pose.pose.position.x = x pose.pose.pose.position.y = y q = transformations.quaternion_from_euler(0.0, 0.0, th/180.0*pi) pose.pose.pose.orientation.x = q[0] pose.pose.pose.orientation.y = q[1] pose.pose.pose.orientation.z = q[2] pose.pose.pose.orientation.w = q[3] self.set_pose_pub.publish(pose) return True def _done_cb(self, status, result): rospy.loginfo("navigation done! status:%d result:%s"%(status, result)) def _active_cb(self): rospy.loginfo("[Navi] navigation has be actived") def _feedback_cb(self, feedback): rospy.loginfo("[Navi] navigation feedback\r\n%s"%feedback) def goto(self, p): goal = MoveBaseGoal() goal.target_pose.header.frame_id = 'map' goal.target_pose.header.stamp = rospy.Time.now() goal.target_pose.pose.position.x = p[0] goal.target_pose.pose.position.y = p[1] q = transformations.quaternion_from_euler(0.0, 0.0, p[2]/180.0*pi) goal.target_pose.pose.orientation.x = q[0] goal.target_pose.pose.orientation.y = q[1] goal.target_pose.pose.orientation.z = q[2] goal.target_pose.pose.orientation.w = q[3] self.move_base.send_goal(goal, self._done_cb, self._active_cb, self._feedback_cb) return True def cancel(self): self.move_base.cancel_all_goals() return True if __name__ == "__main__": rospy.init_node('navigation_demo',anonymous=True) launch_nav = launch_demo(["roslaunch", "pibot_simulator", "nav.launch"]) launch_nav.launch() r = rospy.Rate(0.2) r.sleep() rospy.loginfo("set pose...") r = rospy.Rate(1) r.sleep() navi = navigation_demo() navi.set_pose([-0.7,-0.4,0]) rospy.loginfo("goto goal...") r = rospy.Rate(1) r.sleep() navi.goto([0.25,4, 90]) while not rospy.is_shutdown(): r.sleep()
上面完成设置机器人位置和导航到某一位置的功能
相关文章推荐
- 第十五章 分析在实际项目中该如何应用jdbc
- 在实际项目中如何应用门面模式(Facade)
- 数据库中如何写视图,以及视图项目中实际应用
- 在实际项目中如何应用门面模式(Facade)
- ROS探索总结(十六)(十七)(十八)(十九)——HRMRP机器人的设计 构建完整的机器人应用系统 重读tf 如何配置机器人的导航功能
- DOM在java项目中的实际应用(解析XML)
- Android 结合实际项目学会ListView局部刷新和相关知识《一》
- Echarts图表在实际项目中的应用说明
- 如何在项目中应用LinqToSql数据库事务
- 项目中如何应用单元测试-集成测试
- 菜鸟-手把手教你把Acegi应用到实际项目中(6)
- 如何在实际项目中使用before/after伪类的
- json在实际项目中的应用
- Asp.net mvc web api 在项目中的实际应用
- 企业如何实施项目管理:系统与应用
- VisualNet综合布线项目实际应用其三
- Java实际项目中应用的一些技巧(不断更新)
- AtomicInteger在实际项目中的应用
- 常见算法在实际项目中的应用
- 常见算法在实际项目中的应用