Problem with single voxel octomap publisher [closed]
Hi! I'm trying to make a publisher that publish one single octomap voxel. I'm not sure if my code is rigth but i have an error when calling setNodeValue():
#include "ros/ros.h"
#include "octomap_msgs/Octomap.h"
#include "octomap/octomap.h"
#include "octomap/OcTree.h"
#include "octomap_msgs/conversions.h"
class OctomapPub
{
public:
OctomapPub()
: nh_(),
octree_(0.1)
{
octo_pub_ = nh_.advertise<octomap_msgs::Octomap>("/octomap/custom", 1000);
initOctree(octree_);
octomap::OcTreeKey key = octree_.coordToKey(1.0, 1.0, 1.0);
updateOctomap(key);
publishOctomap(octree_);
}
void initOctree(octomap::OcTree& octree)
{
octree.setOccupancyThres(0.5);
octree.setProbHit(0.7);
octree.setProbMiss(0.2);
octree.setClampingThresMax(0.95);
octree.setClampingThresMin(0.2);
}
void updateOctomap(octomap::OcTreeKey key)
{
octree_.setNodeValue(key, octree_.search(key), false);
}
void publishOctomap(const octomap::OcTree& octree)
{
octomap_msgs::Octomap map;
if (octomap_msgs::fullMapToMsg(octree, map))
{
map.header.frame_id = "base_footprint";
map.header.stamp = ros::Time::now();
octo_pub_.publish(map);
ROS_INFO("OctoMap published. Subscribers: %d", octo_pub_.getNumSubscribers());
} else {
ROS_ERROR("Error serializing OctoMap");
}
}
private:
ros::NodeHandle nh_;
ros::Publisher octo_pub_;
octomap::OcTree octree_;
};
int main(int argc, char **argv)
{
ros::init(argc, argv, "OctoMap_publisher");
ros::NodeHandle nh;
ros::Rate loop_rate(2);
OctomapPub octomappub;
int count = 0;
while (ros::ok())
{
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
The error it's the following:
/home/pablo/catkin_test/src/pub_example/src/publisher.cpp: In member function ‘void OctomapPub::updateOctomap(octomap::OcTreeKey)’:
/home/pablo/catkin_test/src/pub_example/src/publisher.cpp:33:57: error: no matching function for call to ‘octomap::OcTree::setNodeValue(octomap::OcTreeKey&, octomap::OcTreeNode*, bool)’
octree_.setNodeValue(key, octree_.search(key), false);
^
In file included from /opt/ros/melodic/include/octomap/OccupancyOcTreeBase.h:506:0,
from /opt/ros/melodic/include/octomap/OcTree.h:38,
from /opt/ros/melodic/include/octomap/octomap.h:37,
from /home/pablo/catkin_test/src/pub_example/src/publisher.cpp:3:
/opt/ros/melodic/include/octomap/OccupancyOcTreeBase.hxx:267:9: note: candidate: NODE* octomap::OccupancyOcTreeBase<NODE>::setNodeValue(const octomap::OcTreeKey&, float, bool) [with NODE = octomap::OcTreeNode]
NODE* OccupancyOcTreeBase<NODE>::setNodeValue(const OcTreeKey& key, float log_odds_value, bool lazy_eval) {
^~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/octomap/OccupancyOcTreeBase.hxx:267:9: note: no known conversion for argument 2 from ‘octomap::OcTreeNode*’ to ‘float’
/opt/ros/melodic/include/octomap/OccupancyOcTreeBase.hxx:282:9: note: candidate: NODE* octomap::OccupancyOcTreeBase<NODE>::setNodeValue(const point3d&, float, bool) [with NODE = octomap::OcTreeNode; octomap::point3d = octomath::Vector3]
NODE* OccupancyOcTreeBase<NODE>::setNodeValue(const point3d& value, float log_odds_value, bool lazy_eval) {
^~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/octomap/OccupancyOcTreeBase.hxx:282:9: note: no known conversion for argument 1 from ‘octomap::OcTreeKey’ to ‘const point3d& {aka const octomath::Vector3&}’
/opt/ros/melodic/include/octomap/OccupancyOcTreeBase.hxx:291:9: note: candidate: NODE* octomap::OccupancyOcTreeBase<NODE>::setNodeValue(double, double, double, float, bool) [with NODE = octomap::OcTreeNode]
NODE* OccupancyOcTreeBase<NODE>::setNodeValue(double x, double y, double z, float log_odds_value, bool lazy_eval) {
^~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/octomap/OccupancyOcTreeBase.hxx:291:9: note: candidate expects 5 arguments, 3 provided
pub_example/CMakeFiles/pub_example_nde.dir/build.make:62: recipe for target 'pub_example/CMakeFiles/pub_example_nde.dir/src/publisher.cpp.o' failed
make[2]: *** [pub_example/CMakeFiles/pub_example_nde.dir/src/publisher.cpp.o] Error 1
CMakeFiles/Makefile2 ...
I think the error is clear
octree_.search(key)
returns aoctomap::OcTreeNode*
when your functions argument position is expecting afloat