请问,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>>>”
非常感谢。 -
serial串口通信
请问,在ROS2下的串口通信包是哪个呢?没有找到ros-eloquent-serial包。
搜索到一个ros-eloquent-swri-serial-util,这个能用吗?
有其它方法来使用串口? -
RE: ROS2 参数监控功能是否可以监控自定义结构体参数?
@小鱼 您的意思,把结构体参数转换成string型变量,然后监控这个变量吗。
是否可以转换成字节数组型变量,这样是否更方便一点?就像结构体通信时编解码那样。 -
ROS2 参数监控功能是否可以监控自定义结构体参数?
ROS2的参数监控在官方教程中仅仅是监控了一两个int型和double型的参数。根据实际应用需求,我需要监控的参数接近100个,数量庞大的参数监控如果使用教程中的方式,每个参数定义一个回调函数,感觉不是很妥当。是否有更好的方式?是否可以自定义结构体参数,并对其进行监控,如果这样可行,那在回调函数中,获取这个结构体参数中各成员的值是否可以通过如下方法进行:
auto cb = [this](const rclcpp::Parameter &p) {
RCLCPP_INFO(this->get_logger(),
"cb: received an update to parameter '%s' of type: %s: %.2f",
p.component_a.get_name().c_str(),
p.component_a.get_type_name().c_str(),
p.component_a.as_double());
}
假设结构体参数为:
typedef struct
{
component_a;
component_b;
}
或者是否有更加合理的方式来实现这个功能?谢谢。 -
ROS2 官方例程中ParameterEventHandler不是rclcpp成员的编译出错
本人按照ROS2 官方教程Intermediate中Monitoring for parameter changes(C++)中提供的例程方法,新建了包和源文件,按照例程修改了CMakeLists.txt文件,编译的时候出现如下错误:
error: ‘ParameterEventHandler’ is not a member of ‘rclcpp’
std::shared_ptrrclcpp::ParameterEventHandler param_subscriber_;error: ‘ParameterCallbackHandle’ is not a member of ‘rclcpp’
std::shared_ptrrclcpp::ParameterCallbackHandle cb_handle_;估计是ROS2版本问题?因特殊原因,只能使用Eloquent版本的ROS2,如何解决呢?还是说Eloqent版本的ROS2还不支持动态参数监控的功能?
感谢。 -
RE: colcon命令的编译清除方法是什么?
非常感谢。刚刚我手动删除了install和build文件夹,结果在后续colcon build的时候,出现了一些warning:
[1.065s] WARNING:colcon.colcon_ros.prefix_path.ament:The path '/home/ling/ros2_ws/install/cpp_pubsub' in the environment variable AMENT_PREFIX_PATH doesn't exist
[1.066s] WARNING:colcon.colcon_ros.prefix_path.catkin:The path '/home/ling/ros2_ws/install/gmc' in the environment variable CMAKE_PREFIX_PATH doesn't exist
[1.066s] WARNING:colcon.colcon_ros.prefix_path.catkin:The path '/home/ling/ros2_ws/install/cpp_pubsub' in the environment variable CMAKE_PREFIX_PATH doesn't exist请问这种警告该如何修复?
-
RE: ROS2的get_logger()什么意思,为什么还有重载函数?
@小鱼 谢谢。最后再请教一个实际使用常常遇到的问题:如果我想要ROS2中指定在~/.ros/log/文件夹下的“mylog”的日志文件(自动创建)中记录日志信息,需要哪几行代码呢?