http://www.ncnynl.com/archives/201702/1305.html
ros 基础教程
1.mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ -> catkin_make source devel/setup.bash
2.cd ~/catkin_ws/src -> catkin_create_pkg test_p std_msgs rospy roscpp
3.rospack depends test_p
4. <package.xml>
<?xml version="1.0"?>
<package>
<name>beginner_tutorials</name>
<version>0.1.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="you@yourdomain.tld">Your Name</maintainer>
<license>BSD</license>
<url type="website">http://wiki.ros.org/beginner_tutorials</url>
<author email="you@yourdomain.tld">Jane Doe</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend>
<run_depend>std_msgs</run_depend>
5. ros::Rate loop_rate(10); //发布消息的频率,10 Hz 每秒10次
loop_rate.sleep(); //根据之前的 ros::Rate loop_rate(1) 的定义来控制发布话题德频率
6. n.getParam("my_param",s);
7. ros::Timer timer = n.createrTimer(ros::Duration(0.1),timerCallback); //创建定时器 void timerCallback(const ros::TimerEvent& e);
8. 如果想启动多个相同节点 使用 init_options::AnonymousName
9. signal(SIGINT, mySigintHandler);
10. 消息生成 package_name/msg/Foo.msg -> package_name::Foo package_name/srv/Foo.srv -> package_name.Foo
11. MyMessage::_my_array_type::iterator it = msg.my_array.begin();
12. 类方法做为回调函数:
Foo foo_object;
ros::ServiceServer service = nh.advertiseService("my_service", &Foo::callback, &foo_object);
13. ros::Timer timer = nh.createTimer(ros::Duration(0.1),timerCallback);
14.// 单线程
spinning(); ros::spinonce();
ros::spin(); //用户的回调函数在ros::spin()中被调用
ros::spinonce(); //定时运行, ros::Rate r(10); //10Hz ros::spinonce(); r.sleep();
//多线程
ros::MultiThreadedSpinner spinner(4); spinner.spin(); //阻塞式
ros::AsyncSpinner spinner(4); spinner.start(); ros::witForShutdown();
15. ros::Duration(0.5).sleep(); //sleep for half a second
16. TF 数据类型:Quaternion , vector, Point, Pose, Transform
17.
- 函数:tf::Quaternion createQuaternionFromRPY(double roll,double pitch,double yaw)
- 作用:返回从固定轴的Roll, Pitch and Yaw(滚动,俯仰和偏转)构造的tf::Quaternion四元数
- 函数:geometry_msgs::Quaternion createQuaternionMsgFromRollPitchYaw(double roll,double pitch,double yaw)
- 作用:返回从固定轴的Roll, Pitch and Yaw(滚动,俯仰和偏转)构造的geometry_msgs::Quaternion四元数
18. Coodinate Frames( 坐标框架,坐标系)
Transforms( 变换)
TF
19. pow() 求 x 的 y 次方
atan2(double y, double x); y为Y坐标,x为X坐标 返回角度(弧度).
20.
grep -ri "vector" // vi 命令查找当前目录下关键字
21. robot_pose_ekf
listens: /odom <nav_msgs::Odometry> 2D pose
/imu_data <sensor_msgs::Imu> 3D orientation
/vo <nav_msgs::Odometry> 3D pose
22.actionlib 工作
actionlib 使用client-server 工作模式. ActionClinet 和 ActionServer 通过 Ros Action Protocol 通信
23. 路径跟踪:
定义一个 tf listener ,以机器人当前位置建立的坐标系拿出目标点的相对位置, 发送速度 x 方向的速度可以为定值, z轴角速度为 a × atan2(@y,@x);
listener.transformPoint("/base_link",goal_point,robot_world); goal_point 为pose 类型, robot_world 为goal_point 在base_link 坐标下的位置。
有时候要在上一句前面加上 listener.waitForTransform("/base_link","/map",ros::Time(0),ros::Duration(3));
24: 节点运行中如果要读文件, 填写相对位置,发现节点的当前目录为 catkin.