本部分仅包含ROS常用基础代码,不包含解释,仅为自己方便之用,如有叙述不明确请谅解;
.
├── CMakeLists.txt
├── include
│ └── learning_communication
├── launch
│ └── start_demo_with_listener.launch
├── msg
│ └── Person.msg
├── package.xml
├── src
│ ├── client.cpp
│ ├── listener.cpp
│ ├── server.cpp
│ ├── talker.cpp
│ ├── turtle_tf_broadcaster.cpp
│ └── turtle_tf_listener.cpp
└── srv
└── AddTwoInts.srv
#include
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
while(ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str() );
chatter_pub.publish(msg);
loop_rate.sleep();
++count;
}
return 0;
}
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("[%s]", msg -> data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
#include "ros/ros.h"
#include "learning_communication/AddTwoInts.h"
bool add(learning_communication::AddTwoInts::Request &req,
learning_communication::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request: x = %ld, y = %ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.sum);
return true;
}
int main(int argc, char *argv[])
{
ros::init(argc, argv, "add_two_int_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints", add);
ROS_INFO("Ready to add two ints;");
ros::spin();
return 0;
}
#include
#include "ros/ros.h"
#include "learning_communication/AddTwoInts.h"
int main(int argc, char *argv[])
{
ros::init(argc, argv, "add_two_ints_client");
if( argc != 3)
{
ROS_INFO("usage: add_two_ints_client x y");
return false;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient("add_two_ints");
learning_communication::AddTwoInts srv;
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
if(client.call(srv))
{
ROS_INFO("SUM: %ld", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failed to call the service: ADDTWOINTS;");
return 1;
}
return 0;
}
Service 的调用过程会发生阻塞;
int64 a
int64 b
---
int64 sum
#include
#include
#include
std::string turtle_name;
void poseCallback(const turtlesim::PoseConstPtr& msg)
{
//static tf::TransformBroadcaster br;
static tf::TransformBroadcaster br;
tf::Transform transform;
transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0));
tf::Quaternion q;
q.setRPY(0, 0, msg->theta);
transform.setRotation( q );
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
}
int main(int argc, char *argv[])
{
ros::init(argc, argv, "my_tf_broadcaster");
if(argc != 2)
{
ROS_ERROR("NEED TUETLE NAME AS ARGUMENT");
return -1;
}
turtle_name = argv[1];
ros::NodeHandle node;
ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);
ros::spin();
return 0;
}
#include
#include
#include
#include
int main(int argc, char *argv[])
{
ros::init(argc, argv, "my_tf_listener");
ros::NodeHandle node;
ros::service::waitForService("spawn");
ros::ServiceClient add_turtle = node.serviceClient("spawn");
turtlesim::Spawn srv;
add_turtle.call(srv);
ros::Publisher turtle_vel = node.advertise("turtle2/cmd_vel", 10);
tf::TransformListener listener;
ros::Rate rate(10.0);
while (node.ok())
{
tf::StampedTransform transform;
try
{
listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));
// 该函数会阻塞程序的运行;
listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);
}
catch( tf::TransformException &ex)
{
ROS_ERROR("%s", ex.what());
ros::Duration(1.0).sleep();
continue;
}
geometry_msgs::Twist vel_msg;
vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(), transform.getOrigin().x());
vel_msg.linear.x = 0.5 * sqrt( pow(transform.getOrigin().x(), 2) + pow(transform.getOrigin().y(), 2));
turtle_vel.publish(vel_msg);
rate.sleep();
}
return 0;
}
cmake_minimum_required(VERSION 2.8.3)
project(learning_communication)
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp
rospy
std_msgs
turtlesim
tf
message_generation
)
add_message_files(
FILES
Person.msg
)
add_service_files(
FILES
AddTwoInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime turtlesim tf
)
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)
add_executable(server src/server.cpp)
target_link_libraries(server ${catkin_LIBRARIES})
add_dependencies(server ${PROJECT_NAME}_gencpp)
add_executable(client src/client.cpp)
target_link_libraries(client ${catkin_LIBRARIES})
add_dependencies(client ${PROJECT_NAME}_gencpp)
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})
add_executable(turtle_tf_listener src/turtle_tf_listener)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})
《ROS机器人开发实践》