请问,ROS2的单纯延时函数是哪个呢?是rclcpp里面的吧。
凌云 发布的最新帖子
-
XML格式的launch文件启动后ros2 param list读取不到参数
我用XML格式写了一个ROS2的launch文件,如下:
<launch> <node pkg="gmc_sensor" exec="gnss_node" name="gnss_node"> <param name="gnss_ip_addr" value="192.168.8.1"/> <param name="gnss_net_port" value="11211"/> </node> </launch>
在c++的节点文件中,读取两个参数值。
this->declare_parameter("gnss_ip_addr"); bool ret = this->get_parameter("gnss_ip_addr", gnssIpAddr_);
节点文件被launch文件启动成功,正常运行。
同时,我在终端输入:ros2 param list
返回: Exception while calling service of node '/gnss_node': None
查了网上很多教程,也没搞清楚我到底哪里出错了。
请教,我的代码哪里有问题?为什么没有参数可查? -
RE: ROS2中如何同时运行Timer回调函数和订阅消息的回调函数
@小鱼 这点感觉不如ROS1的spinOnce好用,一般处理数据都是需要订阅数据的同时,定时对数据进行处理和结果发布的。
那你说的回调组是看官方教程的Demos这一章中Setting up efficient intra-process commnunication这一节吗?
还是Intermediate一章中的Composing multiple nodes in a single process这一小节? -
ROS2中如何同时运行Timer回调函数和订阅消息的回调函数
想要实现一个节点功能:既有timer这样的例行任务,也有回调函数来订阅数据。
于是我写了:类的构造函数中:
subComm_ = this->create_subscription<std_msgs::msg::UInt8MultiArray>("comm_serial_in", 1, std::bind(&FmtComm::Callback, this, 1));
timer = this->create_wall_timer(30ms, std::bind(&FmtComm::TimerCallbackLoop, this));主函数:
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<FmtComm>());
rclcpp::shutdown();
return 0;
}但是测试发现Timer回调函数正常运行,订阅消息的回调函数没有触发。当注释掉创建Timer后,订阅消息的回调函数正常触发。
我想请教,如何实现我开头说的,在ROS2中既执行例行任务,又可以订阅消息,通过类来实现。感谢。
-
RE: 在类的成员函数中发送服务请求,rclcpp::spin_until_future_complete函数的第一个参数问题?
@Lorry 谢谢指点。
客户端的回调函数怎么写?类似服务器端的写法,像下面这样吗?类的构造函数初始化中:
clientCmd_ = this->create_client<pack_a::srv::Int8>("command", std::bind(&ControlExecutor::Callback_Client, this, _1);回调函数:
void ControlExecutor::Callback_Client(const std::shared_ptr<pack_a::srv::Int8::Response> response)
{
...
} -
在类的成员函数中发送服务请求,rclcpp::spin_until_future_complete函数的第一个参数问题?
在类中定义一个成员函数,在成员函数内部通过某些机制触发,发送一个服务请求,会有如下代码:
auto result = clientCmd_->async_send_request(requestCmd);
if(rclcpp::spin_until_future_complete(node, result) != rclcpp::FutureReturnCode::SUCCESS)
{
RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Failed to call service 'command(query)'");
}
else
{
...
}
在类的成员函数中放入该段代码,会报错,spin_until_future_complete()函数的第一个参数有问题。但不像官方例程,这里没有node的定义,是在成员函数内部的,改为spin_until_future_complete(this, result)也编译失败。请问这种类内成员函数中进行服务请求的情况,这里的spin_until_future_complete()函数第一个参数应该如何填写呢?
谢谢!查了fishros主页的动手学ROS2,并没有这种情况的实例程序。 -
ROS2 服务请求变量的定义
在ROS2官方教程中,服务的相关例程并没有像消息例程一样用类来实现,我想在项目中使用类来实现ROS2的服务功能。在例程中,使用了auto来定义这个请求变量,“auto request = std::make_shared<example_interfaces::srv::AddTwoInts::Request>();”,但是在使用类去实现时,必须要先定义成员函数,再在构造函数里进行赋值。
那么问题来了,这个原来例程里用auto定义的request应该定义为什么数据类型呢?我试过好多都报错了,比如“interface_process::srv::AddTwoInts requestCmd_”。提示信息比如:“no operator "=" matches these operandsC/C++(349)
interface_process.cpp(58, 25): operand types are: example_interfaces::srv::AddTwoInts = std::shared_ptr<example_interfaces::srv::AddTwoInts_Request_<std::allocator<void>>>”
非常感谢。