ROS 时间控制

ROS中精准时间控制与Twist发布策略

Stupid && Lazy BUG

今天想偷懒实现一个小功能的时候遇到了一个小bug, 在已知车辆位姿的情况下,手动发布twist话题使得车辆旋转一定的角度,使得车辆的位姿与目标位姿一致,当时我主要想到两种写法:
①:计算角度差,旋转,然后不断更新角度差,直到位姿一致。
②:仅仅计算一次角度差,然后根据旋转速度推测旋转时间。

正常情况下这不是个值得思考的问题,我一般直接用第一种,因为写起来简单顺手,但是今天突然想直接用第二种方式,起初我是这么写的:

void funA()
{
	ros::Rate loop_time(10);
	double headingError = current_pose.orientation - goal_pose.orientation;
	double estimatedTimeCost = fabs(headingError/Twist.angular.z);
	clock_t start_count_timer = clock();
	while((double)(clock() - start_count_timer)/CLOCKS_PER_SEC < estimatedTimeCost)
	{
		if(headingError > 0 && headingError <= M_PI)
		{
			Twist.angular.z = -0.1;
		}else
		{
			Twist.angular.z = 0.1;
		}
		twistPub.publish(Twist);
		loop_rate.sleep();
	}
}

也就是说,假如车辆当前朝向与目标朝向存在180误差,弧度为3.14,若车辆的旋转角速度为0.1弧度每秒,调整位姿需要花费(3.14 / 0.1 = 31.4s ),也就是这里会延时31.4秒,但是实际上上面的实现方式所花费的时间是超出31.4s的!

根据ros::Rate 的性质, while循环被控制在了10hz, 也就是说每一次while循环 clock() - start_count_timer是以0.1s的速度更新,整个while都在以10hz速度更新, 那么意味着在计时过程中时间不是连续增加的,而是每增加0.1s就休眠,虽然时间是正确的,但是程序变慢了。

后面我将ros::Rate 调成50hz,效果依然不好,后面我将 ros的loop_rate.sleep()去掉,发现时间几乎正确了但是这是Twist的发布频率是非常高的,属于对系统性能的无效占用,这无疑又会埋下一个BUG。

ROS::Timer && ROS::Duration

ros Timer的使用,通过ros::Timer 可以实现相关函数的定时/周期性调用,WallTimer 同理。

ros::Timer timer = nh.createTimer(ros::Duration(0.1), callback);
void callback(const ros::TimerEvent& event)
{
}

ros::Duration(0.5).sleep(); 可以实现延时0.5s. 上面用while + loop_rate 对于时间的精度控制不如ros::Timer.

Building wheel for quickjs (setup.py) ... error error: subprocess-exited-with-error × python setup.py bdist_wheel did not run successfully. │ exit code: 1 ╰─> [12 lines of output] running bdist_wheel running build running build_py creating build\lib.win-amd64-cpython-313\quickjs copying quickjs\__init__.py -> build\lib.win-amd64-cpython-313\quickjs running build_ext building '_quickjs' extension creating build\temp.win-amd64-cpython-313\Release creating build\temp.win-amd64-cpython-313\Release\upstream-quickjs "D:\Visual Studio\Visual Studio 2022\Community\VC\Tools\MSVC\14.43.34808\bin\HostX86\x64\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -DCONFIG_VERSION=\"2021-03-27\" -DCONFIG_BIGNUM -IE:\Python3\include -IE:\Python3\Include "-ID:\Visual Studio\Visual Studio 2022\Community\VC\Tools\MSVC\14.43.34808\include" "-ID:\Visual Studio\Visual Studio 2022\Community\VC\Tools\MSVC\14.43.34808\ATLMFC\include" "-ID:\Visual Studio\Visual Studio 2022\Community\VC\Auxiliary\VS\include" "-ID:\Windows Kits\10\include\10.0.22621.0\ucrt" "-ID:\Windows Kits\10\\include\10.0.22621.0\\um" "-ID:\Windows Kits\10\\include\10.0.22621.0\\shared" "-ID:\Windows Kits\10\\include\10.0.22621.0\\winrt" "-ID:\Windows Kits\10\\include\10.0.22621.0\\cppwinrt" /Tcmodule.c /Fobuild\temp.win-amd64-cpython-313\Release\module.obj -Werror=incompatible-pointer-types cl: 命令行 error D8021 :无效的数值参数“/Werror=incompatible-pointer-types” error: command 'D:\\Visual Studio\\Visual Studio 2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\bin\\HostX86\\x64\\cl.exe' failed with exit code 2 [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for quickjs Running setup.py clean for quickjs Failed to build quickjs ERROR: Failed to build installable wheels for some pyproject.toml based projects (quickjs)
03-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值