TF transform
Hello
I would like to create my own node that can navigate my robot through some objects in the environment map using laser scan. So I just want to have some locations of objects in my environment map , so I need a list of objects and coordinates.Just need a ROS node that takes a list of objects with coordinates and posts a TF transform for every object...
How to fill my yaml map file with the object parameters. I have the yaml map file already created. Any help with the fill the map and TF transform please?
This is my object node.
include "ros/ros.h"
include "std_msgs/String.h"
include "sensor_msgs/LaserScan.h"
include <vector>
sensor_msgs::LaserScan laser_scan; float min_range;
void scanCallback(const sensor_msgs::LaserScan::ConstPtr& msg) {
std::vector<float> laser;
laser = msg->ranges;
int size_laser = laser.size();
for (int i=0;i<size_laser;i++){
if (laser[i] < 0.01){
laser[i] = 99999;
}
if (laser[i] > 45){
laser[i] = 99999;
}
}
min_range = 2;
int index_min;
for (int i=0;i<size_laser;i++){
if (laser[i] < min_range){
min_range = laser[i];
index_min = i;
ROS_INFO("Minimum Range = %f", min_range);
}
}
for (int j=0;j<size_laser;j++){
if (laser[j] > min_range + 0.5){
laser[j] = 0;
}
}
laser_scan = *msg;
laser_scan.ranges.clear();
laser_scan.ranges = laser;
}
int main(int argc, char **argv) {
ros::init(argc, argv, "object_node");
ros::NodeHandle n;
ROS_INFO("Minimum Range = %f", min_range);
ros::Subscriber sub = n.subscribe("scan", 1000, scanCallback);
ros::Publisher laser_pub = n.advertise<sensor_msgs::LaserScan>("closest_points", 100);
ros::Rate loop_rate(10);
while (ros::ok())
{
laser_pub.publish(laser_scan);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
And this is the yaml map file
image: pow_real_time.pgm resolution: 0.050000 origin: [-100.000000, -100.000000, 0.000000] negate: 0 occupied_thresh: 0.65 free_thresh: 0.196
and this is my launch file
Perform AMCL localisation: runs several nodes to generate odometry from laser scans (ICP) & IMU, loads a map of the POW assessment area, runs AMCL, plays back a dataset for localisation, and runs the visualiser with the correct visualisation parameters configured. -->
<launch>
<node name="rosplay" pkg="rosbag" type="play" args="/home/Data/13-48-20.bag --clock"/>
<node pkg="tf" type="static_transform_publisher" name="baselink_laser" args="0 0 0 0 0 0 /base_link /laser 10"/>
<node pkg="tf" type="static_transform_publisher" name="laser_imu" args="0 0 0 0 0 0 /laser /base_imu 10"/>
<node pkg="tf" type="static_transform_publisher" name="baselink_camera" args="0 0 0 0 0 0 /base_link /camera 10"/>
<!-- Start the map server node and specify the map file (*.pgm) and the map resolution in metres/pixel -->
<node name="map_server" pkg="map_server" type="map_server" args="$(find amcl_listener)/maps/pow_real_time.yaml" output="screen"/>
<!--Start the Laser_scan_matcher package, to provide odometry from laser data (ICP)-->
<node pkg="laser_scan_matcher" type="laser_scan_matcher_node"
name="laser_scan_matcher_node" output="screen">
<param name="use_alpha_beta" value="true"/>
<param name="max_iterations" value="10"/>
</node>
<!-- Start the gmapping node -->
<!--node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"/-->
<node pkg="amcl" type="amcl" name="amcl" respawn="true" output="screen">
<param name="base_frame_id" value="base_link"/>
<param name="odom_frame_id" value="world ...