接受中文注释
setlocale(LC_ALL, "");
ros::Time 和 double 转换
1 | double x=ros::Time::now().toSec(); //把时间戳转化成浮点型格式 |
读取环境变量
跨平台函数 bool get_environment_variable (std::string &str, const char *environment_variable)
clamp函数
1 | template<class T> |
转换路径点到 base_link
坐标系下
1 | // 注意最后一个路径点,是 end() 的前一个点 |
1 | bool transformPose( |
四元数转欧拉角yaw
1 | double quaternionToYaw(const geometry_msgs::Quaternion& quat) |
欧拉角 —— 四元数
1 | //只通过yaw计算四元数,用于平面小车 |
获得当前节点名称
ros::this_node::getName()
bool ros::master::getNodes (V_string &nodes)
是获得当前所有运行的节点,效果和rosnode list
一样。但这里有个缺陷,使用pkill
杀死的节点,在rosnode list
里仍然能看到,实际已经退出了。
规范角度 [-π, π)
调用g2o::normalize_theta(double theta)
或者1
2
3
4
5
6
7void normAngle ( double& angle )
{
if( angle >= M_PI)
angle -= 2 * M_PI;
if( angle < -M_PI)
angle += 2 * M_PI;
}
判断机器人是否静止
1 | bool robotIsStill() |
移动一定时间,也可以表示移动一定距离
1 | geometry_msgs::Twist cmd_vel; |
获取当前速度
1 | tf::Stamped<tf::Pose> robot_vel_tf; |
poseStampedMsgToTF
1 | //get the starting pose of the robot |
还有类似的函数: poseTFToMsg
和 transformMsgToTF
angles
包
static double from_degrees (double degrees): Convert degrees to radians
static double normalize_angle (double angle)
static double shortest_angular_distance (double from, double to)
static double to_degrees (double radians): Convert radians to degrees
static double two_pi_complement (double angle): returns the angle in
[-2*M_PI, 2*M_PI]
going the other way along the unit circl
tf 命名空间
tf的命名空间有很多有用的函数,先列出一部分:
- TFSIMD_FORCE_INLINE tfScalar angle (const Quaternion &q1, const Quaternion &q2)
Return the half angle between two quaternions
- TFSIMD_FORCE_INLINE tfScalar angleShortestPath (const Quaternion &q1, const Quaternion &q2)
Return the shortest angle between two quaternions
- void assertQuaternionValid (const geometry_msgs::Quaternion &q)
Throw InvalidArgument if quaternion is malformed
- void assertQuaternionValid (const tf::Quaternion &q)
Throw InvalidArgument if quaternion is malformed
- TFSIMD_FORCE_INLINE Quaternion shortestArcQuat (const Vector3 &v0, const Vector3 &v1)
TFSIMD_FORCE_INLINE Quaternion shortestArcQuatNormalize2 (Vector3 &v0, Vector3 &v1)
- TFSIMD_FORCE_INLINE Quaternion slerp (const Quaternion &q1, const Quaternion &q2, const tfScalar &t)
Return the result of spherical linear interpolation betwen two quaternions
std::string strip_leading_slash (const std::string &frame_name)
TFSIMD_FORCE_INLINE tfScalar tfAngle (const Vector3 &v1, const Vector3 &v2)
Return the angle between two vectors
- TFSIMD_FORCE_INLINE Vector3 tfCross (const Vector3 &v1, const Vector3 &v2)
Return the cross product of two vectors
- TFSIMD_FORCE_INLINE tfScalar tfDistance (const Vector3 &v1, const Vector3 &v2)
Return the distance between two vectors
- TFSIMD_FORCE_INLINE tfScalar tfDistance2 (const Vector3 &v1, const Vector3 &v2)
Return the distance squared between two vectors
- TFSIMD_FORCE_INLINE tfScalar tfDot (const Vector3 &v1, const Vector3 &v2)
Return the dot product between two vectors
goalToGlobalFrame
geometry_msgs::PoseStamped MoveBase::goalToGlobalFrame(const geometry_msgs::PoseStamped& goal_pose_msg)
这个函数的核心功能是获得机器人坐标系和全局地图坐标系的关系:1
tf_.transformPose(global_frame, goal_pose, global_pose);
计算机器人的内接圆和外切圆半径
1 | std::vector<geometry_msgs::Point> footprint = planner_costmap_ros_->getRobotFootprint(); |
通过footprint的代价值判断是否撞障碍
与上一条结合,参考TEB代码1
2
计算 直角三角形的斜边长
#include <math.h>
double hypot(double x, double y)
,输入是两个直角边,用法: hypot(p1.x - p2.x, p1.y - p2.y)
ros::shutdown()
关闭节点并且从主节点登出,会终结所有的订阅、发布、服务,连ROS_INFO
也不能再用。一般不用调用此函数,当所有的NodeHandle销毁时,就会自动关闭节点。默认的roscpp也会安装SIGINT
句柄用来检测Ctrl-C
,并自动为你关闭节点。
ros::waitForShutdown ()
等待节点关闭,无论时通过Ctrl-C
还是ros::shutdown()
ros::isShuttingDown()
一旦ros::shutdown()
调用(注意是刚开始调用,而不是调用完毕)就返回true。一般建议用ros::ok(),特殊情况可以用ros::isShuttingDown()
ros::NodeHandle
获取节点的句柄,ros::init
是初始化节点,这个是启动节点。
如果不想通过对象的生命周期来管理节点的开始和结束,可以通过ros::start()
和ros::shutdown()
来自己管理节点。
ros::ok()
判断是否退出节点,如果返回false,说明可能发生了以下事件
- 调用了
ros::shutdown()
- 被另一同名节点踢出ROS网络
- 节点中的所有
ros::NodeHandles
都已经被销毁
ros::Time::now()
获取当前时间: ros::Time time = ros::Time::now()
使用模拟时间时,当 /clock节点接受到第一条消息时,ros::Time::now()
返回时刻 0,此时客户端还不知道时钟时间。
ros::Rate
1 | ros::Rate rate(10); |
Rate类的构造函数参数是频率,不是时间。rate(10)对应时间间隔为1/10
秒,也就是100毫秒。Rate::sleep()
是进行睡眠,实际调用Duration::sleep()
,间隔就是从构造函数开始计算,源码处理比较复杂。
获得当前运行的所有节点名
1 | typedef std::vector<std::string> ros::V_string |
用这个函数很简单:1
2
3
4
5
6
7std::vector<std::string> nodes;
ros::master::getNodes(nodes); // bool
int len = nodes.size();
for (int i =0; i < len; i ++)
{
cout<<"node: "<<nodes.at(i)<<endl;
}
获得当前运行的所有话题名
1 | struct ros::master::TopicInfo |
使用是类似的:1
2
3
4
5
6
7
8std::vector<ros::master::TopicInfo> topics;
ros::master::getTopics(topics);
int len = topics.size();
for (int i =0; i < len; i ++)
{
cout<<"topic: "<<topics.at(i).name<<" type: "
<<topics.at(i).datatype<<endl;
}
其他可能用到的函数
1 | ros::isInitialized () // 判断ros::init()是否被调用 |
参考:
ros 初始化和关闭