ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Ammar's profile - activity

2021-08-05 08:33:33 -0500 marked best answer move_base planning to a Goal

Hello All, I am using move_base to send simple goals to a robot within stage. Is it possible for the robot to execute goals that are beyond its current laser range? For example it executes goals, that are in a certain local vicinity, perfectly. However for goals on the other end of the map, it is unable to plan a path. It keeps giving me the error: Aborting because a valid plan could not be found. Even after executing all recovery behaviors

when the goals are not within the range of its ranger. I am publishing a map of the environment as well. Does anyone know how to use move_base for distant goals? Thanks

EDIT 1: To be honest I simply stole the move_base configurations from the navigation_stage package from the navigation-tutorials stack. Here are the files:

costmap_common_params.yaml:

origin_z: 0.0
z_resolution: 0.2
z_voxels: 10
unknown_threshold: 9
mark_threshold: 0

transform_tolerance: 0.3

obstacle_range: 2.5
max_obstacle_height: 2.0
raytrace_range: 3.0

footprint: [[-0.325, -0.325], [-0.325, 0.325], [0.325, 0.325], [0.46, 0.0], [0.325, -0.325]]
footprint_padding: 0.01

inflation_radius: 0.55
cost_scaling_factor: 10.0

lethal_cost_threshold: 100

observation_sources: base_scan
base_scan: {data_type: LaserScan, expected_update_rate: 0.4,
  observation_persistence: 0.0, marking: true, clearing: true, max_obstacle_height: 0.4, min_obstacle_height: 0.08}

local_costmap_param.yaml -

local_costmap:
  publish_voxel_map: true

  global_frame: odom
  robot_base_frame: base_link

  update_frequency: 5.0
  publish_frequency: 2.0

  static_map: false
  rolling_window: true
  width: 6.0
  height: 6.0
  resolution: 0.025
  origin_x: 0.0
  origin_y: 0.0

global_costmap_params.yaml -

global_costmap: 
  global_frame: /map
  robot_base_frame: base_link

  update_frequency: 5.0
  publish_frequency: 0.0

  static_map: true
  rolling_window: false

  footprint_padding: 0.02

base_local_planner.yaml -

TrajectoryPlannerROS:
  acc_lim_th: 3.2 
  acc_lim_x: 2.5
  acc_lim_y: 2.5

  max_vel_x: 0.65
  min_vel_x: 0.1
  max_rotational_vel: 1.0
  min_in_place_rotational_vel: 0.4

  escape_vel: -0.1

  holonomic_robot: true

  y_vels: [-0.3, -0.1, 0.1, -0.3]

  xy_goal_tolerance: 0.1
  yaw_goal_tolerance: 0.05

  sim_time: 1.7
  sim_granularity: 0.025
  vx_samples: 3
  vtheta_samples: 20

  goal_distance_bias: 0.8
  path_distance_bias: 0.6
  occdist_scale: 0.01
  heading_lookahead: 0.325

  dwa: true

  oscillation_reset_dist: 0.05

  prune_plan: true
2020-05-21 11:56:47 -0500 received badge  Self-Learner (source)
2020-05-04 07:09:24 -0500 received badge  Good Question (source)
2019-03-19 01:15:17 -0500 received badge  Favorite Question (source)
2018-11-05 10:28:02 -0500 marked best answer Creating a Gazebo World using a Ground Truth Model

Hi All, I am just starting off with Gazebo to perform some multirobot simulations. In order to keep our project relevant to the topic, I wanted to perform these simulations in a visually relevant environment rather than a box world with obstacles. We have some ground truth models created using Faro Scans of the test site. I wanted to use these models as my Gazebo world and perform the simulations in there. Does anyone know if it is possible ? Thanks Ammar

2018-08-13 09:11:50 -0500 received badge  Great Question (source)
2017-03-19 21:22:56 -0500 received badge  Good Question (source)
2016-10-08 16:03:42 -0500 marked best answer Multi Robot systems framework in ROS

Hi Community, We have been working at a multi robot coordination project here at Carnegie Mellon. The framework is completely ROS based right from the robot controller to communication, front end and task allocation. While starting this project I was unable to find ROS packages catering to coordination among multiple robots. An important note here is that each robot runs its own master since we assume a failure prone network. Anyways we thought we would release some of the software we wrote that could help someone else wanting to run multi-robot systems as well. Since we are in the process of packaging and cleaning (its a university project so we really need to clean it!) our code I would like to get some suggestions on what you would desire in a Multi-Robot package. Anything from vague ideas to specific implementations is welcome.

Just a brief and high level description: There are 4 packages: 1) Communication package - currently using UDP however we may switch to ZeroMQ. Any input on protocol is appreciated. This package will handle transmitting topics of interest to other robots on a strictly request-respond basis. This scheme worked well for us in the work we did. This is similar to MultiMaster pkg except the request-respond bit. Currently the comms can transmit Map, Pose, tf, Task (which is a goto Pose), Laser Scans, Camera Image. These topics were relevant to our work so we would appreciate inputs on other topics that might be useful communicating to other robots. One can either query another robot for any of these or request to transmit its own information. Additionally it can serve as a proxy for another robot.

2) Robot Specific Pkg - This provides high level implementation of basic Robot capabilities. Planning, Occupancy Mapping, Task Execution (move base Action client), & Costing.

3) Front End: Visualizes the map, pose etc from multiple robots. Additionally it can manually control, assign tasks to individual robots or to the swarm.

4) Task Allocation: We used a proprietary market based allocation system to handle task management. Unfortunately we cannot publish that. However if you have suggestions on task management systems we might be able to port some of it in this package.

Sorry for the long post. We would really appreciate suggestions, concerns and comments in this multi-robot framework.

Thanks Ammar

2016-04-04 00:50:46 -0500 marked best answer Publishing to /move_base_simple/goal

Hello All, This is a fairly straightforward question, however I have not been able to find it so far. Could someone please tell me the terminal command to publish move_base_simple/goal. I know it is something like: rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped ..........

Really appreciate it. Thank you Ammar

2016-02-09 10:24:26 -0500 marked best answer I am unable to serialize and deserialize ros msgs.. Please Help

Hello Community, I am using the ros::serialization library to serialize a ros msg type into a buffer. However when I pass the same buffer to a deserialize function it gives me the following error.

terminate called after throwing an instance of 'ros::serialization::StreamOverrunException' what(): Buffer Overrun

Could someone please help me in figuring this out? I literally copied both ros::serialization and ros::deserialization from the ROS wiki under roscpp. Any help is appreciated. Thanks Ammar

EDIT: Here is the code -

void Trader::serialize_task(const multiagent_coordination_msgs::TaskToken& my_task){
    namespace ser = ros::serialization;
    multiagent_coordination_msgs::Agent my_agent;
    uint32_t serial_size = ros::serialization::serializationLength(my_task);

    boost::shared_array<uint8_t> buffer(new uint8_t[serial_size]);

    ser::OStream stream(buffer.get(), serial_size);
    ser::serialize(stream, my_task);

    deserialize_task(buffer);
}

void Trader::deserialize_task(const boost::shared_array<uint8_t>& my_buffer){
    namespace ser = ros::serialization;

    multiagent_coordination_msgs::TaskToken my_task;

    uint32_t serial_size = ros::serialization::serializationLength(my_task);
    boost::shared_array<uint8_t> buffer(new uint8_t[serial_size]);

    ser::IStream stream(buffer.get(), serial_size);
    ser::deserialize(stream, my_task);
}
2016-02-09 10:24:26 -0500 received badge  Self-Learner (source)
2015-12-24 02:00:51 -0500 received badge  Self-Learner (source)
2015-12-24 02:00:51 -0500 received badge  Necromancer (source)
2015-08-31 20:58:55 -0500 marked best answer Different callback function for a topic with different namespaces?

Hi All, I have several move_base nodes launched each in a separate namespace. Now I have a list of robot objects as well. When I subscribe to a topic from namespace robot_1, I would like the callback function to be called that corresponds to robot_1 object in the list of robot objects. As of now I simply subscribe to the callbacks with different names. For ex: in the robot_1 instance I have a subscriber for /robot_1/topic_name while in the robot_2 instance I have /robot_2/topic_name These subscribers are merely functions within the robot class. Any idea how I could link the subscriber callback to the particular object instance? Really appreciate the help! Thank you

EDIT: Just an overview of my program. I have a derived class "robot", which is derived from a base class "agent". Now the process "trader" has a list of robots that are initialized. Each robot publishes an

odom to topic /robot_x/odom where x=robot_number.

Now in the "robot" constructor I initialize a NodeHandle in namespace robot_x

ros::NodeHandle nhr(robot_number);

And then I subscribe to the corresponding "odom" in a member function.

odom_sub = nhr.subscribe("odom", 100, &robot::odom_callback, this);

This works perfectly and I get the odometry for the n robots. However:

void robot::odom_callback(const nav_msgs::Odometry::ConstPtr& msg){
cout<<"robot_number"<<endl; /* Getting garbage values */
//robot_number is a variable in the base class agent
}

Please let me know if I should clarify more. Really appreciate the help!

2015-06-29 05:09:48 -0500 marked best answer Creating a ROS subscriber within a class constructor?

Hello All, I have a callback to some topic that is a method of a class. This works perfectly, except for the fact that I need to initialize this Subscriber within the main() function of my node. Ideally I would like to initialize it within the constructor of my class. Is there a way to do this? In simple terms I would like to add this line to the class constructor rather than main(): ros::Subscriber sub = n.subscribe("chatter", 1000, &Listener::callback, &listener);

Thanks Ammar