RTS路径规划 roborts_planner 学习笔记

学习日志 DAY 2

C++语法:

C++ thread用法总结(整理).

Thread线程:

(1)、get_id:获取线程ID,返回一个类型为std::thread::id的对象。

(2)、joinable:检查线程是否可被join。检查当前的线程对象是否表示了一个活动的执行线程。缺省构造的thread对象、已经完成join的thread对象、已经detach的thread对象都不是joinable。

(3)、join:调用该函数会阻塞当前线程(主调线程)。阻塞调用者(caller)所在的线程(主调线程)直至被join的std::thread对象标识的线程(被调线程)执行结束。

(4)、detach:将当前线程对象所代表的执行实例与该线程对象分离,使得线程的执行可以单独进行。一旦线程执行完毕,它所分配的资源将会被释放。

(5)、native_handle:该函数返回与std::thread具体实现相关的线程句柄。native_handle_type是连接thread类和操作系统SDK API之间的桥梁,如在Linux g++(libstdc++)里,native_handle_type其实就是pthread里面的pthread_t类型,当thread类的功能不能满足我们的要求的时候(比如改变某个线程的优先级),可以通过thread类实例的native_handle()返回值作为参数来调用相关的pthread函数达到目录。This member function is only present in class thread if the library implementation supports it. If present, it returns a value used to access implementation-specific information associated to the thread.

(6)、swap:交换两个线程对象所代表的底层句柄。

(7)、operator=:moves the thread object

(8)、hardware_concurrency:静态成员函数,返回当前计算机最大的硬件并发线程数目。基本上可以视为处理器的核心数目。

ROS相关知识:

action;ROS 学习笔记(五)—— 动作 Action 详解.
goal:任务目标
cancel:请求取消任务
status:通知client当前的状态
feedback:周期反馈任务运行的监控数据
result:向client发送任务的执行结果,这个topic只会发布一次。
动作机制是异步的,运行服务端和客户端采用无阻塞的编程方式。在机器人应用中,执行一个时长不定,目标引导的新任务是很常见的,
如 goto_position,clean_the_house。在任何情况下,当需要执行一个任务时,action 可能都是最佳选择。虽然动作需要写更多的代码,
但却比服务更强大,扩展性更好。因此,每当你想使用服务时,都应当考虑一下,是否可以替换为动作。
动作定义文件中包含了动作的目标,结果,和反馈的消息格式。通常放在 package 的 action 文件夹下,文件扩展名为.action。
示例:定义一个定时器动作:Timer.action。这个定时器会进行倒计时,并在倒计时停止时发出结果信号告诉我们总的计数时长,倒计时过程中会定期反馈剩余时间。

这是一个action文件,它有三个部分:目标、结果和反馈。

目标,由客户端发送
我们要等待的时间量

duration time_to_wait

结果,由服务器在完成后发送
我们等待了多少时间

duration time_elapsed

一路上我们提供了多少次更新

uint32 updates_sent

反馈,由服务器在执行过程中定期发送。
从开始到现在已经过去了多少时间

duration time_elapsed

距离我们完成任务的剩余时间

duration time_remaining

各种量的作用:

节点状态-NodeState

(空闲、运行中、暂停、成功、失败)

enum NodeState{
  IDLE,
  RUNNING,
  PAUSE,
  SUCCESS,
  FAILURE
};

GlobalPlannerServer 动作服务

(typedef actionlib::SimpleActionServer<roborts_msgs::GlobalPlannerAction> GlobalPlannerServer;)

action是需要配对的,客户端与服务端的联系是通过定义的action名字完成的;

//来自服务端
typedef actionlib::SimpleActionServer<chores::DoDishesAction> Server;
Server server(n, "do_dishes", boost::bind(&execute, _1, &server), false);

//来自客户端
typedef actionlib::SimpleActionClient<chores::DoDishesAction> Client;
Client client("do_dishes", true);

global_planner_node.cpp(~line 15)

GlobalPlannerNode::GlobalPlannerNode() :
    new_path_(false),pause_(false), node_state_(NodeState::IDLE), error_info_(ErrorCode::OK),//初始化
    as_(nh_,"global_planner_node_action",boost::bind(&GlobalPlannerNode::GoalCallback,this,_1),false) {//创建一个动作服务,服务名为"global_planner_node_action"

  if (Init().IsOK()) {//如果没有报错
    ROS_INFO("Global planner initialization completed.");
    StartPlanning();//创建寻路节点并初始化
    as_.start();//动作服务器开始计时
  } else {
    ROS_ERROR("Initialization failed.");//初始化失败
    SetNodeState(NodeState::FAILURE);//设置节点状态为 失败
  }

}

ErrorInfo GlobalPlannerNode::Init() {

  // Load proto planning configuration parameters
  GlobalPlannerConfig global_planner_config;//加载原始规划配置参数

待解决问题


1.线程相关

参考文章见文中链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值