ROS 使用stage进行(LaserScan)激光扫描仿真

来源:互联网 发布:淘宝网开店卖什么好 编辑:程序博客网 时间:2024/06/06 04:10

以my_stage为例
创建工程名为my_stage的package。
运行以下命令:

cd ~/catkin_ws/srccatkin_create_pkg my_stage std_msgs roscppstd_msgs roscpp 为依赖包

在my_stage 中的src中新建my_stage.cpp文件

/* * my_stage.cpp * *  Created on: Jul 30, 2016 *      Author: unicorn */#include<ros/ros.h>#include<sensor_msgs/LaserScan.h>#include<geometry_msgs/Twist.h>class Stopper{public:  const static double FORWARD_SPEED_MPS = 0.5;  const static double MIN_SCAN_ANGLE_RAD = -30.0/180*M_PI;  const static double MAX_SCAN_ANGLE_RAD = +30.0/180*M_PI;  const static float MIN_PROXIMITY_RANGE_M = 0.5;  Stopper();  void startMoving();private:ros::NodeHandle node;ros::Publisher commandPub;ros::Subscriber laserSub;bool keepMoving;void moveForward();void scanCallback( const sensor_msgs::LaserScan ::ConstPtr& scan);};Stopper::Stopper(){  keepMoving=true;  commandPub=node.advertise<geometry_msgs::Twist>("cmd_vel",10);  laserSub=node.subscribe("base_scan",1,&Stopper::scanCallback,this);}void Stopper::moveForward(){  geometry_msgs::Twist msg;  msg.linear.x=FORWARD_SPEED_MPS;  commandPub.publish(msg);}void Stopper::scanCallback(const sensor_msgs::LaserScan::ConstPtr &scan){  int minIndex=ceil(( MIN_SCAN_ANGLE_RAD - scan->angle_min) / scan-> angle_increment);  int maxIndex = floor(( MAX_SCAN_ANGLE_RAD - scan->angle_min) / scan-> angle_increment);  float closestRange = scan->ranges[minIndex];  for (int currIndex = minIndex + 1; currIndex <= maxIndex; currIndex++) {  if (scan->ranges[currIndex] < closestRange) {  closestRange = scan->ranges[currIndex];  }  }  ROS_INFO_STREAM("Closest range: " << closestRange);  if (closestRange < MIN_PROXIMITY_RANGE_M) {  ROS_INFO("Stop!");  keepMoving = false;  }}void Stopper::startMoving(){ros::Rate rate(10);ROS_INFO("start moving");while(ros::ok()&&keepMoving){  moveForward();  ros::spinOnce();  rate.sleep();}}int main(int argc,char **argv){  ros::init(argc,argv,"stopper");  Stopper stopper;  stopper.startMoving();  return 0;}

修改CMakeLists文件如下

cmake_minimum_required(VERSION 2.8.3)project(my_stage)## Find catkin macros and libraries## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)## is used, also find other catkin packagesfind_package(catkin REQUIRED COMPONENTS  roscpp  std_msgs)## System dependencies are found with CMake's conventions# find_package(Boost REQUIRED COMPONENTS system)## Uncomment this if the package has a setup.py. This macro ensures## modules and global scripts declared therein get installed## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html# catkin_python_setup()################################################## Declare ROS messages, services and actions #################################################### To declare and build messages, services or actions from within this## package, follow these steps:## * Let MSG_DEP_SET be the set of packages whose message types you use in##   your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).## * In the file package.xml:##   * add a build_depend tag for "message_generation"##   * add a build_depend and a run_depend tag for each package in MSG_DEP_SET##   * If MSG_DEP_SET isn't empty the following dependency has been pulled in##     but can be declared for certainty nonetheless:##     * add a run_depend tag for "message_runtime"## * In this file (CMakeLists.txt):##   * add "message_generation" and every package in MSG_DEP_SET to##     find_package(catkin REQUIRED COMPONENTS ...)##   * add "message_runtime" and every package in MSG_DEP_SET to##     catkin_package(CATKIN_DEPENDS ...)##   * uncomment the add_*_files sections below as needed##     and list every .msg/.srv/.action file to be processed##   * uncomment the generate_messages entry below##   * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)## Generate messages in the 'msg' folder# add_message_files(#   FILES#   Message1.msg#   Message2.msg# )## Generate services in the 'srv' folder# add_service_files(#   FILES#   Service1.srv#   Service2.srv# )## Generate actions in the 'action' folder# add_action_files(#   FILES#   Action1.action#   Action2.action# )## Generate added messages and services with any dependencies listed here# generate_messages(#   DEPENDENCIES#   std_msgs# )################################################## Declare ROS dynamic reconfigure parameters #################################################### To declare and build dynamic reconfigure parameters within this## package, follow these steps:## * In the file package.xml:##   * add a build_depend and a run_depend tag for "dynamic_reconfigure"## * In this file (CMakeLists.txt):##   * add "dynamic_reconfigure" to##     find_package(catkin REQUIRED COMPONENTS ...)##   * uncomment the "generate_dynamic_reconfigure_options" section below##     and list every .cfg file to be processed## Generate dynamic reconfigure parameters in the 'cfg' folder# generate_dynamic_reconfigure_options(#   cfg/DynReconf1.cfg#   cfg/DynReconf2.cfg# )##################################### catkin specific configuration ####################################### The catkin_package macro generates cmake config files for your package## Declare things to be passed to dependent projects## INCLUDE_DIRS: uncomment this if you package contains header files## LIBRARIES: libraries you create in this project that dependent projects also need## CATKIN_DEPENDS: catkin_packages dependent projects also need## DEPENDS: system dependencies of this project that dependent projects also needcatkin_package(#  INCLUDE_DIRS include#  LIBRARIES my_stage#  CATKIN_DEPENDS roscpp std_msgs#  DEPENDS system_lib)############# Build ############### Specify additional locations of header files## Your package locations should be listed before other locations# include_directories(include)include_directories(  ${catkin_INCLUDE_DIRS})## Declare a C++ library# add_library(my_stage#   src/${PROJECT_NAME}/my_stage.cpp# )## Add cmake target dependencies of the library## as an example, code may need to be generated before libraries## either from message generation or dynamic reconfigure# add_dependencies(my_stage ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})## Declare a C++ executable add_executable(my_stage src/my_stage.cpp)## Add cmake target dependencies of the executable## same as for the library above# add_dependencies(my_stage_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})## Specify libraries to link a library or executable target against target_link_libraries(my_stage   ${catkin_LIBRARIES} )############### Install ################ all install targets should use catkin DESTINATION variables# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html## Mark executable scripts (Python etc.) for installation## in contrast to setup.py, you can choose the destination# install(PROGRAMS#   scripts/my_python_script#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}# )## Mark executables and/or libraries for installation# install(TARGETS my_stage my_stage_node#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}#   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}# )## Mark cpp header files for installation# install(DIRECTORY include/${PROJECT_NAME}/#   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}#   FILES_MATCHING PATTERN "*.h"#   PATTERN ".svn" EXCLUDE# )## Mark other files for installation (e.g. launch and bag files, etc.)# install(FILES#   # myfile1#   # myfile2#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}# )############### Testing ################# Add gtest based cpp test target and link libraries# catkin_add_gtest(${PROJECT_NAME}-test test/test_my_stage.cpp)# if(TARGET ${PROJECT_NAME}-test)#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})# endif()## Add folders to be run by python nosetests# catkin_add_nosetests(test)

package.xml文件

<?xml version="1.0"?><package>  <name>my_stage</name>  <version>0.0.0</version>  <description>The my_stage package</description>  <!-- One maintainer tag required, multiple allowed, one person per tag -->   <!-- Example:  -->  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->  <maintainer email="unicorn@todo.todo">unicorn</maintainer>  <!-- One license tag required, multiple allowed, one license per tag -->  <!-- Commonly used license strings: -->  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->  <license>TODO</license>  <!-- Url tags are optional, but mutiple are allowed, one per tag -->  <!-- Optional attribute type can be: website, bugtracker, or repository -->  <!-- Example: -->  <!-- <url type="website">http://wiki.ros.org/my_stage</url> -->  <!-- Author tags are optional, mutiple are allowed, one per tag -->  <!-- Authors do not have to be maintianers, but could be -->  <!-- Example: -->  <!-- <author email="jane.doe@example.com">Jane Doe</author> -->  <!-- The *_depend tags are used to specify dependencies -->  <!-- Dependencies can be catkin packages or system dependencies -->  <!-- Examples: -->  <!-- Use build_depend for packages you need at compile time: -->  <!--   <build_depend>message_generation</build_depend> -->  <!-- Use buildtool_depend for build tool packages: -->  <!--   <buildtool_depend>catkin</buildtool_depend> -->  <!-- Use run_depend for packages you need at runtime: -->  <!--   <run_depend>message_runtime</run_depend> -->  <!-- Use test_depend for packages you need only for testing: -->  <!--   <test_depend>gtest</test_depend> -->  <buildtool_depend>catkin</buildtool_depend>  <build_depend>roscpp</build_depend>  <build_depend>std_msgs</build_depend>  <run_depend>roscpp</run_depend>  <run_depend>std_msgs</run_depend>  <!-- The export tag contains other, unspecified, tags -->  <export>    <!-- Other tools can request additional information be placed here -->  </export></package>

新建在my_stage目录下新建launch文件夹,在luanch文件夹下新建my_stage.launch文件

<launch><node name = "stage" pkg="stage_ros" type = "stageros" args="$(find stage_ros)/world/willow-erratic.world"/><node name = "my_stage" pkg = "my_stage" type = "my_stage"output = "screen" /></launch>

运行:

cd ~/catkin_ws //跳转到工作空间目录catkin_makeroscore roslaunch my_stage my_stage.launch

结果显示:

0 0
原创粉丝点击