Ros 中的代码编写 C++
没有跑完所以例子 只是有选择的看了一些
该网页的教程偏向于理论知识点的说明,可用于查询手册使用
geometry_msgs http://wiki.ros.org/geometry_msgs
函数说明
geometry_msgs/PoseMessage http://docs.ros.org/api/geometry_msgs/html/msg/Pose.html
# This contains the position of a point in free space
float64 x
float64 y
float64 z
1、以ros:: 打头的语法及代码
ros 中的基本定义框架:
包::类::对象::方法
std_msgs::String msg;
std::stringstream ss;
ros::init(argc, argv,"talker"); 初始化ROS,指定节点名称为“talker”
while (ros::ok())
默认roscpp会植入一个SIGINT处理机制,当按下Ctrl-C,就会让ros::ok()返回false,那循环就会结束。
· ros::ok() 返回false的几种情况:
· SIGINT收到(Ctrl-C)信号
· 另一个同名节点启动,会先中止之前的同名节点
· ros::shutdown()被调用
· 所有的ros::NodeHandles被销毁
方法:如何根据函数库写自己的程序
如 std_msgs::String
$ rosmsg list
得到:
std_msgs/Int8
std_msgs/String
$ rosmsg showstd_msgs/Int8
int8data
也就是说,std_msgs/Int8实际上是由一个int8 类型的对象data组成。知道这些信息,我们就能够正确的构造消息发布器和订阅器了。
使用:
方式1 :std_msgs::Int8 msg; 定义一个类msg
msg.data = 1;
方式2:std_msgs::String msg;
msg.data = ss.str();
所以 std_msgs/Int8
的意义是 包、申明/类 .对象
ros::spinOnce();
解释:
· 不是必需的,但是保持增加这个调用,是好习惯。
· 如果程序里也有订阅话题,就必需,否则回调函数不能起作用。
共享指针
typedef boost::shared_ptr
使用:
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard:[%s]", msg->data.c_str());
}
从其他的package中复制一个服务。 roscp是一个很实用的命令行工具,它实现了将文件从一个package复制到另外一个package的功能。
使用方法: .
$ roscp [package_name] [file_to_copy_path] [copy_path]
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
如何构建 msg 和 srv
http://wiki.ros.org/cn/ROS/Tutorials/CreatingMsgAndSrv
初始化节点
两个常用的用法: ros::init(argc, argv, "my_node_name");
ros::init(argc, argv, "my_node_name", ros::init_options::AnonymousName);
函数分析:
· argc 和 argv,参数列表,ROS使用这些来解析来自命令行的映射参数
· node_name,节点名,在ROS系统里必需是唯一的。如果有同名的节点启动,就会先自动关闭前面的,如果想启动多个相同节点,使用init_options::AnonymousName参数。
· options,这是一个可选的参数,可以指定某些选项,改变roscpp的行为。所以多个选项可以指定。选项在初始化选项部分中描述。
· 其他形式的 ros::init(),不使用argc/argv,而是使用复杂的映射参数,例如: std::map
· 初始化节点简单的读取命令行参数和环境找出这样的节点名称、命名空间和重映射。
· 初始化没有连接到master主机,这需要在初始化后,再利用ros::master::check()或其他函数来检查主机状态。
开始节点
ros::NodeHandlenh;
测试关闭
while(ros::ok())
{
...
}
Callbacks(回调函数)
· roscpp不会为你的程序指定线程模型,这意味着roscpp使用线程在后台做网络管理、调度等,它永远不会暴露线程给应用程序。
· roscpp可以做的,就是允许你的回调函数调用任意数量的线程。
· 最终的结果是,不多做点工作,订阅、服务等回调将永远不会被调用。
· 最常见的解决方案是ros::spin(),但你必须使用下面的一个选项。
· 注意:回调队列/Spinning没有对roscpp内部网络通信的影响,他们只会影响用户的回调发生时。他们影响订阅队列的效果,因为你多快处理您的回调和信息多快能到达决定消息是否会丢弃。