Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This page introduces the usage of sync_set_stcm, including how to upload the STCM map to the robot via the sync_set_stcm service.

...

Contents

Table of Contents
excludeContents

...

Environment Setup

software platform

  • Ubuntu 20.04 X86
  • ROS Noetic

hardware platform

Choose any one below:

  • Slamware Kit (User Robot System based on Slamware Solution)
  • robot base systems like Apollo/Ares/Athena 

...

Sample Code Download

ROS-Sample Download Link

...

Compile and Run

  1. Download the Slamware ROS SDK along with ROS examples.
  2. Place the 'src' folder from the ROS SDK into an empty working directory, such as 'catkin_ws'. Also, put the 'slamware_ros_sample' folder from the ROS examples into the 'src' folder.
    Code Block
    languagebash
    mkdir -p catkin_ws/src
    cd catkin_ws/src
  3. Initialize the workspace using the Catkin tool.
    Code Block
    languagebash
    catkin_init_workspace
  4. Compile.
    Code Block
    languagebash
    cd ..
    catkin_make
  5. Set up workspace environment.
    Code Block
    languagebash
    source devel/setup.bash

  6. Launch the slamware_ros_sdk_server_node node. Select the corresponding IP according to the mode.
    Code Block
    languagecpp
    roslaunch slamware_ros_sdk slamware_ros_sdk_server_node.launch ip_address:=10.6.128.141    // Station mode
    // If in AP mode, the IP address is 192.168.11.1
  7. Open another terminal, repeat step 5, and start the sync_set_stcm_node node.
    Code Block
    languagecpp
    roslaunch slamware_ros_sample sync_set_stcm.launch
    // In the launch file, there is a default definition for the map_file_name parameter, indicating the path and filename where the map is saved. you can adjust parameters manually.
  8. At this point, observe the RVIZ interface; if the map file is successfully located, the map will be uploaded, and the map in RVIZ will also change accordingly. Otherwise, an error will occur.
    Image Added

...

Code Description

Code Block
languagecpp
titlesync_set_stcm
int main (int argc, char **argv)
{
  std::string map_file_name;
  long data_size;

  ros::init(argc, argv, "sync_set_stcm_node");
  ros::NodeHandle nh("~");
  ros::ServiceClient client = nh.serviceClient<slamware_ros_sdk::SyncSetStcm>("/slamware_ros_sdk_server_node/sync_set_stcm");
  slamware_ros_sdk::SyncSetStcm srv;

  //get file name from paramter server
	if (!nh.getParam("map_file_name",map_file_name))
	{
		ROS_ERROR("invalied file path......");
		return 1;
	}
	ROS_INFO("map file path: %s",map_file_name.c_str());

  //open map file and get data
  std::ifstream fin(map_file_name ,std::ios::in | std::ios::binary | std::ios::ate);
  if(!fin.is_open())
  {
    ROS_ERROR("open map file failed......");
    return 1;
  }
  ROS_INFO("open map file success,reading data......"); 

  data_size = fin.tellg();
  fin.seekg(0,std::ios::beg);
  srv.request.raw_stcm.resize(data_size);
  fin.read(reinterpret_cast<char *>(srv.request.raw_stcm.data()),data_size*sizeof(srv.request.raw_stcm.front()));
  fin.close();
  ROS_INFO("raw_stcm data size: %zu",srv.request.raw_stcm.size());
  
  //set robot pose
  srv.request.robot_pose.position.x = 0;
  srv.request.robot_pose.position.y = 0;
  srv.request.robot_pose.position.z = 0;
  srv.request.robot_pose.orientation.x = 0;
  srv.request.robot_pose.orientation.y = 0;
  srv.request.robot_pose.orientation.z = 0;
  srv.request.robot_pose.orientation.w = 1;
  
  //call service
	if (client.call(srv))
  {
		ROS_INFO("set stcm map success......");
  }
  else
  {
    ROS_ERROR("Failed to set stcm map......");
    return 1;
  }

    return 0;
}