roszhong指定rviz的点启动

您所在的位置:网站首页 uniapp调用地图导航 roszhong指定rviz的点启动

roszhong指定rviz的点启动

#roszhong指定rviz的点启动| 来源: 网络整理| 查看: 265

Learn ROS

一、消息

1. 发布 字符串 消息

#include "ros/ros.h"

#include "std_msgs/String.h"// 字符串消息 其他 int.h

#include

int main(int argc, char **argv)

{

ros::init(argc, argv, "example1a");// 节点初始化

ros::NodeHandle n;

ros::Publisher pub = n.advertise("message", 100);// 发布消息到 message 话题,100个数据空间

ros::Rate loop_rate(10);// 发送频率

while (ros::ok())

{

std_msgs::String msg;

std::stringstream ss;

ss data.c_str());

}

int main(int argc, char **argv)

{

ros::init(argc, argv, "example1b");

ros::NodeHandle n;

// 订阅话题,消息,接收到消息就会 调用 回调函数 messageCallback

ros::Subscriber sub = n.subscribe("message", 100, messageCallback);

ros::spin();

return 0;

}

3. 发布自定义消息 msg

#include "ros/ros.h"

#include "chapter2_tutorials/chapter2_msg.h" // 项目 msg文件下

// msg/chapter2_msg.msg 包含3个整数的消息

// int32 A

// int32 B

// int32 C

#include

int main(int argc, char **argv)

{

ros::init(argc, argv, "example2a");

ros::NodeHandle n;

// 发布自定义消息====

ros::Publisher pub = n.advertise("chapter2_tutorials/message", 100);

ros::Rate loop_rate(10);

while (ros::ok())

{

chapter2_tutorials::chapter2_msg msg;

msg.A = 1;

msg.B = 2;

msg.C = 3;

pub.publish(msg);

ros::spinOnce();

loop_rate.sleep();

}

return 0;

}

4. 订阅自定义消息 msg

#include "ros/ros.h"

#include "chapter2_tutorials/chapter2_msg.h"

void messageCallback(const chapter2_tutorials::chapter2_msg::ConstPtr& msg)

{

ROS_INFO("I have received: [%d] [%d] [%d]", msg->A, msg->B, msg->C);

}

int main(int argc, char **argv)

{

ros::init(argc, argv, "example3_b");

ros::NodeHandle n;

// 订阅自定义消息===

ros::Subscriber sub = n.subscribe("chapter2_tutorials/message", 100, messageCallback);

ros::spin();

return 0;

}

5. 发布自定义服务 srv

#include "ros/ros.h"

#include "chapter2_tutorials/chapter2_srv.h" // 项目 srv文件下

// chapter2_srv.srv

// int32 A 请求

// int32 B

// ---

// int32 sum 响应---该服务完成求和服务

// 服务回调函数==== 服务提供方具有 服务回调函数

bool add(chapter2_tutorials::chapter2_srv::Request &req, // 请求

chapter2_tutorials::chapter2_srv::Response &res) // 回应

{

res.sum = req.A + req.B; // 求和服务

ROS_INFO("Request: A=%d, B=%d", (int)req.A, (int)req.B);

ROS_INFO("Response: [%d]", (int)res.sum);

return true;

}

int main(int argc, char **argv)

{

ros::init(argc, argv, "adder_server");

ros::NodeHandle n;

// 发布服务(打广告) 广而告之 街头叫卖 等待被撩.jpg

ros::ServiceServer service = n.advertiseService("chapter2_tutorials/adder", add);

ROS_INFO("adder_server has started");

ros::spin();

return 0;

}

6. 订阅服务 获取服务 强撩.jpg

#include "ros/ros.h"

#include "chapter2_tutorials/chapter2_srv.h"

#include

int main(int argc, char **argv)

{

ros::init(argc, argv, "adder_client");

if (argc != 3)

{

ROS_INFO("Usage: adder_client A B ");

return 1;

}

ros::NodeHandle n;

// 服务客户端,需求端,调用服务

ros::ServiceClient client = n.serviceClient("chapter2_tutorials/adder");

//创建服务类型

chapter2_tutorials::chapter2_srv 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 service adder_server");

return 1;

}

return 0;

}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)

project(chapter2_tutorials) # 项目名称

## 依赖包===========

find_package(catkin REQUIRED COMPONENTS

roscpp

std_msgs

message_generation # 生成自定义消息的头文件

dynamic_reconfigure

)

## 自定义消息文件====

add_message_files(

FILES

chapter2_msg.msg

)

## 自定义服务文件====

add_service_files(

FILES

chapter2_srv.srv

)

## 生成消息头文件

generate_messages(

DEPENDENCIES

std_msgs

)

## 依赖

catkin_package(

CATKIN_DEPENDS message_runtime

)

## 编译依赖库文件

include_directories(

include

${catkin_INCLUDE_DIRS}

)

# 创建可执行文件

add_executable(example1a src/example_1a.cpp)

add_executable(example1b src/example_1b.cpp)

add_executable(example2a src/example_2a.cpp)

add_executable(example2b src/example_2b.cpp)

add_executable(example3a src/example_3a.cpp)

add_executable(example3b src/example_3b.cpp)

## 添加依赖

add_dependencies(example1a chapter2_tutorials_generate_messages_cpp)

add_dependencies(example1b chapter2_tutorials_generate_messages_cpp)

add_dependencies(example2a chapter2_tutorials_generate_messages_cpp)

add_dependencies(example2b chapter2_tutorials_generate_messages_cpp)

add_dependencies(example3a chapter2_tutorials_generate_messages_cpp)

add_dependencies(example3b chapter2_tutorials_generate_messages_cpp)

# 动态链接库

target_link_libraries(example1a ${catkin_LIBRARIES})

target_link_libraries(example1b ${catkin_LIBRARIES})

target_link_libraries(example2a ${catkin_LIBRARIES})

target_link_libraries(example2b ${catkin_LIBRARIES})

target_link_libraries(example3a ${catkin_LIBRARIES})

target_link_libraries(example3b ${catkin_LIBRARIES})

二、行动action类型 参数服务器 坐标变换 tf可视化 安装插件 gazebo仿真

1. 发布行动 action

// 类似于服务,但是是应对 服务任务较长的情况,避免客户端长时间等待,

// 以及服务结果是一个序列,例如一件工作先后很多步骤完成

#include

#include // action 服务器

#include // 自定义的 action类型 产生斐波那契数列

// action/Fibonacci.action

// #goal definition 任务目标

// int32 order

// ---

// #result definition 最终 结果

// int32[] sequence

// ---

// #feedback 反馈 序列 记录中间 递增 序列

// int32[] sequence

// 定义的一个类========================

class FibonacciAction

{

// 私有=============

protected:

ros::NodeHandle nh_; // 节点实例

// 节点实例必须先被创建 NodeHandle instance

actionlib::SimpleActionServer as_; // 行动服务器,输入自定义的模板类似

std::string action_name_;// 行动名称

// 行动消息,用来发布的 反馈feedback / 结果result

actionlib_tutorials::FibonacciFeedback feedback_;

actionlib_tutorials::FibonacciResult result_;

// 公开==================

public:

// 类构造函数=============

FibonacciAction(std::string name) :

// 行动服务器 需要绑定 行动回调函数===FibonacciAction::executeCB====

as_(nh_, name, boost::bind(&FibonacciAction::executeCB, this, _1), false),

action_name_(name)

{

as_.start();// 启动

}

// 类析构函数========

~FibonacciAction(void)

{

}

// 行动回调函数=========

void executeCB(const actionlib_tutorials::FibonacciGoalConstPtr &goal)

{

ros::Rate r(1);// 频率

bool success = true;// 标志

feedback_.sequence.clear();// 结果以及反馈

feedback_.sequence.push_back(0); // 斐波那契数列

feedback_.sequence.push_back(1);

ROS_INFO("%s: Executing, creating fibonacci sequence of order %i with seeds %i, %i", action_name_.c_str(), goal->order, feedback_.sequence[0], feedback_.sequence[1]);

for(int i=1; iorder; i++)// order 为序列数量

{

if (as_.isPreemptRequested() || !ros::ok())

{

ROS_INFO("%s: Preempted", action_name_.c_str());

as_.setPreempted();

success = false;

break;

}

// 产生后一个数

feedback_.sequence.push_back(feedback_.sequence[i] + feedback_.sequence[i-1]);

as_.publishFeedback(feedback_);// 发布

r.sleep();

}

if(success)

{

// 最终结果

result_.sequence = feedback_.sequence;

ROS_INFO("%s: Succeeded", action_name_.c_str());

as_.setSucceeded(result_);

}

}

};

int main(int argc, char** argv)

{

ros::init(argc, argv, "fibonacci server");

FibonacciAction fibonacci("fibonacci");

ros::spin();

return 0;

}

2. 行动客户端 类似 服务消费者

#include

#include // action 客户端

#include // action 状态

#include // 自定义行动类型

int main (int argc, char **argv)

{

ros::init(argc, argv, "fibonacci client");

// action 客户端 =====

actionlib::SimpleActionClient ac("fibonacci", true);

ROS_INFO("Waiting for action server to start.");

ac.waitForServer(); // 等待 行动服务器启动

ROS_INFO("Action server started, sending goal.");

// 发布任务目标 产生20个数量的 斐波那契数列序列

actionlib_tutorials::FibonacciGoal goal;

goal.order = 20;

ac.sendGoal(goal);// 发给 行动服务器=====

// 等待 行动 执行结果

bool finished_before_timeout = ac.waitForResult(ros::Duration(30.0));

if (finished_before_timeout)

{

actionlib::SimpleClientGoalState state = ac.getState();// 状态

ROS_INFO("Action finished: %s",state.toString().c_str());

}

else

ROS_INFO("Action doesnot finish before the time out.");

return 0;

}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)

project(actionlib_tutorials)

# add_compile_options(-std=c++11)

# 找到包依赖

find_package(catkin REQUIRED COMPONENTS

actionlib

actionlib_msgs

message_generation

roscpp

rospy

std_msgs

)

## 行动自定义文件

add_action_files(

DIRECTORY action

FILES Fibonacci.action

)

## 生成行动类型 头文件

generate_messages(

DEPENDENCIES actionlib_msgs std_msgs

)

## 包依赖

catkin_package(

INCLUDE_DIRS include

LIBRARIES actionlib_tutorials

CATKIN_DEPENDS actionlib actionlib_msgs message_generation roscpp rospy std_msgs

DEPENDS system_lib

)

## 包含

include_directories(

# include

${catkin_INCLUDE_DIRS}

)

## 编译 连接

add_executable(fibonacci_server src/fibonacci_server.cpp)

add_executable(fibonacci_client src/fibonacci_client.cpp)

target_link_libraries(fibonacci_server ${catkin_LIBRARIES})

target_link_libraries(fibonacci_client ${catkin_LIBRARIES})

add_dependencies(fibonacci_server ${actionlib_tutorials_EXPORTED_TARGETS})

add_dependencies(fibonacci_client ${actionlib_tutorials_EXPORTED_TARGETS})

3. 参数服务器 parameter_server

#include

#include // 动态参数 调整

#include // 自定义的 配置参数列表

// cfg/parameter_server_tutorials.cfg===========

// 参数改变后 的回调函数,parameter_server_Config 为参数头

void callback(parameter_server_tutorials::parameter_server_Config &config, uint32_t level)

{

ROS_INFO("Reconfigure Request: %s %d %f %s %d",

config.BOOL_PARAM?"True":"False",

config.INT_PARAM,

config.DOUBLE_PARAM,

config.STR_PARAM.c_str(),

config.SIZE);

}

int main(int argc, char **argv)

{

ros::init(argc, argv, "parameter_server_tutorials");

dynamic_reconfigure::Server server;// 参数服务器

dynamic_reconfigure::Server::CallbackType f;// 参数改变 回调类型

// 绑定回调函数

f = boost::bind(&callback, _1, _2);

// 参数服务器设置 回调器

server.setCallback(f);

ROS_INFO("Spinning");

ros::spin();// 启动

return 0;

}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)

project(parameter_server_tutorials)

# add_compile_options(-std=c++11)

# 找到包

find_package(catkin REQUIRED COMPONENTS

roscpp

std_msgs

message_generation

dynamic_reconfigure

)

# 动态参数配置文件

generate_dynamic_reconfigure_options(

cfg/parameter_server_tutorials.cfg

)

# 依赖

catkin_package(

CATKIN_DEPENDS message_runtime

)

# 包含

include_directories(

include

${catkin_INCLUDE_DIRS}

)

# 生成可执行文件

add_executable(parameter_server_tutorials src/parameter_server_tutorials.cpp)

add_dependencies(parameter_server_tutorials parameter_server_tutorials_gencfg)

target_link_libraries(parameter_server_tutorials ${catkin_LIBRARIES})

4. 坐标变换发布 tf_broadcaster

#include

#include // 坐标变换发布/广播

#include // 小乌龟位置类型

std::string turtle_name;

// 小乌龟 位姿 话题 回调函数 =======

void poseCallback(const turtlesim::PoseConstPtr& msg)

{

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);// 按照 rpy 姿态向量形式设置 平面上只有 绕Z轴的旋转 偏航角

transform.setRotation(q);// 姿态

// 广播位姿变换消息=====

br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));

}

int main(int argc, char** argv)

{

ros::init(argc, argv, "tf_broadcaster");

if (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;};

turtle_name = argv[1];

ros::NodeHandle node;

// 订阅小乌龟 位姿 话题数据 绑定回调函数 poseCallback

ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);

ros::spin();

return 0;

}

5. 坐标变换监听 tf_listener

#include

#include // 坐标变换监听

#include // 消息类型

#include // 生成一个小乌龟

int main(int argc, char** argv)

{

ros::init(argc, argv, "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

{

// 两个小乌龟坐标变换消息 之差 左边变换??

// 有两个 坐标变换发布器 一个发布 /turtle1 一个发布 /turtle2

listener.lookupTransform("/turtle2", "/turtle1",

ros::Time(0), transform);

}

catch (tf::TransformException &ex)

{

ROS_ERROR("%s",ex.what());

ros::Duration(1.0).sleep();

continue;

}

// 根据位姿差,发布 命令 让 小乌龟2 追赶上 小乌龟1

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;

}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)

project(tf_tutorials)

find_package(catkin REQUIRED COMPONENTS

roscpp

rospy

tf

turtlesim

)

catkin_package()

include_directories(

# include

${catkin_INCLUDE_DIRS}

)

add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)

target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})

add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)

target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})

start_demo.launch



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3