学习日志 DAY 2
C++语法:
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.线程相关
参考文章见文中链接